diff options
author | Richard A Nelson (Rick) <cowboy@debian.org> | 2005-02-04 19:22:00 +0000 |
---|---|---|
committer | Andreas Beckmann <debian@abeckmann.de> | 2012-10-01 19:58:45 +0200 |
commit | e6b88b4e82cb1d7b6750d610b11b5036a5f5ab2a (patch) | |
tree | 59abae220654f385bb12c4e4323b0d8a198e4dee | |
parent | a11b1747c62954b929131fe6fc82db36692618c3 (diff) | |
download | sendmail-e6b88b4e82cb1d7b6750d610b11b5036a5f5ab2a.tar.gz |
Imported Debian patch 8.13.3-6debian/8.13.3-6
217 files changed, 33906 insertions, 10931 deletions
diff --git a/debian/Makefile.in b/debian/Makefile.in new file mode 100644 index 0000000..9a648aa --- /dev/null +++ b/debian/Makefile.in @@ -0,0 +1,881 @@ +# Makefile.in generated by automake 1.9.4 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = . +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in \ + $(top_srcdir)/./build/debian/libmilter-dev.dirs.in \ + $(top_srcdir)/./build/debian/libmilter-dev.postrm.in \ + $(top_srcdir)/./build/debian/libmilter-dev.preinst.in \ + $(top_srcdir)/./build/debian/libmilter0.dirs.in \ + $(top_srcdir)/./build/debian/libmilter0.postrm.in \ + $(top_srcdir)/./build/debian/libmilter0.preinst.in \ + $(top_srcdir)/./build/debian/rmail.dirs.in \ + $(top_srcdir)/./build/debian/rmail.postrm.in \ + $(top_srcdir)/./build/debian/rmail.preinst.in \ + $(top_srcdir)/./build/debian/sendmail-base.dirs.in \ + $(top_srcdir)/./build/debian/sendmail-base.postinst.in \ + $(top_srcdir)/./build/debian/sendmail-base.postrm.in \ + $(top_srcdir)/./build/debian/sendmail-base.preinst.in \ + $(top_srcdir)/./build/debian/sendmail-base.prerm.in \ + $(top_srcdir)/./build/debian/sendmail-bin.conffiles.in \ + $(top_srcdir)/./build/debian/sendmail-bin.dirs.in \ + $(top_srcdir)/./build/debian/sendmail-bin.postinst.in \ + $(top_srcdir)/./build/debian/sendmail-bin.postrm.in \ + $(top_srcdir)/./build/debian/sendmail-bin.preinst.in \ + $(top_srcdir)/./build/debian/sendmail-bin.prerm.in \ + $(top_srcdir)/./build/debian/sendmail-bin.suid.in \ + $(top_srcdir)/./build/debian/sendmail-cf.dirs.in \ + $(top_srcdir)/./build/debian/sendmail-cf.postrm.in \ + $(top_srcdir)/./build/debian/sendmail-cf.preinst.in \ + $(top_srcdir)/./build/debian/sendmail-doc.dirs.in \ + $(top_srcdir)/./build/debian/sendmail-doc.postrm.in \ + $(top_srcdir)/./build/debian/sendmail-doc.preinst.in \ + $(top_srcdir)/./build/debian/sendmail.cron.daily.in \ + $(top_srcdir)/./build/debian/sendmail.dirs.in \ + $(top_srcdir)/./build/debian/sendmail.init.d.in \ + $(top_srcdir)/./build/debian/sensible-mda.dirs.in \ + $(top_srcdir)/./build/debian/sensible-mda.postrm.in \ + $(top_srcdir)/./build/debian/sensible-mda.preinst.in \ + $(top_srcdir)/./local/sendmail.in \ + $(top_srcdir)/build/autoconf.mk.in \ + $(top_srcdir)/build/autoconf.pl.in \ + $(top_srcdir)/build/autoconf.sh.in \ + $(top_srcdir)/build/debian/changelog.in \ + $(top_srcdir)/build/debian/changelog.sh.in \ + $(top_srcdir)/build/debian/control.m4.in \ + $(top_srcdir)/build/site.config.m4.in \ + $(top_srcdir)/build/update_chaos.in \ + $(top_srcdir)/cf/debian/autoconf.m4.in \ + $(top_srcdir)/cf/debian/sendmail.mc.in \ + $(top_srcdir)/cf/debian/submit.mc.in \ + $(top_srcdir)/cf/domain/debian-msp.m4.in \ + $(top_srcdir)/cf/domain/debian-mta.m4.in \ + $(top_srcdir)/cf/hack/debian_auth.m4.in \ + $(top_srcdir)/cf/hack/virthost_by_ip.m4.in \ + $(top_srcdir)/cf/ostype/debian.m4.in $(top_srcdir)/configure \ + $(top_srcdir)/examples/dhcp3/dhclient-exit-hooks.d/sendmail.in \ + $(top_srcdir)/examples/network/if-down.d/sendmail.in \ + $(top_srcdir)/examples/network/if-up.d/sendmail.in \ + $(top_srcdir)/examples/ppp/ip-down.d/sendmail.in \ + $(top_srcdir)/examples/ppp/ip-up.d/sendmail.in \ + $(top_srcdir)/examples/resolvconf/update-libc.d/sendmail.in \ + $(top_srcdir)/examples/sasl/sasl.m4.in \ + $(top_srcdir)/examples/tls/starttls.m4.in \ + $(top_srcdir)/local/bug/sendmail/script.in \ + ./build/config.guess ./build/config.sub ./build/depcomp \ + ./build/install-sh ./build/missing ./build/mkinstalldirs \ + AUTHORS COPYING ChangeLog INSTALL NEWS TODO +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno configure.status.lineno +mkinstalldirs = $(SHELL) $(top_srcdir)/./build/mkinstalldirs +CONFIG_CLEAN_FILES = build/autoconf.mk build/autoconf.pl \ + build/autoconf.sh build/debian/changelog.sh \ + build/debian/changelog build/update_chaos build/site.config.m4 \ + build/debian/control.m4 libmilter0.dirs libmilter0.postrm \ + libmilter0.preinst libmilter-dev.dirs libmilter-dev.postrm \ + libmilter-dev.preinst rmail.dirs rmail.postrm rmail.preinst \ + sendmail.dirs sendmail-base.dirs sendmail-base.postinst \ + sendmail-base.postrm sendmail-base.preinst sendmail-base.prerm \ + sendmail-doc.dirs sendmail-doc.postrm sendmail-doc.preinst \ + sendmail-cf.dirs sendmail-cf.postrm sendmail-cf.preinst \ + sendmail-bin.conffiles sendmail.cron.daily sendmail-bin.dirs \ + sendmail.init.d sendmail-bin.postinst sendmail-bin.postrm \ + sendmail-bin.preinst sendmail-bin.prerm sendmail-bin.suid \ + sensible-mda.dirs sensible-mda.postrm sensible-mda.preinst \ + cf/debian/autoconf.m4 cf/debian/sendmail.mc \ + cf/debian/submit.mc cf/domain/debian-msp.m4 \ + cf/domain/debian-mta.m4 cf/hack/debian_auth.m4 \ + cf/hack/virthost_by_ip.m4 cf/ostype/debian.m4 \ + examples/dhcp3/dhclient-exit-hooks.d/sendmail \ + examples/network/if-down.d/sendmail \ + examples/network/if-up.d/sendmail \ + examples/ppp/ip-down.d/sendmail examples/ppp/ip-up.d/sendmail \ + examples/resolvconf/update-libc.d/sendmail \ + examples/sasl/sasl.m4 examples/tls/starttls.m4 \ + local/bug/sendmail/script +SOURCES = +DIST_SOURCES = +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + { test ! -d $(distdir) \ + || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr $(distdir); }; } +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBIAN = @DEBIAN@ +DEBIAN_DH = @DEBIAN_DH@ +DEB_BUILD_ARCH = @DEB_BUILD_ARCH@ +DEB_BUILD_GNU_CPU = @DEB_BUILD_GNU_CPU@ +DEB_BUILD_GNU_SYSTEM = @DEB_BUILD_GNU_SYSTEM@ +DEB_BUILD_GNU_TYPE = @DEB_BUILD_GNU_TYPE@ +DEB_HOST_ARCH = @DEB_HOST_ARCH@ +DEB_HOST_GNU_CPU = @DEB_HOST_GNU_CPU@ +DEB_HOST_GNU_SYSTEM = @DEB_HOST_GNU_SYSTEM@ +DEB_HOST_GNU_TYPE = @DEB_HOST_GNU_TYPE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SM_CPYRT = @SM_CPYRT@ +SM_DATE = @SM_DATE@ +SM_ENABLE_AUTH_FALSE = @SM_ENABLE_AUTH_FALSE@ +SM_ENABLE_AUTH_TRUE = @SM_ENABLE_AUTH_TRUE@ +SM_ENABLE_LDAP_FALSE = @SM_ENABLE_LDAP_FALSE@ +SM_ENABLE_LDAP_TRUE = @SM_ENABLE_LDAP_TRUE@ +SM_ENABLE_TLS_FALSE = @SM_ENABLE_TLS_FALSE@ +SM_ENABLE_TLS_TRUE = @SM_ENABLE_TLS_TRUE@ +SM_MAXVERS = @SM_MAXVERS@ +SM_MINVERS = @SM_MINVERS@ +SM_VERS = @SM_VERS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_STRIP = @ac_ct_STRIP@ +ac_version = @ac_version@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +am_version = @am_version@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +buildtree = @buildtree@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sm_auth_lib = @sm_auth_lib@ +sm_badepends = @sm_badepends@ +sm_build_arch = @sm_build_arch@ +sm_custom = @sm_custom@ +sm_databases = @sm_databases@ +sm_date = @sm_date@ +sm_depends = @sm_depends@ +sm_dist_name = @sm_dist_name@ +sm_dist_vers = @sm_dist_vers@ +sm_editmap_envdef = @sm_editmap_envdef@ +sm_editmap_libs = @sm_editmap_libs@ +sm_enable_auth = @sm_enable_auth@ +sm_enable_bind = @sm_enable_bind@ +sm_enable_dev = @sm_enable_dev@ +sm_enable_doc = @sm_enable_doc@ +sm_enable_hesiod = @sm_enable_hesiod@ +sm_enable_ipv6 = @sm_enable_ipv6@ +sm_enable_ldap = @sm_enable_ldap@ +sm_enable_maillock = @sm_enable_maillock@ +sm_enable_milter = @sm_enable_milter@ +sm_enable_ndbm = @sm_enable_ndbm@ +sm_enable_newdb = @sm_enable_newdb@ +sm_enable_nis = @sm_enable_nis@ +sm_enable_nisplus = @sm_enable_nisplus@ +sm_enable_regex = @sm_enable_regex@ +sm_enable_sfio = @sm_enable_sfio@ +sm_enable_shm = @sm_enable_shm@ +sm_enable_tcpd = @sm_enable_tcpd@ +sm_enable_tls = @sm_enable_tls@ +sm_envdef = @sm_envdef@ +sm_features = @sm_features@ +sm_ffr = @sm_ffr@ +sm_hesiod_parms = @sm_hesiod_parms@ +sm_host_arch = @sm_host_arch@ +sm_incdirs = @sm_incdirs@ +sm_ldap_lib = @sm_ldap_lib@ +sm_libmilter_envdef = @sm_libmilter_envdef@ +sm_libmilter_libs = @sm_libmilter_libs@ +sm_libs = @sm_libs@ +sm_libsm_envdef = @sm_libsm_envdef@ +sm_libsm_libs = @sm_libsm_libs@ +sm_libsmdb_envdef = @sm_libsmdb_envdef@ +sm_libsmdb_libs = @sm_libsmdb_libs@ +sm_libsmutil_envdef = @sm_libsmutil_envdef@ +sm_libsmutil_libs = @sm_libsmutil_libs@ +sm_m4_ffr = @sm_m4_ffr@ +sm_mail_local_envdef = @sm_mail_local_envdef@ +sm_mail_local_libs = @sm_mail_local_libs@ +sm_mailstats_envdef = @sm_mailstats_envdef@ +sm_mailstats_libs = @sm_mailstats_libs@ +sm_makemap_envdef = @sm_makemap_envdef@ +sm_makemap_libs = @sm_makemap_libs@ +sm_mapdef = @sm_mapdef@ +sm_newdb_lib = @sm_newdb_lib@ +sm_praliases_envdef = @sm_praliases_envdef@ +sm_praliases_libs = @sm_praliases_libs@ +sm_recommends = @sm_recommends@ +sm_revision = @sm_revision@ +sm_rmail_envdef = @sm_rmail_envdef@ +sm_rmail_libs = @sm_rmail_libs@ +sm_sendmail_envdef = @sm_sendmail_envdef@ +sm_sendmail_libs = @sm_sendmail_libs@ +sm_smrsh_envdef = @sm_smrsh_envdef@ +sm_smrsh_libs = @sm_smrsh_libs@ +sm_suggests = @sm_suggests@ +sm_time = @sm_time@ +sm_utc = @sm_utc@ +sm_vacation_envdef = @sm_vacation_envdef@ +sm_vacation_libs = @sm_vacation_libs@ +sm_version = @sm_version@ +sm_version_beta = @sm_version_beta@ +sm_version_major = @sm_version_major@ +sm_version_math = @sm_version_math@ +sm_version_minor = @sm_version_minor@ +sm_version_r = @sm_version_r@ +sm_version_v = @sm_version_v@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ + +# +# AutoMake +# +ACLOCAL_AMFLAGS = -I build +# +# Subdirectories to process +# +SUBDIRS = cf examples local sensible_mda +# +# Kluge to get my own targets include as recursive +# +RECURSIVE_TARGETS = build-arch-recursive build-indep-recursive \ + install-arch-recursive install-indep-recursive +all: all-recursive + +.SUFFIXES: +am--refresh: + @: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \ + cd $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +build/autoconf.mk: $(top_builddir)/config.status $(top_srcdir)/build/autoconf.mk.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +build/autoconf.pl: $(top_builddir)/config.status $(top_srcdir)/build/autoconf.pl.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +build/autoconf.sh: $(top_builddir)/config.status $(top_srcdir)/build/autoconf.sh.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +build/debian/changelog.sh: $(top_builddir)/config.status $(top_srcdir)/build/debian/changelog.sh.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +build/debian/changelog: $(top_builddir)/config.status $(top_srcdir)/build/debian/changelog.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +build/update_chaos: $(top_builddir)/config.status $(top_srcdir)/build/update_chaos.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +build/site.config.m4: $(top_builddir)/config.status $(top_srcdir)/build/site.config.m4.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +build/debian/control.m4: $(top_builddir)/config.status $(top_srcdir)/build/debian/control.m4.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +libmilter0.dirs: $(top_builddir)/config.status $(top_srcdir)/./build/debian/libmilter0.dirs.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +libmilter0.postrm: $(top_builddir)/config.status $(top_srcdir)/./build/debian/libmilter0.postrm.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +libmilter0.preinst: $(top_builddir)/config.status $(top_srcdir)/./build/debian/libmilter0.preinst.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +libmilter-dev.dirs: $(top_builddir)/config.status $(top_srcdir)/./build/debian/libmilter-dev.dirs.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +libmilter-dev.postrm: $(top_builddir)/config.status $(top_srcdir)/./build/debian/libmilter-dev.postrm.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +libmilter-dev.preinst: $(top_builddir)/config.status $(top_srcdir)/./build/debian/libmilter-dev.preinst.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +rmail.dirs: $(top_builddir)/config.status $(top_srcdir)/./build/debian/rmail.dirs.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +rmail.postrm: $(top_builddir)/config.status $(top_srcdir)/./build/debian/rmail.postrm.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +rmail.preinst: $(top_builddir)/config.status $(top_srcdir)/./build/debian/rmail.preinst.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +sendmail.dirs: $(top_builddir)/config.status $(top_srcdir)/./build/debian/sendmail.dirs.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +sendmail-base.dirs: $(top_builddir)/config.status $(top_srcdir)/./build/debian/sendmail-base.dirs.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +sendmail-base.postinst: $(top_builddir)/config.status $(top_srcdir)/./build/debian/sendmail-base.postinst.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +sendmail-base.postrm: $(top_builddir)/config.status $(top_srcdir)/./build/debian/sendmail-base.postrm.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +sendmail-base.preinst: $(top_builddir)/config.status $(top_srcdir)/./build/debian/sendmail-base.preinst.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +sendmail-base.prerm: $(top_builddir)/config.status $(top_srcdir)/./build/debian/sendmail-base.prerm.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +sendmail-doc.dirs: $(top_builddir)/config.status $(top_srcdir)/./build/debian/sendmail-doc.dirs.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +sendmail-doc.postrm: $(top_builddir)/config.status $(top_srcdir)/./build/debian/sendmail-doc.postrm.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +sendmail-doc.preinst: $(top_builddir)/config.status $(top_srcdir)/./build/debian/sendmail-doc.preinst.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +sendmail-cf.dirs: $(top_builddir)/config.status $(top_srcdir)/./build/debian/sendmail-cf.dirs.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +sendmail-cf.postrm: $(top_builddir)/config.status $(top_srcdir)/./build/debian/sendmail-cf.postrm.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +sendmail-cf.preinst: $(top_builddir)/config.status $(top_srcdir)/./build/debian/sendmail-cf.preinst.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +sendmail-bin.conffiles: $(top_builddir)/config.status $(top_srcdir)/./build/debian/sendmail-bin.conffiles.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +sendmail.cron.daily: $(top_builddir)/config.status $(top_srcdir)/./build/debian/sendmail.cron.daily.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +sendmail-bin.dirs: $(top_builddir)/config.status $(top_srcdir)/./build/debian/sendmail-bin.dirs.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +sendmail.init.d: $(top_builddir)/config.status $(top_srcdir)/./build/debian/sendmail.init.d.in $(top_srcdir)/./local/sendmail.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +sendmail-bin.postinst: $(top_builddir)/config.status $(top_srcdir)/./build/debian/sendmail-bin.postinst.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +sendmail-bin.postrm: $(top_builddir)/config.status $(top_srcdir)/./build/debian/sendmail-bin.postrm.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +sendmail-bin.preinst: $(top_builddir)/config.status $(top_srcdir)/./build/debian/sendmail-bin.preinst.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +sendmail-bin.prerm: $(top_builddir)/config.status $(top_srcdir)/./build/debian/sendmail-bin.prerm.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +sendmail-bin.suid: $(top_builddir)/config.status $(top_srcdir)/./build/debian/sendmail-bin.suid.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +sensible-mda.dirs: $(top_builddir)/config.status $(top_srcdir)/./build/debian/sensible-mda.dirs.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +sensible-mda.postrm: $(top_builddir)/config.status $(top_srcdir)/./build/debian/sensible-mda.postrm.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +sensible-mda.preinst: $(top_builddir)/config.status $(top_srcdir)/./build/debian/sensible-mda.preinst.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cf/debian/autoconf.m4: $(top_builddir)/config.status $(top_srcdir)/cf/debian/autoconf.m4.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cf/debian/sendmail.mc: $(top_builddir)/config.status $(top_srcdir)/cf/debian/sendmail.mc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cf/debian/submit.mc: $(top_builddir)/config.status $(top_srcdir)/cf/debian/submit.mc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cf/domain/debian-msp.m4: $(top_builddir)/config.status $(top_srcdir)/cf/domain/debian-msp.m4.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cf/domain/debian-mta.m4: $(top_builddir)/config.status $(top_srcdir)/cf/domain/debian-mta.m4.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cf/hack/debian_auth.m4: $(top_builddir)/config.status $(top_srcdir)/cf/hack/debian_auth.m4.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cf/hack/virthost_by_ip.m4: $(top_builddir)/config.status $(top_srcdir)/cf/hack/virthost_by_ip.m4.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +cf/ostype/debian.m4: $(top_builddir)/config.status $(top_srcdir)/cf/ostype/debian.m4.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +examples/dhcp3/dhclient-exit-hooks.d/sendmail: $(top_builddir)/config.status $(top_srcdir)/examples/dhcp3/dhclient-exit-hooks.d/sendmail.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +examples/network/if-down.d/sendmail: $(top_builddir)/config.status $(top_srcdir)/examples/network/if-down.d/sendmail.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +examples/network/if-up.d/sendmail: $(top_builddir)/config.status $(top_srcdir)/examples/network/if-up.d/sendmail.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +examples/ppp/ip-down.d/sendmail: $(top_builddir)/config.status $(top_srcdir)/examples/ppp/ip-down.d/sendmail.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +examples/ppp/ip-up.d/sendmail: $(top_builddir)/config.status $(top_srcdir)/examples/ppp/ip-up.d/sendmail.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +examples/resolvconf/update-libc.d/sendmail: $(top_builddir)/config.status $(top_srcdir)/examples/resolvconf/update-libc.d/sendmail.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +examples/sasl/sasl.m4: $(top_builddir)/config.status $(top_srcdir)/examples/sasl/sasl.m4.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +examples/tls/starttls.m4: $(top_builddir)/config.status $(top_srcdir)/examples/tls/starttls.m4.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +local/bug/sendmail/script: $(top_builddir)/config.status $(top_srcdir)/local/bug/sendmail/script.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +uninstall-info-am: + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(am__remove_distdir) + mkdir $(distdir) + $(mkdir_p) $(distdir)/./build/debian $(distdir)/./local $(distdir)/build $(distdir)/build/debian $(distdir)/cf/debian $(distdir)/cf/domain $(distdir)/cf/hack $(distdir)/cf/ostype $(distdir)/examples/dhcp3/dhclient-exit-hooks.d $(distdir)/examples/network/if-down.d $(distdir)/examples/network/if-up.d $(distdir)/examples/ppp/ip-down.d $(distdir)/examples/ppp/ip-up.d $(distdir)/examples/resolvconf/update-libc.d $(distdir)/examples/sasl $(distdir)/examples/tls $(distdir)/local $(distdir)/local/bug/sendmail $(distdir)/sensible_mda + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(mkdir_p) "$(distdir)/$$subdir" \ + || exit 1; \ + distdir=`$(am__cd) $(distdir) && pwd`; \ + top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$top_distdir" \ + distdir="$$distdir/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done + -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r $(distdir) +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod a+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && cd $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' +distuninstallcheck: + @cd $(distuninstallcheck_dir) \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \ + check-am clean clean-generic clean-recursive ctags \ + ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-shar \ + dist-tarZ dist-zip distcheck distclean distclean-generic \ + distclean-recursive distclean-tags distcleancheck distdir \ + distuninstallcheck dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + maintainer-clean-recursive mostlyclean mostlyclean-generic \ + mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-info-am + +# +# Debian targets, phase out +# +.PHONY: build-indep build-indep-am +.PHONY: build-arch build-arch-am +.PHONY: install-indep install-indep-am +.PHONY: install-arch install-arch-am +build-indep: build-indep-recursive +build-indep-am: +build-arch: build-arch-recursive +build-arch-am: +install-indep: install-indep-recursive +install-indep-am: +install-arch: install-arch-recursive +install-arch-am: +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/debian/NEWS b/debian/NEWS new file mode 100644 index 0000000..137c6d6 --- /dev/null +++ b/debian/NEWS @@ -0,0 +1,38 @@ +sendmail (8.13.1-14) + + * TLS errors: + From http://lists.debian.org/debian-security/2003/09/msg00209.html + > I cannot get STARTTLS to work with the newest snendmail in unstable. + > It *always* complains that the key file is group readable! + > Now, before you scream RTFM, I did use GroupReadableKeyFile! + + please copy "/usr/share/sendmail/examples/starttls.m4 to /etc/mail/tls and + execute 'sendmailconfig' after you copied the file over. + + It's an updated file you have to use by now. You should have read the + install message by the sendmail update and the changelog too ;p + + You have to do the same with SASLv2 m4 if you use SASLv2 + +sendmail (8.13.1-8) + + * Make initial install prompt free (by using a sane&safe default): + + listen only to 127.0.0.1 + + if /etc/mailname extant, use it as the masquerade value + + no smarthost (would have to prompt) + + Issue msg to run sendmailconfig *later* if desired + closes: #112397 #213022 #227464 + + If the default setup isn't what you'd like, you can run sendmailconfig + at any time to change your preferences... + + * Correct sasl2 instructions - closes: #265976 + Here's what you must do to make sasl usable with smtp/smmsp: + + chown smmta:smmsp /etc/sasldb2 (problematic if used by others) + + dpkg-statoverride --remove /var/run/saslauthd + + dpkg-statoverride --add root sasl 711 /var/run/saslauthd + + Now, anytime a user authenticates with a PLAIN password, SASL will + add the password to /etc/sasldb2 (automigrate) and subsequently, the + user may use more secure mechanisms. + diff --git a/debian/TODO b/debian/TODO index 8f9a89b..acb9c6b 100644 --- a/debian/TODO +++ b/debian/TODO @@ -1,4 +1,7 @@ Important: + * Parse_mc.pm: scan include() and add as dependancies + * Complete RunAsUser setup for MTA + * udpate_mc: update stats file and RunAsUser accordingly Misc: * MSP/MTA split related - -Am -bs failure if not root (can't write to /var/spool/mqueue) @@ -13,11 +16,7 @@ Misc: work because cron may not see the update before scheduling... shipping binary suid may solve this (and removes a small window where calls to sendmail binary fail) - - split sendmail into sendmail/sendmail-common, with - sendmail-common containing /usr/share/sendmail stuff - rules.in: why doesn't a failure in lower make propogate up? - - no need to configure rules, instead have rules depend upon - autoconf.mk ! - update debian/patches/patches.index - create an LDAP migration script - cleanup/extend sendmailconfig (debconf) diff --git a/debian/build/autoconf.mk.in b/debian/build/autoconf.mk.in index c531e82..804d2b6 100644 --- a/debian/build/autoconf.mk.in +++ b/debian/build/autoconf.mk.in @@ -90,9 +90,9 @@ ifeq (,${CFLAGS}) endif # No longer needed, left as an example: # Force no optimization for arm - buggy compiler... -ifeq ("arm", "${DEB_HOST_ARCH}") - override CFLAGS := -O0 -Wall - endif +#ifeq ("arm", "${DEB_HOST_ARCH}") +# override CFLAGS := -O0 -Wall +# endif ifneq (,$(findstring noopt,${DEB_BUILD_OPTIONS})) override CFLAGS += -O0 endif diff --git a/debian/build/changelog.sh.in b/debian/build/changelog.sh.in deleted file mode 100644 index b05cc16..0000000 --- a/debian/build/changelog.sh.in +++ /dev/null @@ -1,59 +0,0 @@ -#!/bin/sh -e -#----------------------------------------------------------------------------- -# $Sendmail: changelog.sh,v @sm_version@ @sm_date@ @sm_time@ cowboy Exp $ -# -# Copyright (c) 1998-@SM_CPYRT@ Richard Nelson. All Rights Reserved. -# -# @configure_input@ -# -# Debian script to generate changelogs for sendmail @sm_version@@sm_revision@ -# -# Note: this file supports @SM_MINVERS@ - @SM_MAXVERS@ -# -#----------------------------------------------------------------------------- -set -e; -# -# Initialization -PACKAGE='sendmail'; - -# Create a combined changelog *IFF* we have the pieces/parts... -if [ -d private/changelogs ]; then - echo "Building @PACKAGE_NAME@ @sm_version@@sm_revision@(@sm_version_math@) changelog."; - # - # Remove old combined changelog - rm -f changelog; - # - # Beta changelogs - if [ -f private/changelogs/@sm_version@ ]; then - cat private/changelogs/@sm_version@ \ - >> changelog; - # - # 8.12 changelogs - elif [ @sm_version_math@ -ge 527360 ]; then - cat private/changelogs/8.12 >> changelog; - # - # 8.11 changelogs - elif [ @sm_version_math@ -ge 527104 ]; then - cat private/changelogs/8.11 >> changelog; - # - # 8.10 changelogs - elif [ @sm_version_math@ -ge 526848 ]; then - cat private/changelogs/8.10 >> changelog; - # - # 8.9 changelogs - elif [ @sm_version_math@ -ge 526592 ]; then - cat private/changelogs/8.9 >> changelog; - # - # 8.8 changelogs - elif [ @sm_version_math@ -ge 526336 ]; then - cat private/changelogs/8.8 >> changelog; - # - # 8.7 changelogs - elif [ @sm_version_math@ -ge 526080 ]; then - cat private/changelogs/8.7 >> changelog; - fi; - # - # Variable definitions - cat private/changelogs/vars >> changelog; - fi; - diff --git a/debian/build/config.guess b/debian/build/config.guess new file mode 100644 index 0000000..8229471 --- /dev/null +++ b/debian/build/config.guess @@ -0,0 +1,1453 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + +timestamp='2004-11-12' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Per Bothner <per@bothner.com>. +# Please send patches to <config-patches@gnu.org>. Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to <config-patches@gnu.org>." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit 0 ;; + amd64:OpenBSD:*:*) + echo x86_64-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + cats:OpenBSD:*:*) + echo arm-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + luna88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + macppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvmeppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mips64-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sun3:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit 0 ;; + macppc:MirBSD:*:*) + echo powerppc-unknown-mirbsd${UNAME_RELEASE} + exit 0 ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit 0 ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit 0;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit 0 ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit 0 ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit 0 ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit 0;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit 0 ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit 0 ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7 && exit 0 ;; + esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit 0 ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit 0 ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit 0 ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit 0 ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include <stdio.h> /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c \ + && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && exit 0 + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit 0 ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit 0 ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include <sys/systemcfg.h> + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 + echo rs6000-ibm-aix3.2.5 + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit 0 ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include <stdlib.h> + #include <unistd.h> + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + # avoid double evaluation of $set_cc_for_build + test -n "$CC_FOR_BUILD" || eval $set_cc_for_build + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include <unistd.h> + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit 0 ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit 0 ;; + x86:Interix*:[34]*) + echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' + exit 0 ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit 0 ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit 0 ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit 0 ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit 0 ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit 0 ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit 0 ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit 0 ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 + ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit 0 ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit 0 ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit 0 ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit 0 ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit 0 ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit 0 ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit 0 ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit 0 ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit 0 ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit 0 ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include <features.h> + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #ifdef __INTEL_COMPILER + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 + test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit 0 ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit 0 ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit 0 ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit 0 ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit 0 ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit 0 ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit 0 ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit 0 ;; + i*86:*:5:[78]*) + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit 0 ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name` + echo ${UNAME_MACHINE}-pc-isc$UNAME_REL + elif /bin/uname -X 2>/dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit 0 ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit 0 ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4.3${OS_REL} && exit 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit 0 ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says <Richard.M.Bartel@ccMail.Census.GOV> + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes <hewes@openmarket.com>. + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit 0 ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit 0 ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit 0 ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit 0 ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit 0 ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit 0 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + *86) UNAME_PROCESSOR=i686 ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit 0 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit 0 ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit 0 ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit 0 ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit 0 ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit 0 ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit 0 ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit 0 ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit 0 ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit 0 ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit 0 ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit 0 ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit 0 ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms && exit 0 ;; + I*) echo ia64-dec-vms && exit 0 ;; + V*) echo vax-dec-vms && exit 0 ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit 0 ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c <<EOF +#ifdef _SEQUENT_ +# include <sys/types.h> +# include <sys/utsname.h> +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include <sys/param.h> + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include <sys/param.h> +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +cat >&2 <<EOF +$0: unable to guess system type + +This script, last modified $timestamp, has failed to recognize +the operating system you are using. It is advised that you +download the most up to date version of the config scripts from + + ftp://ftp.gnu.org/pub/gnu/config/ + +If the version you run ($0) is already up to date, please +send the following data and any information you think might be +pertinent to <config-patches@gnu.org> in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/debian/build/config.sub b/debian/build/config.sub new file mode 100644 index 0000000..0f84ac2 --- /dev/null +++ b/debian/build/config.sub @@ -0,0 +1,1566 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + +timestamp='2004-11-30' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Please send patches to <config-patches@gnu.org>. Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to <config-patches@gnu.org>." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit 0;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ + kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | m32r | m32rle | m68000 | m68k | m88k | mcore \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64vr | mips64vrel \ + | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | msp430 \ + | ns16k | ns32k \ + | openrisc | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv8 | sparcv9 | sparcv9b \ + | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* \ + | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | mcore-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | msp430-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa-* \ + | ymp-* \ + | z8k-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16c) + basic_machine=cr16c-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + or32 | or32-*) + basic_machine=or32-unknown + os=-coff + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/debian/build/debian/changelog.sh.in b/debian/build/debian/changelog.sh.in new file mode 100644 index 0000000..08517e8 --- /dev/null +++ b/debian/build/debian/changelog.sh.in @@ -0,0 +1,70 @@ +#!/bin/sh -e +#----------------------------------------------------------------------------- +# $Sendmail: changelog.sh,v @sm_version@ @sm_date@ @sm_time@ cowboy Exp $ +# +# Copyright (c) 1998-@SM_CPYRT@ Richard Nelson. All Rights Reserved. +# +# @configure_input@ +# +# Debian script to generate changelogs for sendmail @sm_version@@sm_revision@ +# +# Note: this file supports @SM_MINVERS@ - @SM_MAXVERS@ +# +#----------------------------------------------------------------------------- +set -e; +# +# Initialization +PACKAGE='sendmail'; + +# +# Remove old combined changelog +rm -f build/debian/changelog; + +echo "Building @PACKAGE_NAME@ @sm_custom@@sm_version@@sm_revision@(@sm_version_math@) changelog."; + +# +# Start with Custom changelog (if any) +if [ -n "@sm_custom@" ]; then + if [ -f @sm_custom@changelog ]; then + cat @sm_custom@changelog \ + >> build/debian/changelog; + fi; + fi; + +# +# Create a combined changelog *IFF* we have the pieces/parts... +if [ ! -d private/changelogs ]; then + cat changelog >>build/debian/changelog; +else + # + # v.r.m changelogs + if [ -f private/changelogs/@sm_version@ ]; then + cat private/changelogs/@sm_version@ \ + >> build/debian/changelog; + # + # v.r changelogs + elif [ -f private/changelogs/@sm_version_major@ ]; then + cat private/changelogs/@sm_version_major@ >> build/debian/changelog; + + # + # v changelogs + elif [ -f private/changelogs/@sm_version_v@ ]; then + cat private/changelogs/@sm_version_v@ >> build/debian/changelog; + fi; + # + # Variable definitions + cat private/changelogs/vars >> build/debian/changelog; + fi; + +# +# Update 1st line to add --with-custom (defaults to null) +if [ -z "@sm_custom@" ]; then + mv build/debian/changelog build/debian/changelog.in; +else + sed -e \ + '1s/sendmail (@sm_version_v@/sendmail (@sm_custom@@sm_version_v@/' \ + build/debian/changelog \ + > build/debian/changelog.in; + rm build/debian/changelog; + fi; + diff --git a/debian/build/debian/control.m4.in b/debian/build/debian/control.m4.in new file mode 100644 index 0000000..47e0fca --- /dev/null +++ b/debian/build/debian/control.m4.in @@ -0,0 +1,248 @@ +dnl #-------------------------------------------------------------------------- +dnl # $Sendmail: control.m4,v @sm_version@ @sm_date@ @sm_time@ cowboy Exp $ +dnl # +dnl # Copyright (c) 1998-@SM_CPYRT@ Richard Nelson. All Rights Reserved. +dnl # +dnl # @configure_input@ +dnl # +dnl # Debian control.m4 for sendmail @sm_version@@sm_revision@(@sm_version_math@) +dnl # +dnl # Note: the .in file supports @SM_MINVERS@ - @SM_MAXVERS@, but the generated +dnl # file is customized to the version noted above. +dnl # +dnl # Note: Exercise care in the feeding of this file, especially wrt quoting! +dnl # +dnl #-------------------------------------------------------------------------- +changequote([[, ]])dnl +dnl # +dnl # The source package description +dnl # Always built +dnl # +[[Source: sendmail +Priority: extra +Section: mail +Maintainer: Richard A Nelson (Rick) <cowboy@debian.org> +Standards-Version: 3.6.10.0 +Build-Depends-Indep: groff-base, bsdmainutils +Build-Depends: make (>> 3.79.1-14), m4, patch, debhelper (>= 4.1.68)@sm_badepends@ +Build-Conflicts: libbind-dev, bind-dev]]dnl +dnl # +dnl # The arch=any package: sendmail-bin +dnl # Always built +dnl # +[[ + +Package: sendmail-bin +Architecture: any +Section: mail +Replaces: mail-transport-agent +Provides: mail-transport-agent +Conflicts: mail-transport-agent, sendmail (<< 8.13.1-7) +Depends: sendmail-base, sendmail-cf, ${shlibs:Depends}, ${perl:Depends} @sm_depends@ +Recommends: @sm_recommends@ +Suggests: sendmail-doc, @sm_suggests@ +Description: powerful, efficient, and scalable Mail Transport Agent + Sendmail is an alternative Mail Transport Agent (MTA) for Debian. + It is suitable for handling sophisticated mail configurations, + although this means that its configuration can also be complex. + . + Fortunately, simple thing can be done easily, and complex things + are possible, even if not easily understood ;) Sendmail is the *ONLY* + MTA with a Turing complete language to control *ALL* aspects of delivery! + . + Sendmail provides Security and SPAM/UCE/UBE protection via several means. + . + Sendmail includes *no* Mail User Agents (MUA), you'll have to + pick from the plethora of available MUAs (mutt, vm, etc.) + . + This package supports @sm_databases@ maps, + and has enabled @sm_features@. + . + Homepage: http://www.sendmail.org]]dnl +dnl # +dnl # The arch=any package: rmail +dnl # Always built +dnl # +[[ + +Package: rmail +Architecture: any +Section: mail +Conflicts: sendmail (<< 8.13.1-7), postfix, exim, exim-tls, exim4-daemon-custom, exim4-daemon-heavy, exim4-daemon-light, courier-mta, smail, zmailer +Depends: sendmail-bin | mail-transport-agent, ${shlibs:Depends} +Description: MTA->UUCP remote mail handler + Rmail handles mail received via uucp and passes it to the local + sendmail (or workalike). + . + This version comes from the sendmail source package and the only + change is the call to sendmail (from -obq to -obi). + . + Homepage: http://www.sendmail.org]]dnl +dnl # +dnl # The arch=any package: sensible-mda (debian private) +dnl # Always built +dnl # +[[ + +Package: sensible-mda +Architecture: any +Section: mail +Conflicts: sendmail (<< 8.13.1-7) +Depends: sendmail-bin | mail-transport-agent, procmail | maildrop | deliver, ${shlibs:Depends} +Description: Mail Delivery Agent wrapper + Sensible-mda is a Debian addition in the sendmail package and has been + split out in hopes that it might be useful for other MTA packages. + . + Sensible-mda is called by the MTA, and will in turn call whichever of + the following MDAs that it finds (in this order): + procmail, maildrop, deliver, mail.local]]dnl +dnl # +dnl # The arch=any package: libmilter0 +dnl # Only built if MILTER is enabled +dnl # +ifelse([[@sm_enable_milter@]], [[yes]], [[[[ + +Package: libmilter0 +Architecture: any +Section: libs +Depends: ${shlibs:Depends} +Description: Sendmail Mail Filter API (Milter) + The Sendmail Mail Filter API (Milter) is designed to allow third-party + programs access to mail messages as they are being processed in order + to filter meta-information(headers) and content. + . + The Debian Sendmail package is built to support libmilter. + . + This is just the libmilter.so + . + Homepage: http://www.sendmail.org]]dnl +dnl # +dnl # The arch=any package: libmilter-dev +dnl # Only built if MILTER is enabled *AND* the -dev packages are wanted +dnl # +ifelse([[@sm_enable_dev@]], [[yes]], [[[[ + +Package: libmilter-dev +Architecture: any +Section: libdevel +Depends: libmilter0 (= ${Source-Version}) +Suggests: sendmail-doc +Description: Sendmail Mail Filter API (Milter) + The Sendmail Mail Filter API (Milter) is designed to allow third-party + programs access to mail messages as they are being processed in order + to filter meta-information (headers) and content. + . + The Debian Sendmail package is built to support libmilter. + . + This is the libmilter static library and include files for development. + . + The documentation on building a Milter is in the sendmail-doc package. + . + Homepage: http://www.sendmail.org]]]])]])dnl +dnl # +dnl # The arch=all package: sendmail-doc +dnl # Only built if the -doc packages are wanted +dnl # +ifelse([[@sm_enable_doc@]], [[yes]], [[[[ + +Package: sendmail-doc +Architecture: all +Section: doc +Description: powerful, efficient, and scalable Mail Transport Agent + Sendmail is an alternative Mail Transport Agent (MTA) for + Debian. It is suitable for handling sophisticated mail + configurations, although this means that its configuration + can also be complex. + . + Don't try anything fancy in sendmail without using this for guidance. + . + Because of the complexity, you may find yourself wanting to peruse + the documentation files included herein. The main files are: + cf.README.gz -- A reference for all things in sendmail.{mc,cf} + op.{ps,txt}.gz -- The care and feeding of Sendmail. + faq.txt.gz -- Sendmail FAQ, current as of the package date. + . + Other files include the references for smrsh and libmilter. + . + Homepage: http://www.sendmail.org]]]])dnl +dnl # +dnl # The arch=all package: sendmail +dnl # Always built +dnl # +[[ + +Package: sendmail +Architecture: all +Section: mail +Replaces: sendmail-tls +Depends: sendmail-base (= ${Source-Version}), sendmail-bin (= ${Source-Version}), sendmail-cf (= ${Source-Version}), sensible-mda (= ${Source-Version}), rmail (= ${Source-Version}) +Suggests: sendmail-doc +Description: powerful, efficient, and scalable Mail Transport Agent + Sendmail is an alternative Mail Transport Agent (MTA) for Debian. + It is suitable for handling sophisticated mail configurations, + although this means that its configuration can also be complex. + . + Fortunately, simple thing can be done easily, and complex things + are possible, even if not easily understood ;) Sendmail is the *ONLY* + MTA with a Turing complete language to control *ALL* aspects of delivery! + . + Sendmail provides Security and SPAM/UCE/UBE protection via several means. + . + Sendmail includes *no* Mail User Agents (MUA), you'll have to + pick from the plethora of available MUAs (mutt, vm, etc.) + . + This package supports @sm_databases@ maps, + and has enabled @sm_features@. + . + This package is to make installation/upgrading easier (Do NOT delete it) + . + Homepage: http://www.sendmail.org]]dnl +dnl # +dnl # The arch=all package: sendmail-base +dnl # Always built +dnl # +[[ + +Package: sendmail-base +Architecture: all +Section: mail +Depends: m4, make, adduser, ${perl:Depends} +Recommends: resolvconf +Suggests: sendmail-doc, ca-certificates, logcheck, logrotate +Conflicts: sendmail (<= 8.13.1-7) +Description: powerful, efficient, and scalable Mail Transport Agent + Sendmail is an alternative Mail Transport Agent (MTA) for + Debian. It is suitable for handling sophisticated mail + configurations, although this means that its configuration + can also be complex. + . + This package contains the base, architecture independent, portions + of the sendmail packages. + . + Homepage: http://www.sendmail.org]]dnl +dnl # +dnl # The arch=all package: sendmail-cf +dnl # Always built +dnl # +[[ + +Package: sendmail-cf +Architecture: all +Section: mail +Suggests: sendmail-doc, m4 +Conflicts: sendmail (<< 8.13.1-7) +Description: powerful, efficient, and scalable Mail Transport Agent + Sendmail is an alternative Mail Transport Agent (MTA) for + Debian. It is suitable for handling sophisticated mail + configurations, although this means that its configuration + can also be complex. + . + This package contains the .m4 (configuration files) for the + sendmail packages. + . + Homepage: http://www.sendmail.org]]dnl +dnl # +dnl # Provide the requisite trailing newline +dnl # + + diff --git a/debian/build/control.m4.in b/debian/build/debian/control.m4.in.save index 054494a..0fe5795 100644 --- a/debian/build/control.m4.in +++ b/debian/build/debian/control.m4.in.save @@ -22,9 +22,10 @@ dnl # Priority: extra Section: mail Maintainer: Richard A Nelson (Rick) <cowboy@debian.org> -Standards-Version: 3.5.7.0 +Standards-Version: 3.5.9.0 Build-Depends-Indep: groff, bsdmainutils -Build-Depends: m4, patch, debhelper (>= 1.1.17), @sm_badepends@]] +Build-Depends: m4, patch, debhelper (>= 1.1.17)@sm_badepends@]] +Build-Conflicts: libbind-dev, bind-dev dnl # dnl # The first arch=any package description dnl # Always built @@ -36,9 +37,9 @@ Section: mail Replaces: mail-transport-agent, sendmail-tls Provides: mail-transport-agent Conflicts: mail-transport-agent -Depends: adduser, m4, ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends}, @sm_depends@ +Depends: adduser, m4, ${shlibs:Depends}, ${perl:Depends}@sm_depends@ Recommends: @sm_recommends@ -Suggests: sendmail-doc (>= ${Source-Version}), mail-reader, procmail | mailagent | maildrop | deliver, make, logcheck, @sm_suggests@ +Suggests: sendmail-doc (>= ${Source-Version}), mail-reader, procmail | mailagent | maildrop | deliver, make, logcheck @sm_suggests@ Description: A powerful, efficient, and scalable Mail Transport Agent Sendmail is an alternative Mail Transport Agent (MTA) for Debian. It is suitable for handling sophisticated mail configurations, @@ -89,7 +90,7 @@ ifelse([[@sm_enable_milter@]], [[yes]],[[ Sendmail will also deliver to anythings else (cyrus, etc) if asked to. . Sendmail includes *no* Mail User Agents (MUA), you'll have to - pick from the plethora of available MUAs (pine, mutt, vm, etc.) + pick from the plethora of available MUAs (mutt, vm, etc.) . This package supports @sm_databases@ maps, and has enabled @sm_features@.]]dnl @@ -102,7 +103,7 @@ ifelse([[@sm_enable_milter@]], [[yes]], [[ Package: libmilter-dev Architecture: any -Section: devel +Section: libdevel Suggests: sendmail-doc (>= ${Source-Version}) Description: Sendmail Mail Filter API (Milter) The Sendmail Mail Filter API (Milter) is designed to allow third-party diff --git a/debian/build/debian/libmilter-dev.dirs.in b/debian/build/debian/libmilter-dev.dirs.in new file mode 100644 index 0000000..a0b512b --- /dev/null +++ b/debian/build/debian/libmilter-dev.dirs.in @@ -0,0 +1,7 @@ +./DEBIAN +.@includedir@/libmilter +.@libdir@ +.@libdir@/libmilter +.@docdir@/libmilter-dev +.@datadir@/bug +.@datadir@/lintian/overrides diff --git a/debian/build/debian/libmilter-dev.lintian-overrides b/debian/build/debian/libmilter-dev.lintian-overrides new file mode 100644 index 0000000..4ad19e8 --- /dev/null +++ b/debian/build/debian/libmilter-dev.lintian-overrides @@ -0,0 +1 @@ +libmilter-dev: description-synopsis-starts-with-a-capital-letter diff --git a/debian/libmilter-dev.postrm.in b/debian/build/debian/libmilter-dev.postrm.in index eafb8f2..121fa31 100644 --- a/debian/libmilter-dev.postrm.in +++ b/debian/build/debian/libmilter-dev.postrm.in @@ -25,12 +25,12 @@ # set -e; -PACKAGE=`echo "$(basename $0)" | sed -e 's/\.postrm$//'`; +PACKAGE=libmilter-dev; case "$1" in remove) - # /usr/share/doc/libmilter-dev is a symlink to /usr/share/doc/sendmail - rm -f @docdir@/libmilter-dev 2>/dev/null || true; + # /usr/share/doc/$PACKAGE is a symlink to /usr/share/doc/sendmail + rm -f @docdir@/$PACKAGE 2>/dev/null || true; rmdir @docdir@/sendmail 2>/dev/null || true; ;; diff --git a/debian/libmilter-dev.preinst.in b/debian/build/debian/libmilter-dev.preinst.in index eda0c38..0ba2a7f 100644 --- a/debian/libmilter-dev.preinst.in +++ b/debian/build/debian/libmilter-dev.preinst.in @@ -15,31 +15,31 @@ # set -e; -PACKAGE=`echo "$(basename $0)" | sed -e 's/\.preinst$//'`; +PACKAGE=libmilter-dev; case "$1" in install) # DPKG doesn't overwrite directories with symlinks... - if [ -d @docdir@/libmilter-dev ]; then - rm -rf @docdir@/libmilter-dev; + if [ -d @docdir@/$PACKAGE ]; then + rm -rf @docdir@/$PACKAGE; fi; if [ ! -d @docdir@/sendmail ]; then mkdir -p @docdir@/sendmail; chmod a+rx @docdir@/sendmail; fi; - ln -sf sendmail @docdir@/libmilter-dev; + ln -sf sendmail @docdir@/$PACKAGE; ;; upgrade) # DPKG doesn't overwrite directories with symlinks... - if [ -d @docdir@/libmilter-dev ]; then - rm -rf @docdir@/libmilter-dev; + if [ -d @docdir@/$PACKAGE ]; then + rm -rf @docdir@/$PACKAGE; fi; if [ ! -d @docdir@/sendmail ]; then mkdir -p @docdir@/sendmail; chmod a+rx @docdir@/sendmail; fi; - ln -sf sendmail @docdir@/libmilter-dev; + ln -sf sendmail @docdir@/$PACKAGE; ;; abort-upgrade) diff --git a/debian/build/debian/libmilter0.dirs.in b/debian/build/debian/libmilter0.dirs.in new file mode 100644 index 0000000..16a222c --- /dev/null +++ b/debian/build/debian/libmilter0.dirs.in @@ -0,0 +1,5 @@ +./DEBIAN +.@libdir@/libmilter +.@docdir@/libmilter0 +.@datadir@/bug +.@datadir@/lintian/overrides diff --git a/debian/build/debian/libmilter0.lintian-overrides b/debian/build/debian/libmilter0.lintian-overrides new file mode 100644 index 0000000..f4df27b --- /dev/null +++ b/debian/build/debian/libmilter0.lintian-overrides @@ -0,0 +1,4 @@ +libmilter0: description-synopsis-starts-with-a-capital-letter +libmilter0: postinst-has-useless-call-to-ldconfig +libmilter0: postrm-has-useless-call-to-ldconfig +libmilter0: non-dev-pkg-with-shlib-symlink diff --git a/debian/build/debian/libmilter0.postrm.in b/debian/build/debian/libmilter0.postrm.in new file mode 100644 index 0000000..c70730c --- /dev/null +++ b/debian/build/debian/libmilter0.postrm.in @@ -0,0 +1,53 @@ +#!/bin/sh -e +# +# Debian post removal script +# +# Install of already installed package: +# 1) Upgrade of package: +# new-preinst upgrade old-version +# *) new-postrm abort-upgrade old-version +# 2) package had some configuration files from a previous version installed +# new-preinst install old-version +# *) new-postrm abort-install old-version +# 3) Otherwise (i.e., the package was completely purged) +# new-preinst install +# *) new-postrm abort-install +# +# Removal of a package: +# 1) prerm remove +# 2) The package's files are removed (except conffiles). +# 3) postrm remove +# 4) All the maintainer scripts except the postrm are removed. +# 5) The conffiles and any backup files +# (~-files, #*# files, %-files, .dpkg-{old,new,tmp}, etc.) are removed. +# 6) postrm purge +# 7) The package's file list is removed +# +set -e; + +PACKAGE=libmilter0; + +case "$1" in + remove) + # /usr/share/doc/$PACKAGE is a symlink to /usr/share/doc/sendmail + rm -f @docdir@/$PACKAGE 2>/dev/null || true; + rmdir @docdir@/sendmail 2>/dev/null || true; + ;; + + purge) + ;; + + upgrade) + ;; + + failed-upgrade|abort-install|abort-upgrade|disappear) + ;; + + *) + echo "$PACKAGE postrm called with unknown argument \`$1'" >&2; + exit 1; + ;; + esac; + +#DEBHELPER# +exit 0; diff --git a/debian/build/debian/libmilter0.preinst.in b/debian/build/debian/libmilter0.preinst.in new file mode 100644 index 0000000..0b2b6db --- /dev/null +++ b/debian/build/debian/libmilter0.preinst.in @@ -0,0 +1,55 @@ +#!/bin/sh -e +# +# Debian pre install script +# +# Install of already installed package: +# 1) Upgrade of package: +# new-preinst upgrade old-version +# *) new-postrm abort-upgrade old-version +# 2) package had some configuration files from a previous version installed +# new-preinst install old-version +# *) new-postrm abort-install old-version +# 3) Otherwise (i.e., the package was completely purged) +# new-preinst install +# *) new-postrm abort-install +# +set -e; + +PACKAGE=libmilter0; + +case "$1" in + install) + # DPKG doesn't overwrite directories with symlinks... + if [ -d @docdir@/$PACKAGE ]; then + rm -rf @docdir@/$PACKAGE; + fi; + if [ ! -d @docdir@/sendmail ]; then + mkdir -p @docdir@/sendmail; + chmod a+rx @docdir@/sendmail; + fi; + ln -sf sendmail @docdir@/$PACKAGE; + ;; + + upgrade) + # DPKG doesn't overwrite directories with symlinks... + if [ -d @docdir@/$PACKAGE ]; then + rm -rf @docdir@/$PACKAGE; + fi; + if [ ! -d @docdir@/sendmail ]; then + mkdir -p @docdir@/sendmail; + chmod a+rx @docdir@/sendmail; + fi; + ln -sf sendmail @docdir@/$PACKAGE; + ;; + + abort-upgrade) + ;; + + *) + echo "$PACKAGE preinst called with unknown argument \`$1'" >&2; + exit 1; + ;; + esac; + +#DEBHELPER# +exit 0; diff --git a/debian/build/debian/rmail.dirs.in b/debian/build/debian/rmail.dirs.in new file mode 100644 index 0000000..d6661b4 --- /dev/null +++ b/debian/build/debian/rmail.dirs.in @@ -0,0 +1,6 @@ +./DEBIAN +.@sbindir@ +.@mandir@ +.@mandir@/man8 +.@datadir@/bug +.@datadir@/lintian/overrides diff --git a/debian/build/debian/rmail.lintian-overrides b/debian/build/debian/rmail.lintian-overrides new file mode 100644 index 0000000..c69602a --- /dev/null +++ b/debian/build/debian/rmail.lintian-overrides @@ -0,0 +1 @@ +rmail: description-synopsis-starts-with-a-capital-letter diff --git a/debian/build/debian/rmail.postrm.in b/debian/build/debian/rmail.postrm.in new file mode 100644 index 0000000..3f19cd0 --- /dev/null +++ b/debian/build/debian/rmail.postrm.in @@ -0,0 +1,53 @@ +#!/bin/sh -e +# +# Debian post removal script +# +# Install of already installed package: +# 1) Upgrade of package: +# new-preinst upgrade old-version +# *) new-postrm abort-upgrade old-version +# 2) package had some configuration files from a previous version installed +# new-preinst install old-version +# *) new-postrm abort-install old-version +# 3) Otherwise (i.e., the package was completely purged) +# new-preinst install +# *) new-postrm abort-install +# +# Removal of a package: +# 1) prerm remove +# 2) The package's files are removed (except conffiles). +# 3) postrm remove +# 4) All the maintainer scripts except the postrm are removed. +# 5) The conffiles and any backup files +# (~-files, #*# files, %-files, .dpkg-{old,new,tmp}, etc.) are removed. +# 6) postrm purge +# 7) The package's file list is removed +# +set -e; + +PACKAGE=rmail; + +case "$1" in + remove) + # /usr/share/doc/$PACKAGE is a symlink to /usr/share/doc/sendmail + rm -f @docdir@/$PACKAGE 2>/dev/null || true; + rmdir @docdir@/sendmail 2>/dev/null || true; + ;; + + purge) + ;; + + upgrade) + ;; + + failed-upgrade|abort-install|abort-upgrade|disappear) + ;; + + *) + echo "$PACKAGE postrm called with unknown argument \`$1'" >&2; + exit 1; + ;; + esac; + +#DEBHELPER# +exit 0; diff --git a/debian/build/debian/rmail.preinst.in b/debian/build/debian/rmail.preinst.in new file mode 100644 index 0000000..017889d --- /dev/null +++ b/debian/build/debian/rmail.preinst.in @@ -0,0 +1,55 @@ +#!/bin/sh -e +# +# Debian pre install script +# +# Install of already installed package: +# 1) Upgrade of package: +# new-preinst upgrade old-version +# *) new-postrm abort-upgrade old-version +# 2) package had some configuration files from a previous version installed +# new-preinst install old-version +# *) new-postrm abort-install old-version +# 3) Otherwise (i.e., the package was completely purged) +# new-preinst install +# *) new-postrm abort-install +# +set -e; + +PACKAGE=rmail; + +case "$1" in + install) + # DPKG doesn't overwrite directories with symlinks... + if [ -d @docdir@/$PACKAGE ]; then + rm -rf @docdir@/$PACKAGE; + fi; + if [ ! -d @docdir@/sendmail ]; then + mkdir -p @docdir@/sendmail; + chmod a+rx @docdir@/sendmail; + fi; + ln -sf sendmail @docdir@/$PACKAGE; + ;; + + upgrade) + # DPKG doesn't overwrite directories with symlinks... + if [ -d @docdir@/$PACKAGE ]; then + rm -rf @docdir@/$PACKAGE; + fi; + if [ ! -d @docdir@/sendmail ]; then + mkdir -p @docdir@/sendmail; + chmod a+rx @docdir@/sendmail; + fi; + ln -sf sendmail @docdir@/$PACKAGE; + ;; + + abort-upgrade) + ;; + + *) + echo "$PACKAGE preinst called with unknown argument \`$1'" >&2; + exit 1; + ;; + esac; + +#DEBHELPER# +exit 0; diff --git a/debian/build/debian/sendmail-base.dirs.in b/debian/build/debian/sendmail-base.dirs.in new file mode 100644 index 0000000..83ad2aa --- /dev/null +++ b/debian/build/debian/sendmail-base.dirs.in @@ -0,0 +1,58 @@ +./DEBIAN +.@sysconfdir@/cron.d +.@sysconfdir@/cron.daily +.@sysconfdir@/default +.@sysconfdir@/dhcp3 +.@sysconfdir@/dhcp3/dhclient-exit-hooks.d +.@sysconfdir@/logcheck +.@sysconfdir@/logcheck/ignore.d.paranoid +.@sysconfdir@/logcheck/ignore.d.server +.@sysconfdir@/logcheck/ignore.d.workstation +.@sysconfdir@/logcheck/violations.ignore.d +.@sysconfdir@/logrotate.d +.@sysconfdir@/mail +.@sysconfdir@/mail/m4 +.@sysconfdir@/mail/peers +.@sysconfdir@/mail/smrsh +.@sysconfdir@/mail/sasl +.@sysconfdir@/mail/tls +.@sysconfdir@/network +.@sysconfdir@/network/if-down.d +.@sysconfdir@/network/if-up.d +.@sysconfdir@/pam.d +.@sysconfdir@/ppp/ip-down.d +.@sysconfdir@/ppp/ip-up.d +.@sysconfdir@/resolvconf +.@sysconfdir@/resolvconf/update-libc.d +.@bindir@ +.@sbindir@ +.@docdir@/sendmail-base +.@mandir@ +.@mandir@/man1 +.@mandir@/man8 +.@datadir@/bug +.@datadir@/bug/sendmail +.@datadir@/sendmail +.@datadir@/sendmail/examples +.@datadir@/sendmail/examples/db +.@datadir@/sendmail/examples/dhcp3 +.@datadir@/sendmail/examples/dhcp3/dhclient-exit-hooks.d +.@datadir@/sendmail/examples/ppp +.@datadir@/sendmail/examples/ppp/ip-down.d +.@datadir@/sendmail/examples/ppp/ip-up.d +.@datadir@/sendmail/examples/ldap +.@datadir@/sendmail/examples/logcheck +.@datadir@/sendmail/examples/logcheck/ignore.d.paranoid +.@datadir@/sendmail/examples/logcheck/ignore.d.server +.@datadir@/sendmail/examples/logcheck/ignore.d.workstation +.@datadir@/sendmail/examples/logcheck/violations.ignore.d +.@datadir@/sendmail/examples/milter +.@datadir@/sendmail/examples/network +.@datadir@/sendmail/examples/network/if-down.d +.@datadir@/sendmail/examples/network/if-up.d +.@datadir@/sendmail/examples/pam.d +.@datadir@/sendmail/examples/resolvconf +.@datadir@/sendmail/examples/resolvconf/update-libc.d +.@datadir@/sendmail/examples/sasl +.@datadir@/sendmail/examples/tls +.@datadir@/lintian/overrides diff --git a/debian/build/debian/sendmail-base.lintian-overrides b/debian/build/debian/sendmail-base.lintian-overrides new file mode 100644 index 0000000..abc14c9 --- /dev/null +++ b/debian/build/debian/sendmail-base.lintian-overrides @@ -0,0 +1 @@ +sendmail-base: manpage-has-bad-whatis-entry usr/share/man/man8/etrn.8.gz diff --git a/debian/build/debian/sendmail-base.postinst.in b/debian/build/debian/sendmail-base.postinst.in new file mode 100644 index 0000000..f726fcc --- /dev/null +++ b/debian/build/debian/sendmail-base.postinst.in @@ -0,0 +1,116 @@ +#!/bin/sh -e +# +# Debian post installation script +# +# Install of already installed package: +# 1) old-prerm upgrade new-version +# *) new-prerm failed-upgrade old-version +# *) old-postinst abort-upgrade new-version +# +# If a `conflicting' package is being removed at the same time: +# 1) forall packages depending on conflicting package and --auto-deconfigure +# deconfigured's-prerm deconfigure \ +# in-favour package-being-installed version \ +# removing conflicting-package version +# *) deconfigured's-postinst abort-deconfigure \ +# in-favour package-being-installed-but-failed version \ +# removing conflicting-package version +# 2) To prepare for removal of the conflicting package +# conflictor's-prerm remove \ +# in-favour package new-version +# *) conflictor's-postinst abort-remove \ +# in-favour package new-version +# +# Configuration of package: +# postinst configure most-recently-configured-version +# +set -e; + +PACKAGE=sendmail-base; + +# do we have debconf? +if [ -f /usr/share/debconf/confmodule ]; then + DEBCONF=true; + #. /usr/share/debconf/confmodule; + #db_stop; # For testing +else + DEBCONF=''; + fi; + +case "$1" in + configure) + #----------------------------------------------------------- + if [ "$2" = "" ]; then + :; + #echo " "; + #echo "A new sendmail user, welcome!"; + fi; + + #----------------------------------------------------------- + # Tell users about new and interesting things... + if [ -x @datadir@/sendmail/update_notices ]; then + @datadir@/sendmail/update_notices $2; + fi; + + #----------------------------------------------------------- + # Create group/user smmta/smmsp iff needed + touch @sysconfdir@/mail/tsmmta; + if ! chown root:smmta @sysconfdir@/mail/tsmmta 2>/dev/null; then + addgroup --system --quiet smmta; + fi; + if ! chown smmta:smmta @sysconfdir@/mail/tsmmta 2>/dev/null; then + adduser --system --ingroup smmta --home "/var/lib/sendmail" \ + --disabled-password \ + --quiet --gecos 'Mail Transfer Agent' smmta; + fi; + rm @sysconfdir@/mail/tsmmta; + touch @sysconfdir@/mail/tsmmsp; + if ! chown root:smmsp @sysconfdir@/mail/tsmmsp 2>/dev/null; then + addgroup --system --quiet smmsp; + fi; + if ! chown smmsp:smmsp @sysconfdir@/mail/tsmmsp 2>/dev/null; then + adduser --system --ingroup smmsp --home "/var/lib/sendmail" \ + --disabled-password \ + --quiet --gecos 'Mail Submission Program' smmsp; + fi; + rm @sysconfdir@/mail/tsmmsp; + + #----------------------------------------------------------- + # With a dynamic uid/gid, have to set appropriate ownership herein + chown root:smmsp @sysconfdir@/mail/sasl; + chown root:smmsp @sysconfdir@/mail/tls; + + #----------------------------------------------------------- + # Save the current configuration files in safe place... + if [ -x @sysconfdir@/cron.daily/sendmail ]; then + echo "Saving current /etc/mail/sendmail.mc,cf to /var/backups"; + @sysconfdir@/cron.daily/sendmail || true; + fi; + + #----------------------------------------------------------- + # Make sure inetd.conf has sendmail in it (but disabled) + if [ -x /usr/sbin/update-inetd ]; then + update-inetd --remove "^587"; + update-inetd --group MAIL --add \ + "#<off># smtp\tstream\ttcp\tnowait\troot\t@sbindir@/sendmail sendmail -Am -bs"; + update-inetd --group MAIL --add \ + "#<off># submission\tstream\ttcp\tnowait\troot\t@sbindir@/sendmail sendmail -Am -bs"; + update-inetd --group MAIL --add \ + "#<off># smtps\tstream\ttcp\tnowait\troot\t@sbindir@/sendmail sendmail -Am -bs"; + update-inetd --group MAIL --disable smtp,smtps,submission; + fi; + + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + exit 0; + ;; + + *) + echo "$PACKAGE postinst called with unknown argument \`$1'" >&2; + exit 1; + ;; + esac; + +#DEBHELPER# +exit 0; diff --git a/debian/build/debian/sendmail-base.postrm.in b/debian/build/debian/sendmail-base.postrm.in new file mode 100644 index 0000000..a440573 --- /dev/null +++ b/debian/build/debian/sendmail-base.postrm.in @@ -0,0 +1,106 @@ +#!/bin/sh -e +# +# Debian post removal script +# +# Install of already installed package: +# 1) Upgrade of package: +# new-preinst upgrade old-version +# *) new-postrm abort-upgrade old-version +# 2) package had some configuration files from a previous version installed +# new-preinst install old-version +# *) new-postrm abort-install old-version +# 3) Otherwise (i.e., the package was completely purged) +# new-preinst install +# *) new-postrm abort-install +# +# Removal of a package: +# 1) prerm remove +# 2) The package's files are removed (except conffiles). +# 3) postrm remove +# 4) All the maintainer scripts except the postrm are removed. +# 5) The conffiles and any backup files +# (~-files, #*# files, %-files, .dpkg-{old,new,tmp}, etc.) are removed. +# 6) postrm purge +# 7) The package's file list is removed +# +set -e; + +PACKAGE=sendmail-base; + +case "$1" in + remove) + if [ ! -z "$2" ]; then + echo "Removing $PACKAGE $2 $3($4)"; + fi; + + if [ -x /usr/sbin/update-inetd ]; then + update-inetd --remove "^smtp"; + update-inetd --remove "^smtps"; + update-inetd --remove "^submission"; + fi; + ;; + + purge) + # Currently, dh_installdebconf doesn't do db_stop... ensure it is done! + if [ "$1" = "purge" ] && [ -e /usr/share/debconf/confmodule ]; then + # Source debconf library. + . /usr/share/debconf/confmodule; + # Make sure we're done + #db_stop; + # Remove my changes to the db. + db_purge; + fi; + + # Remove user/group smmsp + if [ -x /usr/sbin/deluser ]; then + deluser --quiet smmta || true; + deluser --quiet smmsp || true; + fi; + userdel smmta 2>/dev/null || true; + groupdel smmta 2>/dev/null || true; + userdel smmsp 2>/dev/null || true; + groupdel smmsp 2>/dev/null || true; + + # Purge those files installed in other package directories + rm -f @libdir@/lib/sasl/Sendmail.conf; + rm -f @sysconfdir@/certs/sendmail.pem; + rm -f @datadir@/bug/sendmail*; + # Can't touch these as they may be included in slapd.conf + #rm -rf @sysconfdir@/ldap/schema/sendmail.schema; + #rm -rf @sysconfdir@/openldap/sendmail.schema; + #rm -rf @sysconfdir@/umich-ldap/sendmail.schema; + # Purge psuedo conffiles (managed by sendmail) + rm -f @sysconfdir@/mail/sendmail.conf; + # Purge sendmail configuration files + rm -f @sysconfdir@/mail/sendmail.mc \ + @sysconfdir@/mail/submit.mc \ + @sysconfdir@/mail/m4/dialup.m4 \ + @sysconfdir@/mail/m4/provider.m4 \ + @sysconfdir@/mail/local-host-names \ + @sysconfdir@/mail/relay-domains \ + @sysconfdir@/mail/trusted-users \ + @sysconfdir@/mail/default-auth-info \ + ; + rmdir @sysconfdir@/mail/peers 2>/dev/null || true; + rmdir @sysconfdir@/mail 2>/dev/null || true; + + ;; + + upgrade) + ;; + + failed-upgrade|abort-install|abort-upgrade|disappear) + echo "$1 of $PACKAGE $2"; + ;; + + *) + echo "$PACKAGE postrm called with unknown argument \`$1'" >&2; + exit 1; + ;; + esac; + +# NOTE WELL: If we fall through here during purge, update-rc.d will be +# called with remove... and /etc/init.d/$PACKAGE goes away! +#DEBHELPER# + +exit 0; diff --git a/debian/build/debian/sendmail-base.preinst.in b/debian/build/debian/sendmail-base.preinst.in new file mode 100644 index 0000000..576313b --- /dev/null +++ b/debian/build/debian/sendmail-base.preinst.in @@ -0,0 +1,66 @@ +#!/bin/sh -e +# +# Debian pre install script +# +# Install of already installed package: +# 1) Upgrade of package: +# new-preinst upgrade old-version +# *) new-postrm abort-upgrade old-version +# 2) package had some configuration files from a previous version installed +# new-preinst install old-version +# *) new-postrm abort-install old-version +# 3) Otherwise (i.e., the package was completely purged) +# new-preinst install +# *) new-postrm abort-install +# +set -e; + +PACKAGE=sendmail-base; + +case "$1" in + install) + # DPKG doesn't overwrite directories with symlinks... + rm -rf @docdir@/sendmail/examples 2>/dev/null || true; + if [ -d @docdir@/$PACKAGE ]; then + rm -rf @docdir@/$PACKAGE; + fi; + if [ ! -d @docdir@/sendmail ]; then + mkdir -p @docdir@/sendmail; + chmod a+rx @docdir@/sendmail; + fi; + ln -sf sendmail @docdir@/$PACKAGE; + ;; + + upgrade) + # DPKG doesn't overwrite directories with symlinks... + if [ -d @docdir@/$PACKAGE ]; then + rm -rf @docdir@/$PACKAGE; + fi; + if [ ! -d @docdir@/sendmail ]; then + mkdir -p @docdir@/sendmail; + chmod a+rx @docdir@/sendmail; + fi; + ln -sf sendmail @docdir@/$PACKAGE; + + # Prevent cronjob from running during upgrade... + if [ -f @sysconfdir@/cron.d/sendmail ]; then + echo "#preinst" > @sysconfdir@/cron.d/sendmail; + fi; + + # Move files to new home + if [ -d @sysconfdir@/mail/ssl ]; then + mv -f @sysconfdir@/mail/ssl @sysconfdir@/mail/tls; + fi; + ;; + + abort-upgrade) + ;; + + *) + echo "$PACKAGE preinst called with unknown argument \`$1'" >&2; + exit 1; + ;; + esac; + +#DEBHELPER# +exit 0; diff --git a/debian/sendmail.prerm.in b/debian/build/debian/sendmail-base.prerm.in index fdeae7d..28941ad 100644 --- a/debian/sendmail.prerm.in +++ b/debian/build/debian/sendmail-base.prerm.in @@ -29,41 +29,28 @@ # set -e; -PACKAGE=`echo "$(basename $0)" | sed -e 's/\.prerm$//'`; +PACKAGE=sendmail-base; case "$1" in remove) if [ ! -z "$2" ]; then echo "Removing $PACKAGE $2 $3($4)"; - if [ "$PACKAGE" = 'sendmail' -a "$3" = 'sendmail-tls' ] || \ - [ "$PACKAGE" = 'sendmail-tls' -a "$3" = 'sendmail' ]; then - echo '...Nothing to do...'; - exit 0; - fi; fi; + if [ -x /usr/sbin/update-inetd ]; then - update-inetd --disable smtp; - fi; - if [ -x @sysconfdir@/init.d/sendmail ]; then - if [ -x /usr/sbin/invoke-rc.d ]; then - /usr/sbin/invoke-rc.d --quiet --force sendmail stop; - else - @sysconfdir@/init.d/sendmail stop; - fi; + update-inetd --group MAIL --disable smtp,smtps,submission; fi; # Make sure /etc/aliases is left (move it from /etc/mail if needed) if [ -L @sysconfdir@/mail/aliases ]; then rm -f @sysconfdir@/mail/aliases; - elif [ -f @sysconfdir@/mail/aliases -a \ - -L /etc/aliases ]; then + elif [ -f @sysconfdir@/mail/aliases ] \ + && [ -L /etc/aliases ]; then mv @sysconfdir@/mail/aliases /etc/aliases; fi; # Remove psuedo conffiles (managed by sendmail) - if [ -f /etc/cron.d/sendmail ]; then - echo "#prerm" > @sysconfdir@/cron.d/sendmail; - fi; + rm -f @sysconfdir@/cron.d/sendmail; # Remove files scattered across the system that # happened to be created by sendmail @@ -76,11 +63,23 @@ case "$1" in #rm -f @localstatedir@/log/mail/*; #rm -f @localstatedir@/log/mail.log; # Note: these can lead to a loss of mail!!!! - @sysconfdir@/init.d/sendmail clean; - rmdir --ignore-fail-on-non-empty \ - @localstatedir@/spool/mqueue; - rmdir --ignore-fail-on-non-empty \ - @localstatedir@/spool/mqueue-client; + if [ -x @sysconfdir@/init.d/sendmail ]; then + @sysconfdir@/init.d/sendmail clean; + fi; + if [ -L @localstatedir@/spool/mqueue ]; then + rmdir --ignore-fail-on-non-empty \ + `readlink -fn @localstatedir@/spool/mqueue`; + elif [ -d @localstatedir@/spool/mqueue ]; then + rmdir --ignore-fail-on-non-empty \ + @localstatedir@/spool/mqueue; + fi; + if [ -L @localstatedir@/spool/mqueue-client ]; then + rmdir --ignore-fail-on-non-empty \ + `readlink -fn @localstatedir@/spool/mqueue-client`; + elif [ -d @localstatedir@/spool/mqueue-client ]; then + rmdir --ignore-fail-on-non-empty \ + @localstatedir@/spool/mqueue-client; + fi; # Remove sendmail built configuration files rm -f @sysconfdir@/mail/*.db \ @@ -94,7 +93,7 @@ case "$1" in @sysconfdir@/mail/submit.cf.errors \ @sysconfdir@/mail/submit.mc.old \ @sysconfdir@/mail/databases \ - @sysconfdir@/mail/Makefile \ + @sysconfdir@/mail/Makefile \ ; rm -rf @sysconfdir@/mail/smrsh \ @sysconfdir@/mail/sasl \ @@ -109,13 +108,11 @@ case "$1" in # before it gets deleted (for not existing in the new package) mv -f @sysconfdir@/default/sendmail \ @sysconfdir@/mail/sendmail.conf 2>/dev/null || true; - # - # 8.9.3- used sendmail.hf, we now use helpfile - mv -f @sysconfdir@/mail/sendmail.hf \ - @sysconfdir@/mail/helpfile 2>/dev/null || true; # Prevent cronjob from running during upgrade... - rm -f @sysconfdir@/cron.d/sendmail; + if [ -f /etc/cron.d/sendmail ]; then + echo "#prerm" > @sysconfdir@/cron.d/sendmail; + fi; ;; failed-upgrade) @@ -134,18 +131,6 @@ case "$1" in # The @DEBHELPER@ stuff causes problems with upgrades because of the # length of time that Sendmail is stopped... -# Automatically added by dh_installdocs -if [ \( "$1" = "upgrade" -o "$1" = "remove" \) -a -L /usr/doc/sendmail ]; then - rm -f /usr/doc/sendmail -fi -# End automatically added section -# Automatically added by dh_installinit -#if [ -x "@sysconfdir@/init.d/sendmail" ]; then -# @sysconfdir@/init.d/sendmail stop -#fi -# End automatically added section -exit 0; - # # Included for sanity checks # diff --git a/debian/sendmail.conffiles.in b/debian/build/debian/sendmail-bin.conffiles.in index 729712d..a5ba4ad 100644 --- a/debian/sendmail.conffiles.in +++ b/debian/build/debian/sendmail-bin.conffiles.in @@ -3,7 +3,7 @@ @sysconfdir@/logcheck/ignore.d.paranoid/sendmail @sysconfdir@/logcheck/ignore.d.server/sendmail @sysconfdir@/logcheck/ignore.d.workstation/sendmail -@sysconfdir@/logcheck/violations.ignore.d/sendmail +@sysconfdir@/logcheck/violations.ignore.d/logcheck-sendmail @sysconfdir@/mail/peers/provider @sysconfdir@/mail/helpfile @sysconfdir@/mail/service.switch diff --git a/debian/build/debian/sendmail-bin.dirs.in b/debian/build/debian/sendmail-bin.dirs.in new file mode 100644 index 0000000..0e6ad62 --- /dev/null +++ b/debian/build/debian/sendmail-bin.dirs.in @@ -0,0 +1,20 @@ +./DEBIAN +.@sysconfdir@/cron.daily +.@sysconfdir@/init.d +.@bindir@ +.@sbindir@ +.@libexecdir@ +.@docdir@/sendmail +.@mandir@ +.@mandir@/man1 +.@mandir@/man5 +.@mandir@/man8 +.@datadir@/bug +.@localstatedir@/lib/sendmail +.@localstatedir@/run/sendmail +.@localstatedir@/run/sendmail/msp +.@localstatedir@/run/sendmail/mta +.@localstatedir@/run/sendmail/stampdir +.@localstatedir@/spool/mqueue +.@localstatedir@/spool/mqueue-client +.@datadir@/lintian/overrides diff --git a/debian/build/debian/sendmail-bin.lintian-overrides b/debian/build/debian/sendmail-bin.lintian-overrides new file mode 100644 index 0000000..24785ad --- /dev/null +++ b/debian/build/debian/sendmail-bin.lintian-overrides @@ -0,0 +1,9 @@ +sendmail-bin: duplicate-updaterc.d-calls-in-postinst sendmail +sendmail-bin: suidregister-used-in-maintainer-script postinst +sendmail-bin: suidregister-used-in-maintainer-script postinst +sendmail-bin: duplicate-updaterc.d-calls-in-postinst sendmail +sendmail-bin: setgid-binary usr/lib/sm.bin/sendmail 2755 root/mail +sendmail-bin: setgid-binary usr/lib/sm.bin/mailstats 2755 root/mail +sendmail-bin: binary-without-manpage mailq +sendmail-bin: binary-without-manpage newaliases +sendmail-bin: manpage-section-mismatch usr/share/man/man8/newaliases.sendmail.8.gz:14 8 != 1 diff --git a/debian/sendmail.postinst.in b/debian/build/debian/sendmail-bin.postinst.in index d2cd445..6305757 100644 --- a/debian/sendmail.postinst.in +++ b/debian/build/debian/sendmail-bin.postinst.in @@ -26,138 +26,13 @@ # set -e; -PACKAGE=`echo "$(basename $0)" | sed -e 's/\.postinst$//'`; - -# do we have debconf? -if [ -f /usr/share/debconf/confmodule ]; then - DEBCONF=true; - #. /usr/share/debconf/confmodule; - #db_stop; # For testing -else - DEBCONF=''; - fi; - -case "$1" in - configure) - # continue below - ;; - - abort-upgrade|abort-remove|abort-deconfigure) - exit 0; - ;; - - *) - echo "$PACKAGE postinst called with unknown argument \`$1'" >&2; - exit 1; - ;; - esac; - -#-------------------------------------------------------------------- -# Continuation of "$1" = "configure" - -if [ "$2" = "" ]; then - echo " "; - echo "A new sendmail user, welcome!"; - fi; - -# Note: can't use debhelper here because the actions aren't contiguous -#xxxHELPER# - -# This would be done via debhelper, but the start of sendmail must be delayed - -if [ '@DEBIAN_DH@' != '4.1' ]; then -# Automatically added by dh_installdocs -if [ "$1" = "configure" ]; then - if [ -d /usr/doc -a ! -e /usr/doc/sendmail -a -d /usr/share/doc/sendmail ]; then - ln -sf ../share/doc/sendmail /usr/doc/sendmail - fi -fi -# End automatically added section -fi; -# Automatically added by dh_installinit -if [ -x "@sysconfdir@/init.d/sendmail" ]; then - update-rc.d sendmail defaults >/dev/null - #/etc/init.d/sendmail start -fi -# End automatically added section -# Automatically added by dh_installmenu -#if test -x /usr/bin/update-menus ; then update-menus ; fi -# End automatically added section - -#----------------------------------------------------------- -# Tell users about new and interesting things... -if [ -x @datadir@/sendmail/update_notices ]; then - @datadir@/sendmail/update_notices $2; - fi; - - -#----------------------------------------------------------- -if test ! -z "$version" && \ - (dpkg --compare-versions "$version" lt 8.12.6-5); then - if [ -x /usr/sbin/deluser ]; then - deluser --quiet smmsp || true; - else - userdel smmsp || true; - fi; - if [ -x /usr/sbin/delgroup ]; then - delgroup --quiet smmsp || true; - else - groupdel smmsp || true; - fi; - fi; -# Create group/user smmsp iff needed -touch @sysconfdir@/mail/smmsp; -if ! chown root:smmsp @sysconfdir@/mail/smmsp 2>/dev/null; then - addgroup --system --quiet smmsp; - fi; -if ! chown smmsp:smmsp @sysconfdir@/mail/smmsp 2>/dev/null; then - adduser --system --ingroup smmsp --home "/var/lib/sendmail" \ - --disabled-password \ - --quiet --gecos 'Mail Submission Program' smmsp; - fi; -rm @sysconfdir@/mail/smmsp; - -#----------------------------------------------------------- -# With a dynamic uid/gid, have to set appropriate ownership herein -if command -v suidregister >/dev/null 2>&1 && test -s /etc/suid.conf; then - suidregister -s sendmail @sbindir@/sendmail root smmsp 02755; - suidregister -s sendmail @libexecdir@/mailstats root smmsp 02755; -elif [ -x @sbindir@/sendmail ]; then - chown root:smmsp @sbindir@/sendmail; - chmod 02755 @sbindir@/sendmail; - chown root:smmsp @libexecdir@/mailstats; - chmod 02755 @libexecdir@/mailstats; - fi; -chown root:smmsp @sysconfdir@/mail/sasl; -chown root:smmsp @sysconfdir@/mail/tls; - -#----------------------------------------------------------- -# Make sure inetd.conf has sendmail in it (but disabled) -if [ -x /usr/sbin/update-inetd ]; then - update-inetd --group MAIL --remove smtp; - update-inetd --group MAIL --remove smtps; - update-inetd --group MAIL --remove 587; - update-inetd --group MAIL --add \ - "smtp \tstream\ttcp\tnowait\troot\t@sbindir@/sendmail sendmail -Am -bs"; - update-inetd --group MAIL --add \ - "587 \tstream\ttcp\tnowait\troot\t@sbindir@/sendmail sendmail -Am -bs"; - update-inetd --group MAIL --add \ - "smtps\tstream\ttcp\tnowait\troot\t@sbindir@/sendmail sendmail -Am -bs"; - update-inetd --group MAIL --disable smtp,smtps,587; - fi; - -#----------------------------------------------------------- -# Save the current configuration files in safe place... -if [ -x @sysconfdir@/cron.daily/sendmail ]; then - echo "Saving current /etc/mail/sendmail.mc,cf to /var/backups"; - @sysconfdir@/cron.daily/sendmail || true; - fi; +PACKAGE=sendmail-bin; #----------------------------------------------------------- #stop(): stop sendmail stop () { # Account for varying PIDfile locations of older sendmail packages - if [ -f /var/run/sendmail/msp/sendmail.pid ]; then + if [ -f /var/run/sendmail/mta/sendmail.pid ]; then start-stop-daemon --stop --oknodo --quiet \ --pidfile /var/run/sendmail/msp/sendmail.pid > /dev/null; start-stop-daemon --stop --oknodo --quiet \ @@ -169,6 +44,13 @@ stop () { start-stop-daemon --stop --oknodo --quiet \ --pidfile /var/run/sendmail.pid > /dev/null; fi; + # Since we changed the executable, do one more try - using the old name + if [ -f /var/run/sendmail/mta/sendmail.pid ]; then + start-stop-daemon --stop --oknodo --quiet \ + --pidfile /var/run/sendmail/mta/sendmail.pid > /dev/null; + fi; + start-stop-daemon --stop --oknodo --quiet \ + --name sendmail > /dev/null; if [ -x @sysconfdir@/init.d/sendmail ]; then if [ -x /usr/sbin/invoke-rc.d ]; then /usr/sbin/invoke-rc.d --quiet --force sendmail stop; @@ -178,34 +60,13 @@ stop () { fi; }; -start_ask=0; - #----------------------------------------------------------- #start(): start sendmail start () { - local enter; - if [ $start_ask -eq 1 ]; then - echo " "; - echo -n "Start sendmail now? (Y/n) "; - read yn; - yn=$(echo -n "$yn" | sed -e "s/^\ *//" -e "s/^\t*//"); - test -n "$yn" || yn="Y"; - case "$yn" in - [Yy]*) - if [ -x /usr/sbin/invoke-rc.d ]; then - /usr/sbin/invoke-rc.d sendmail start; - else - @sysconfdir@/init.d/sendmail start; - fi; - ;; - [Nn]*) - echo " "; - echo "Not started; to start later," \ - "type: @sysconfdir@/init.d/sendmail start"; - echo -n "Press [ENTER] "; - read enter; - ;; - esac; + if [ -x /usr/sbin/invoke-rc.d ]; then + /usr/sbin/invoke-rc.d sendmail start; + else + @sysconfdir@/init.d/sendmail start; fi; }; @@ -217,16 +78,9 @@ configure () { read yn; yn=$(echo -n "$yn" | sed -e "s/^\ *//" -e "s/^\t*//"); test -n "$yn" || yn="N"; - case "$yn" in - [Yy]*) - if [ -f @sysconfdir@/mail/sendmail.cf ]; then - echo "Saving old /etc/mail/sendmail.cf" \ - "as /etc/mail/sendmail.cf.old ..."; - mv -f @sysconfdir@/mail/sendmail.cf \ - @sysconfdir@/mail/sendmail.cf.old; - chown root:root @sysconfdir@/mail/sendmail.cf.old; - chmod 0644 @sysconfdir@/mail/sendmail.cf.old; - fi; + case "$yn" in + [Yy]*) + stop; @sbindir@/sendmailconfig --no-reload; start; ;; @@ -242,6 +96,105 @@ configure () { esac; }; +# do we have debconf? +if [ -f /usr/share/debconf/confmodule ]; then + DEBCONF=true; + #. /usr/share/debconf/confmodule; + #db_stop; # For testing +else + DEBCONF=''; + fi; + +case "$1" in + configure) + # continue below + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + exit 0; + ;; + + *) + echo "$PACKAGE postinst called with unknown argument \`$1'" >&2; + exit 1; + ;; + esac; + +#-------------------------------------------------------------------- +# Continuation of "$1" = "configure" + +# Note: can't use debhelper here because the actions aren't contiguous +#xxxHELPER# + +# Automatically added by dh_installinit +if [ -x "@sysconfdir@/init.d/sendmail" ]; then + update-rc.d -f sendmail remove >/dev/null; + update-rc.d sendmail defaults 21 19 >/dev/null; + #/etc/init.d/sendmail start +fi +# End automatically added section + +#----------------------------------------------------------- +# Create (or update) MTA, MSP alternatives +# This way, we'll be able to install 2 MTAs on the same box :) +update-alternatives \ + --install @sbindir@/sendmail-mta sendmail-mta @libexecdir@/sendmail 25 \ + --slave @mandir@/man8/sendmail-mta.8.gz sendmail-mta.8.gz \ + @mandir@/man8/sendmail.sendmail.8.gz \ + --slave @sbindir@/runq runq @datadir@/sendmail/runq \ + --slave @mandir@/man8/runq.8.gz runq.8.gz \ + @mandir@/man8/runq.sendmail.8.gz \ + --slave @sbindir@/newaliases newaliases \ + @datadir@/sendmail/newaliases \ + --slave @mandir@/man8/newaliases.8.gz newaliases.8.gz \ + @mandir@/man8/newaliases.sendmail.8.gz \ + --slave @bindir@/mailq mailq @datadir@/sendmail/mailq \ + --slave @mandir@/man1/mailq.1.gz mailq.1.gz \ + @mandir@/man1/mailq.sendmail.1.gz \ + --slave @mandir@/man5/aliases.5.gz aliases.5.gz \ + @mandir@/man5/aliases.sendmail.5.gz \ + ; +update-alternatives \ + --install @sbindir@/sendmail-msp sendmail-msp @libexecdir@/sendmail 25 \ + --slave @mandir@/man8/sendmail-msp.8.gz sendmail-msp.8.gz \ + @mandir@/man8/sendmail.sendmail.8.gz \ + --slave @sbindir@/sendmail sendmail @libexecdir@/sendmail \ + --slave @libdir@/sendmail lib.sendmail @libexecdir@/sendmail \ + --slave @mandir@/man8/sendmail.8.gz sendmail.8.gz \ + @mandir@/man8/sendmail.sendmail.8.gz \ + ; + +#----------------------------------------------------------- +# With a dynamic uid/gid, have to set appropriate ownership herein +if command -v suidregister >/dev/null 2>&1 && test -s /etc/suid.conf; then + suidregister -s sendmail @sbindir@/sendmail root smmsp 02755; + suidregister -s sendmail @libexecdir@/mailstats root smmsp 02755; +elif [ -x @sbindir@/sendmail ]; then + chown root:smmsp @libexecdir@/sendmail; + chmod 02755 @libexecdir@/sendmail; + chown root:smmsp @libexecdir@/mailstats; + chmod 02755 @libexecdir@/mailstats; + fi; + +#----------------------------------------------------------- +# Create backups of /etc/mail/{sendmail,submit}.mc +if [ -f @sysconfdir@/mail/sendmail.cf ]; then + echo "Saving old /etc/mail/sendmail.cf" \ + "as /etc/mail/sendmail.cf.old ..."; + cp -f @sysconfdir@/mail/sendmail.cf \ + @sysconfdir@/mail/sendmail.cf.old; + chown root:root @sysconfdir@/mail/sendmail.cf.old; + chmod 0644 @sysconfdir@/mail/sendmail.cf.old; + fi; +if [ -f @sysconfdir@/mail/submit.cf ]; then + cp -f @sysconfdir@/mail/submit.cf \ + @sysconfdir@/mail/submit.cf.old; + chown root:root @sysconfdir@/mail/submit.cf.old; + chmod 0644 @sysconfdir@/mail/submit.cf.old; + fi; + +start_ask=0; + #----------------------------------------------------------- # Create /etc/mail/sendmail.mc if it doesn't exist if [ ! -f @sysconfdir@/mail/sendmail.mc ]; then @@ -250,16 +203,21 @@ if [ ! -f @sysconfdir@/mail/sendmail.mc ]; then You are doing a new install, or have erased /etc/mail/sendmail.mc. If you've accidentaly erased /etc/mail/sendmail.mc, check /var/backups. - Sendmail will not start until it is configured. - Do you wish to configure sendmail now, or wait until later? + I am creating a safe, default sendmail.mc for you and you can + run sendmailconfig later if you need to change the defaults. EOT - start_ask=1; - start_txt=""; - configure; - exit 0; fi; +if [ -x @datadir@/sendmail/update_sendmail ]; then + stop; + echo "Updating sendmail environment ..."; + @datadir@/sendmail/update_sendmail || true; + start; + fi; +exit 0; + + #----------------------------------------------------------- # See if we can do this automagically... cat <<-EOT @@ -286,6 +244,12 @@ case "$yn" in chown root:root @sysconfdir@/mail/sendmail.cf.old; chmod 0644 @sysconfdir@/mail/sendmail.cf.old; fi; + if [ -f @sysconfdir@/mail/submit.cf ]; then + cp -f @sysconfdir@/mail/submit.cf \ + @sysconfdir@/mail/submit.cf.old; + chown root:root @sysconfdir@/mail/submit.cf.old; + chmod 0644 @sysconfdir@/mail/submit.cf.old; + fi; if [ -x @datadir@/sendmail/update_sendmail ]; then stop; echo "Updating sendmail environment ..."; @@ -322,7 +286,6 @@ case "$yn" in EOT echo "Do you wish to run sendmailconfig now, or later"; start_ask=0; - stop; configure; case "$yn" in [Yy]*) diff --git a/debian/sendmail.postrm.in b/debian/build/debian/sendmail-bin.postrm.in index 47451b4..e0ae347 100644 --- a/debian/sendmail.postrm.in +++ b/debian/build/debian/sendmail-bin.postrm.in @@ -25,23 +25,18 @@ # set -e; -PACKAGE=`echo "$(basename $0)" | sed -e 's/\.postrm$//'`; +PACKAGE=sendmail-bin; case "$1" in remove) if [ ! -z "$2" ]; then echo "Removing $PACKAGE $2 $3($4)"; - if [ "$PACKAGE" = 'sendmail' -a "$3" = 'sendmail-tls' ] || \ - [ "$PACKAGE" = 'sendmail-tls' -a "$3" = 'sendmail' ]; then + if [ "$PACKAGE" = 'sendmail' ] && [ "$3" = 'sendmail-tls' ] || \ + [ "$PACKAGE" = 'sendmail-tls' ] && [ "$3" = 'sendmail' ]; then echo '...Nothing to do...'; exit 0; fi; fi; - if [ -x /usr/sbin/update-inetd ]; then - update-inetd --remove smtp; - update-inetd --remove smtps; - update-inetd --remove 587; - fi; ;; purge) @@ -60,7 +55,7 @@ case "$1" in fi; # Currently, dh_installdebconf doesn't do db_stop... ensure it is done! - if [ "$1" = "purge" -a -e /usr/share/debconf/confmodule ]; then + if [ "$1" = "purge" ] && [ -e /usr/share/debconf/confmodule ]; then # Source debconf library. . /usr/share/debconf/confmodule; # Make sure we're done @@ -68,35 +63,6 @@ case "$1" in # Remove my changes to the db. db_purge; fi; - - # Remove user/group smmsp - if [ -x /usr/sbin/deluser ]; then - deluser --quiet smmsp || true; - fi; - userdel smmsp 2>/dev/null || true; - groupdel smmsp 2>/dev/null || true; - - # Purge those files installed in other package directories - rm -f @libdir@/lib/sasl/Sendmail.conf; - rm -f @sysconfdir@/certs/sendmail.pem; - # Can't touch these as they may be included in slapd.conf - #rm -rf @sysconfdir@/ldap/schema/sendmail.schema; - #rm -rf @sysconfdir@/openldap/sendmail.schema; - #rm -rf @sysconfdir@/umich-ldap/sendmail.schema; - # Purge psuedo conffiles (managed by sendmail) - rm -f @sysconfdir@/mail/sendmail.conf; - # Purge sendmail configuration files - rm -f @sysconfdir@/mail/sendmail.mc \ - @sysconfdir@/mail/submit.mc \ - @sysconfdir@/mail/dialup.m4 \ - @sysconfdir@/mail/provider.m4 \ - @sysconfdir@/mail/local-host-names \ - @sysconfdir@/mail/relay-domains \ - @sysconfdir@/mail/trusted-users \ - @sysconfdir@/mail/default-auth-info \ - ; - rmdir @sysconfdir@/mail/peers 2>/dev/null || true; - rmdir @sysconfdir@/mail 2>/dev/null || true; ;; upgrade) diff --git a/debian/sendmail.preinst.in b/debian/build/debian/sendmail-bin.preinst.in index 17d115d..b45a775 100644 --- a/debian/sendmail.preinst.in +++ b/debian/build/debian/sendmail-bin.preinst.in @@ -15,7 +15,7 @@ # set -e; -PACKAGE=`echo "$(basename $0)" | sed -e 's/\.preinst$//'`; +PACKAGE=sendmail-bin; # do we have debconf? if [ -f /usr/share/debconf/confmodule ]; then @@ -31,21 +31,12 @@ case "$1" in upgrade) # DPKG doesn't overwrite directories with symlinks... - rm -rf @docdir@/sendmail/examples 2>/dev/null || true; rm -rf @libdir@/sendmail 2>/dev/null || true; - # Somehow, /etc/logrotate.d/sendmail didn't get erased !?! - rm -rf @sysconfdir@/logrotate.d/sendmail 2>/dev/null || true; - # Prevent cronjob from running during upgrade... if [ -f /etc/cron.d/sendmail ]; then echo "#preinst" > @sysconfdir@/cron.d/sendmail; fi; - - # Move files to new home - if [ -d @sysconfdir@/mail/ssl ]; then - mv -f @sysconfdir@/mail/ssl @sysconfdir@/mail/tls; - fi; ;; abort-upgrade) diff --git a/debian/build/debian/sendmail-bin.prerm.in b/debian/build/debian/sendmail-bin.prerm.in new file mode 100644 index 0000000..05cdbf3 --- /dev/null +++ b/debian/build/debian/sendmail-bin.prerm.in @@ -0,0 +1,86 @@ +#!/bin/sh -e +# +# Debian pre removal script +# +# Install of already installed package: +# 1) old-prerm upgrade new-version +# *) new-prerm failed-upgrade old-version +# *) old-postinst abort-upgrade new-version +# +# If a `conflicting' package is being removed at the same time: +# 1) forall packages depending on conflicting package and --auto-deconfigure +# deconfigured's-prerm deconfigure \ +# in-favour package-being-installed version \ +# removing conflicting-package version +# *) deconfigured's-postinst abort-deconfigure \ +# in-favour package-being-installed-but-failed version \ +# removing conflicting-package version +# 2) To prepare for removal of the conflicting package +# conflictor's-prerm remove \ +# in-favour package new-version +# *) conflictor's-postinst abort-remove \ +# in-favour package new-version +# +# Removal of a package: +# 1) prerm remove +# 2) The package's files are removed (except conffiles). +# 3) postrm remove +# 4) All the maintainer scripts except the postrm are removed. +# +set -e; + +PACKAGE=sendmail-bin; + +case "$1" in + remove) + if [ ! -z "$2" ]; then + echo "Removing $PACKAGE $2 $3($4)"; + if [ "$PACKAGE" = 'sendmail' ] && [ "$3" = 'sendmail-tls' ] || \ + [ "$PACKAGE" = 'sendmail-tls' ] && [ "$3" = 'sendmail' ]; then + echo '...Nothing to do...'; + exit 0; + fi; + fi; + # Remove alternatives for MTA, MSP + update-alternatives --remove sendmail-mta @libexecdir@/sendmail; + update-alternatives --remove sendmail-msp @libexecdir@/sendmail; + if [ -x @sysconfdir@/init.d/sendmail ] && \ + [ -x @datadir@/sendmail/sendmail ]; then + if [ -x /usr/sbin/invoke-rc.d ]; then + /usr/sbin/invoke-rc.d --quiet --force sendmail stop; + else + @sysconfdir@/init.d/sendmail stop; + fi; + fi; + ;; + + upgrade) + # Prevent cronjob from running during upgrade... + if [ -f /etc/cron.d/sendmail ]; then + echo "#prerm" > @sysconfdir@/cron.d/sendmail; + fi; + + # NOTE NOTE NOTE NOTE NOTE + # If we fall through to DEBHELPER, sendmail will be stopped + # much earlier than necessary !!! + exit 0; + ;; + + failed-upgrade) + ;; + + deconfigure) + echo "Deconfigure of $PACKAGE $2 $3($4) $5 $6($7) "; + ;; + + *) + echo "$PACKAGE prerm called with unknown argument \`$1'" >&2; + exit 1; + ;; + esac; + +# +# Included for sanity checks +# +#DEBHELPER# +exit 0; diff --git a/debian/sendmail.suid.in b/debian/build/debian/sendmail-bin.suid.in index 32469ca..32469ca 100644 --- a/debian/sendmail.suid.in +++ b/debian/build/debian/sendmail-bin.suid.in diff --git a/debian/build/debian/sendmail-cf.dirs.in b/debian/build/debian/sendmail-cf.dirs.in new file mode 100644 index 0000000..5f68fa8 --- /dev/null +++ b/debian/build/debian/sendmail-cf.dirs.in @@ -0,0 +1,14 @@ +./DEBIAN +.@docdir@/sendmail-cf +.@datadir@/bug +.@datadir@/sendmail/cf +.@datadir@/sendmail/cf/cf +.@datadir@/sendmail/cf/debian +.@datadir@/sendmail/cf/domain +.@datadir@/sendmail/cf/feature +.@datadir@/sendmail/cf/hack +.@datadir@/sendmail/cf/m4 +.@datadir@/sendmail/cf/mailer +.@datadir@/sendmail/cf/ostype +.@datadir@/sendmail/cf/sh +.@datadir@/lintian/overrides diff --git a/debian/build/debian/sendmail-cf.postrm.in b/debian/build/debian/sendmail-cf.postrm.in new file mode 100644 index 0000000..5e963d4 --- /dev/null +++ b/debian/build/debian/sendmail-cf.postrm.in @@ -0,0 +1,56 @@ +#!/bin/sh -e +# +# Debian post removal script +# +# Install of already installed package: +# 1) Upgrade of package: +# new-preinst upgrade old-version +# *) new-postrm abort-upgrade old-version +# 2) package had some configuration files from a previous version installed +# new-preinst install old-version +# *) new-postrm abort-install old-version +# 3) Otherwise (i.e., the package was completely purged) +# new-preinst install +# *) new-postrm abort-install +# +# Removal of a package: +# 1) prerm remove +# 2) The package's files are removed (except conffiles). +# 3) postrm remove +# 4) All the maintainer scripts except the postrm are removed. +# 5) The conffiles and any backup files +# (~-files, #*# files, %-files, .dpkg-{old,new,tmp}, etc.) are removed. +# 6) postrm purge +# 7) The package's file list is removed +# +set -e; + +PACKAGE=sendmail-cf; + +case "$1" in + remove) + # /usr/share/doc/$PACKAGE is a symlink to /usr/share/doc/sendmail + rm -f @docdir@/$PACKAGE 2>/dev/null || true; + rmdir @docdir@/sendmail 2>/dev/null || true; + + # Make sure the data directory is *clean* + rm -rf @datadir@/sendmail/cf + ;; + + purge) + ;; + + upgrade) + ;; + + failed-upgrade|abort-install|abort-upgrade|disappear) + ;; + + *) + echo "$PACKAGE postrm called with unknown argument \`$1'" >&2; + exit 1; + ;; + esac; + +#DEBHELPER# +exit 0; diff --git a/debian/build/debian/sendmail-cf.preinst.in b/debian/build/debian/sendmail-cf.preinst.in new file mode 100644 index 0000000..d80d6d6 --- /dev/null +++ b/debian/build/debian/sendmail-cf.preinst.in @@ -0,0 +1,55 @@ +#!/bin/sh -e +# +# Debian pre install script +# +# Install of already installed package: +# 1) Upgrade of package: +# new-preinst upgrade old-version +# *) new-postrm abort-upgrade old-version +# 2) package had some configuration files from a previous version installed +# new-preinst install old-version +# *) new-postrm abort-install old-version +# 3) Otherwise (i.e., the package was completely purged) +# new-preinst install +# *) new-postrm abort-install +# +set -e; + +PACKAGE=sendmail-cf; + +case "$1" in + install) + # DPKG doesn't overwrite directories with symlinks... + if [ -d @docdir@/$PACKAGE ]; then + rm -rf @docdir@/$PACKAGE; + fi; + if [ ! -d @docdir@/sendmail ]; then + mkdir -p @docdir@/sendmail; + chmod a+rx @docdir@/sendmail; + fi; + ln -sf sendmail @docdir@/$PACKAGE; + ;; + + upgrade) + # DPKG doesn't overwrite directories with symlinks... + if [ -d @docdir@/$PACKAGE ]; then + rm -rf @docdir@/$PACKAGE; + fi; + if [ ! -d @docdir@/sendmail ]; then + mkdir -p @docdir@/sendmail; + chmod a+rx @docdir@/sendmail; + fi; + ln -sf sendmail @docdir@/$PACKAGE; + ;; + + abort-upgrade) + ;; + + *) + echo "$PACKAGE preinst called with unknown argument \`$1'" >&2; + exit 1; + ;; + esac; + +#DEBHELPER# +exit 0; diff --git a/debian/build/debian/sendmail-doc.dirs.in b/debian/build/debian/sendmail-doc.dirs.in new file mode 100644 index 0000000..6692aec --- /dev/null +++ b/debian/build/debian/sendmail-doc.dirs.in @@ -0,0 +1,8 @@ +./DEBIAN +.@docdir@/sendmail-doc +.@docdir@/sendmail-doc/libmilter +.@docdir@/sendmail-doc/libmilter/html +.@docdir@/sendmail-doc/op +.@docdir@/sendmail-doc/sendmail +.@datadir@/bug +.@datadir@/lintian/overrides diff --git a/debian/sendmail-doc.postrm.in b/debian/build/debian/sendmail-doc.postrm.in index 8b10744..5a66b10 100644 --- a/debian/sendmail-doc.postrm.in +++ b/debian/build/debian/sendmail-doc.postrm.in @@ -25,12 +25,12 @@ # set -e; -PACKAGE=`echo "$(basename $0)" | sed -e 's/\.postrm$//'`; +PACKAGE=sendmail-doc; case "$1" in remove) - # /usr/share/doc/sendmail-doc is a symlink to /usr/share/doc/sendmail - rm -f @docdir@/sendmail-doc 2>/dev/null || true; + # /usr/share/doc/$PACKAGE is a symlink to /usr/share/doc/sendmail + rm -f @docdir@/$PACKAGE 2>/dev/null || true; rmdir @docdir@/sendmail 2>/dev/null || true; ;; diff --git a/debian/sendmail-doc.preinst.in b/debian/build/debian/sendmail-doc.preinst.in index 85a410b..071f1e5 100644 --- a/debian/sendmail-doc.preinst.in +++ b/debian/build/debian/sendmail-doc.preinst.in @@ -15,31 +15,31 @@ # set -e; -PACKAGE=`echo "$(basename $0)" | sed -e 's/\.preinst$//'`; +PACKAGE=sendmail-doc; case "$1" in install) # DPKG doesn't overwrite directories with symlinks... - if [ -d @docdir@/sendmail-doc ]; then - rm -rf @docdir@/sendmail-doc; + if [ -d @docdir@/$PACKAGE ]; then + rm -rf @docdir@/$PACKAGE; fi; if [ ! -d @docdir@/sendmail ]; then mkdir -p @docdir@/sendmail; chmod a+rx @docdir@/sendmail; fi; - ln -sf sendmail @docdir@/sendmail-doc; + ln -sf sendmail @docdir@/$PACKAGE; ;; upgrade) # DPKG doesn't overwrite directories with symlinks... - if [ -d @docdir@/sendmail-doc ]; then - rm -rf @docdir@/sendmail-doc; + if [ -d @docdir@/$PACKAGE ]; then + rm -rf @docdir@/$PACKAGE; fi; if [ ! -d @docdir@/sendmail ]; then mkdir -p @docdir@/sendmail; chmod a+rx @docdir@/sendmail; fi; - ln -sf sendmail @docdir@/sendmail-doc; + ln -sf sendmail @docdir@/$PACKAGE; ;; abort-upgrade) diff --git a/debian/sendmail.cron.daily.in b/debian/build/debian/sendmail.cron.daily.in index 131f9a2..131f9a2 100644 --- a/debian/sendmail.cron.daily.in +++ b/debian/build/debian/sendmail.cron.daily.in diff --git a/debian/build/debian/sendmail.dirs.in b/debian/build/debian/sendmail.dirs.in new file mode 100644 index 0000000..4c335c8 --- /dev/null +++ b/debian/build/debian/sendmail.dirs.in @@ -0,0 +1,4 @@ +./DEBIAN +.@docdir@/sendmail +.@datadir@/bug +.@datadir@/lintian/overrides diff --git a/debian/build/debian/sendmail.init.d.in b/debian/build/debian/sendmail.init.d.in new file mode 100644 index 0000000..060643f --- /dev/null +++ b/debian/build/debian/sendmail.init.d.in @@ -0,0 +1,19 @@ +#!/bin/sh -e +# +# $Sendmail: init.d,v @sm_version@ @sm_date@ @sm_time@ cowboy Exp $ +# +# Sendmail rc script for Debian (/etc/init.d/sendmail) +# all the work is done by the imbedded copy of /usr/share/sendmail/sendmail +# +# Copyright (c) 2001-@SM_CPYRT@, Richard Nelson <cowboy@debian.org>. +# +# Notes (to all): +# * *** Do not edit this file *** Instead edit /etc/mail/sendmail.conf +# +# Notes (to self): +# * +# +set -e; +PATH=/bin:/usr/bin:/sbin:/usr/sbin; + + diff --git a/debian/build/debian/sensible-mda.dirs.in b/debian/build/debian/sensible-mda.dirs.in new file mode 100644 index 0000000..d6661b4 --- /dev/null +++ b/debian/build/debian/sensible-mda.dirs.in @@ -0,0 +1,6 @@ +./DEBIAN +.@sbindir@ +.@mandir@ +.@mandir@/man8 +.@datadir@/bug +.@datadir@/lintian/overrides diff --git a/debian/build/debian/sensible-mda.lintian-overrides b/debian/build/debian/sensible-mda.lintian-overrides new file mode 100644 index 0000000..cc2becf --- /dev/null +++ b/debian/build/debian/sensible-mda.lintian-overrides @@ -0,0 +1,2 @@ +sensible-mda: setuid-binary usr/sbin/sensible-mda 4755 root/root +sensible-mda: description-synopsis-starts-with-a-capital-letter diff --git a/debian/build/debian/sensible-mda.postrm.in b/debian/build/debian/sensible-mda.postrm.in new file mode 100644 index 0000000..b447bfd --- /dev/null +++ b/debian/build/debian/sensible-mda.postrm.in @@ -0,0 +1,53 @@ +#!/bin/sh -e +# +# Debian post removal script +# +# Install of already installed package: +# 1) Upgrade of package: +# new-preinst upgrade old-version +# *) new-postrm abort-upgrade old-version +# 2) package had some configuration files from a previous version installed +# new-preinst install old-version +# *) new-postrm abort-install old-version +# 3) Otherwise (i.e., the package was completely purged) +# new-preinst install +# *) new-postrm abort-install +# +# Removal of a package: +# 1) prerm remove +# 2) The package's files are removed (except conffiles). +# 3) postrm remove +# 4) All the maintainer scripts except the postrm are removed. +# 5) The conffiles and any backup files +# (~-files, #*# files, %-files, .dpkg-{old,new,tmp}, etc.) are removed. +# 6) postrm purge +# 7) The package's file list is removed +# +set -e; + +PACKAGE=sensible-mda; + +case "$1" in + remove) + # /usr/share/doc/$PACKAGE is a symlink to /usr/share/doc/sendmail + rm -f @docdir@/$PACKAGE 2>/dev/null || true; + rmdir @docdir@/sendmail 2>/dev/null || true; + ;; + + purge) + ;; + + upgrade) + ;; + + failed-upgrade|abort-install|abort-upgrade|disappear) + ;; + + *) + echo "$PACKAGE postrm called with unknown argument \`$1'" >&2; + exit 1; + ;; + esac; + +#DEBHELPER# +exit 0; diff --git a/debian/build/debian/sensible-mda.preinst.in b/debian/build/debian/sensible-mda.preinst.in new file mode 100644 index 0000000..e54cd20 --- /dev/null +++ b/debian/build/debian/sensible-mda.preinst.in @@ -0,0 +1,55 @@ +#!/bin/sh -e +# +# Debian pre install script +# +# Install of already installed package: +# 1) Upgrade of package: +# new-preinst upgrade old-version +# *) new-postrm abort-upgrade old-version +# 2) package had some configuration files from a previous version installed +# new-preinst install old-version +# *) new-postrm abort-install old-version +# 3) Otherwise (i.e., the package was completely purged) +# new-preinst install +# *) new-postrm abort-install +# +set -e; + +PACKAGE=sensible-mda; + +case "$1" in + install) + # DPKG doesn't overwrite directories with symlinks... + if [ -d @docdir@/$PACKAGE ]; then + rm -rf @docdir@/$PACKAGE; + fi; + if [ ! -d @docdir@/sendmail ]; then + mkdir -p @docdir@/sendmail; + chmod a+rx @docdir@/sendmail; + fi; + ln -sf sendmail @docdir@/$PACKAGE; + ;; + + upgrade) + # DPKG doesn't overwrite directories with symlinks... + if [ -d @docdir@/$PACKAGE ]; then + rm -rf @docdir@/$PACKAGE; + fi; + if [ ! -d @docdir@/sendmail ]; then + mkdir -p @docdir@/sendmail; + chmod a+rx @docdir@/sendmail; + fi; + ln -sf sendmail @docdir@/$PACKAGE; + ;; + + abort-upgrade) + ;; + + *) + echo "$PACKAGE preinst called with unknown argument \`$1'" >&2; + exit 1; + ;; + esac; + +#DEBHELPER# +exit 0; diff --git a/debian/build/depcomp b/debian/build/depcomp new file mode 100644 index 0000000..51606f8 --- /dev/null +++ b/debian/build/depcomp @@ -0,0 +1,464 @@ +#! /bin/sh + +# depcomp - compile a program generating dependencies as side-effects +# Copyright 1999, 2000 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi +# `libtool' can also be set to `yes' or `no'. + +if test -z "$depfile"; then + base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'` + dir=`echo "$object" | sed 's,/.*$,/,'` + if test "$dir" = "$object"; then + dir= + fi + # FIXME: should be _deps on DOS. + depfile="$dir.deps/$base" +fi + +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. + "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> $depfile + echo >> $depfile + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> $depfile + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. This file always lives in the current directory. + # Also, the AIX compiler puts `$object:' at the start of each line; + # $object doesn't have directory information. + stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'` + tmpdepfile="$stripped.u" + outname="$stripped.o" + if test "$libtool" = yes; then + "$@" -Wc,-M + else + "$@" -M + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + + if test -f "$tmpdepfile"; then + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" + sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Must come before tru64. + + # Intel's C compiler understands `-MD -MF file'. However + # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want: + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + sed -e "s,^[^:]*: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in `foo.d' instead, so we check for that too. + # Subdirectories are respected. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + tmpdepfile1="$dir.libs/$base.lo.d" + tmpdepfile2="$dir.libs/$base.d" + "$@" -Wc,-MD + else + tmpdepfile1="$dir$base.o.d" + tmpdepfile2="$dir$base.d" + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + if test -f "$tmpdepfile1"; then + tmpdepfile="$tmpdepfile1" + else + tmpdepfile="$tmpdepfile2" + fi + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a space and a tab in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the proprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for `:' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + "$@" $dashmflag | + sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no + for arg in "$@"; do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix="`echo $object | sed 's/^.*\././'`" + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the proprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the proprocessed file to stdout, regardless of -o, + # because we must use -o when running libtool. + "$@" || exit $? + IFS=" " + for arg + do + case "$arg" in + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 diff --git a/debian/build/install-sh b/debian/build/install-sh index b41a245..0ec27bc 100644 --- a/debian/build/install-sh +++ b/debian/build/install-sh @@ -1,19 +1,37 @@ #!/bin/sh # # install - install a program, script, or datafile -# This comes from X11R5 (mit/util/scripts/install.sh). # -# Copyright 1991 by the Massachusetts Institute of Technology +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. # -# Permission to use, copy, modify, distribute, and sell this software and its -# documentation for any purpose is hereby granted without fee, provided that -# the above copyright notice appear in all copies and that both that -# copyright notice and this permission notice appear in supporting -# documentation, and that the name of M.I.T. not be used in advertising or -# publicity pertaining to distribution of the software without specific, -# written prior permission. M.I.T. makes no representations about the -# suitability of this software for any purpose. It is provided "as is" -# without express or implied warranty. +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it @@ -56,7 +74,7 @@ dir_arg="" while [ x"$1" != x ]; do case $1 in - -c) instcmd="$cpprog" + -c) instcmd=$cpprog shift continue;; @@ -79,7 +97,7 @@ while [ x"$1" != x ]; do shift continue;; - -s) stripcmd="$stripprog" + -s) stripcmd=$stripprog shift continue;; @@ -106,17 +124,17 @@ done if [ x"$src" = x ] then - echo "install: no input file specified" + echo "$0: no input file specified" >&2 exit 1 else - true + : fi if [ x"$dir_arg" != x ]; then dst=$src src="" - - if [ -d $dst ]; then + + if [ -d "$dst" ]; then instcmd=: chmodcmd="" else @@ -125,38 +143,38 @@ if [ x"$dir_arg" != x ]; then else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command -# might cause directories to be created, which would be especially bad +# might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. - if [ -f $src -o -d $src ] + if [ -f "$src" ] || [ -d "$src" ] then - true + : else - echo "install: $src does not exist" + echo "$0: $src does not exist" >&2 exit 1 fi - + if [ x"$dst" = x ] then - echo "install: no destination specified" + echo "$0: no destination specified" >&2 exit 1 else - true + : fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic - if [ -d $dst ] + if [ -d "$dst" ] then - dst="$dst"/`basename $src` + dst=$dst/`basename "$src"` else - true + : fi fi ## this sed command emulates the dirname command -dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` +dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script @@ -165,69 +183,73 @@ dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` if [ ! -d "$dstdir" ]; then defaultIFS=' ' -IFS="${IFS-${defaultIFS}}" +IFS="${IFS-$defaultIFS}" -oIFS="${IFS}" +oIFS=$IFS # Some sh's can't handle IFS=/ for some reason. IFS='%' -set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` -IFS="${oIFS}" +set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS=$oIFS pathcomp='' while [ $# -ne 0 ] ; do - pathcomp="${pathcomp}${1}" + pathcomp=$pathcomp$1 shift - if [ ! -d "${pathcomp}" ] ; + if [ ! -d "$pathcomp" ] ; then - $mkdirprog "${pathcomp}" + $mkdirprog "$pathcomp" else - true + : fi - pathcomp="${pathcomp}/" + pathcomp=$pathcomp/ done fi if [ x"$dir_arg" != x ] then - $doit $instcmd $dst && + $doit $instcmd "$dst" && - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi + if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi else # If we're going to rename the final executable, determine the name now. - if [ x"$transformarg" = x ] + if [ x"$transformarg" = x ] then - dstfile=`basename $dst` + dstfile=`basename "$dst"` else - dstfile=`basename $dst $transformbasename | + dstfile=`basename "$dst" $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename - if [ x"$dstfile" = x ] + if [ x"$dstfile" = x ] then - dstfile=`basename $dst` + dstfile=`basename "$dst"` else - true + : fi -# Make a temp file name in the proper directory. +# Make a couple of temp file names in the proper directory. dsttmp=$dstdir/#inst.$$# + rmtmp=$dstdir/#rm.$$# -# Move or copy the file name to the temp name +# Trap to clean up temp files at exit. - $doit $instcmd $src $dsttmp && + trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 + trap '(exit $?); exit' 1 2 13 15 - trap "rm -f ${dsttmp}" 0 && +# Move or copy the file name to the temp name + + $doit $instcmd "$src" "$dsttmp" && # and set any options; do chmod last to preserve setuid bits @@ -235,17 +257,38 @@ else # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi && + +# Now remove or move aside any old file at destination location. We try this +# two ways since rm can't unlink itself on some systems and the destination +# file might be busy for other reasons. In this case, the final cleanup +# might fail but the new file should still install successfully. + +{ + if [ -f "$dstdir/$dstfile" ] + then + $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null || + $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null || + { + echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 + (exit 1); exit + } + else + : + fi +} && # Now rename the file to the real destination. - $doit $rmcmd -f $dstdir/$dstfile && - $doit $mvcmd $dsttmp $dstdir/$dstfile + $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" fi && +# The final little trick to "correctly" pass the exit status to the exit trap. -exit 0 +{ + (exit 0); exit +} diff --git a/debian/build/missing b/debian/build/missing new file mode 100644 index 0000000..6a37006 --- /dev/null +++ b/debian/build/missing @@ -0,0 +1,336 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. +# Copyright (C) 1996, 1997, 1999, 2000, 2002 Free Software Foundation, Inc. +# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +case "$1" in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case "$1" in + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch]" + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing 0.4 - GNU automake" + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + + aclocal*) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case "$f" in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is needed, and you do not seem to have it handy on your + system. You might have modified some files without having the + proper tools for further handling them. + You can get \`$1Help2man' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` + test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if [ ! -f y.tab.h ]; then + echo >y.tab.h + fi + if [ ! -f y.tab.c ]; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if [ ! -f lex.yy.c ]; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` + fi + if [ -f "$file" ]; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit 1 + fi + ;; + + makeinfo) + if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then + # We have makeinfo, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` + fi + touch $file + ;; + + tar) + shift + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + fi + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case "$firstarg" in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case "$firstarg" in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and you do not seem to have it handy on your + system. You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequirements for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 diff --git a/debian/build/mkinstalldirs b/debian/build/mkinstalldirs new file mode 100644 index 0000000..d2d5f21 --- /dev/null +++ b/debian/build/mkinstalldirs @@ -0,0 +1,111 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman <friedman@prep.ai.mit.edu> +# Created: 1993-05-16 +# Public domain + +errstatus=0 +dirmode="" + +usage="\ +Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." + +# process command line arguments +while test $# -gt 0 ; do + case $1 in + -h | --help | --h*) # -h for help + echo "$usage" 1>&2 + exit 0 + ;; + -m) # -m PERM arg + shift + test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } + dirmode=$1 + shift + ;; + --) # stop option processing + shift + break + ;; + -*) # unknown option + echo "$usage" 1>&2 + exit 1 + ;; + *) # first non-opt arg + break + ;; + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in + 0) exit 0 ;; +esac + +case $dirmode in + '') + if mkdir -p -- . 2>/dev/null; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + fi + ;; + *) + if mkdir -m "$dirmode" -p -- . 2>/dev/null; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + fi + ;; +esac + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case $pathcomp in + -*) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + lasterr="" + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# End: +# mkinstalldirs ends here diff --git a/debian/build/rules.hdr b/debian/build/rules.hdr new file mode 100644 index 0000000..b62ae36 --- /dev/null +++ b/debian/build/rules.hdr @@ -0,0 +1,64 @@ +#!/usr/bin/make -f +#------------------------------------------------------------------------------ +# vim: syntax=make +# +# $Sendmail: rules,v @sm_version@ @sm_date@ @sm_time@ cowboy Exp $ +# +# Copyright (c) 1998-@SM_CPYRT@ Richard Nelson. All Rights Reserved. +# +# @configure_input@ +# +# Rules file for Sendmail @sm_version@@sm_revision@(@sm_version_math@) +# on @sm_dist_name@ @sm_dist_vers@ +# via Debhelper V@DEBIAN_DH@ +# +# Note: the .in file supports Sendmail @SM_MINVERS@ - @SM_MAXVERS@ +# on Debian slink, potato, woody, testing, sid, ... +# but the generated file is customized to the version noted above. +# +# The only thing to watch for is to make sure the changelog correctly +# reflects the appropriate version and distribution! +# +# To support private builds: +# 1) use the environment variables (defaults shown first): +# CC=gcc|gcc-3.0..........-- choose compiler +# CFLAGS='-O2 -Wall [-g]'.-- choose compile options +# DEFINES=''..............-- additional -Dxxx +# SM_CONF_OPT=''..........-- additional configure options +# SM_BUILD_OPT=''.........-- additional build options +# 2) Build the package using your normal setup: +# A) [fakeroot] debian/rules binary +# B) debuild -rfakeroot +# C) dpkg-buildpackage -rfakeroot -uc -us +# +# DEB_BUILD_OPTIONS (global Debian package build options) +# Debian specific, and common across package options +# noopt - Do *NOT* compile with optimization (force -O0) +# nostrip - Do *NOT* strip binaries (for debugging) +# +# +# SM_CONF_OPT +# Additional configure options and/or overrides may be specified thusly: +# 1) export SM_CONF_OPT='--enable-shm=no' +# dpkg-buildpackage -rfakeroot -uc -us +# 2) SM_CONF_OPT='--enable-shm=no' dpkg-buildpackage +# 3) debuild -e SM_CONF_OPT='--enable-shm=no' +# etc... +# +# SM_BUILD_OPT +# 1) export SM_BUILD_OPT='notls' +# dpkg-buildpackage -rfakeroot -uc -us +# 2) SM_BUILD_OPT='notls' dpkg-buildpackage -rfakeroot -uc -us +# 3) debuild -e SM_BUILD_OPT='notls' -e CLFAGS='-O3 Wall' +# etc... +# +# Supported options values for SM_BUILD_OPT: +# notls Disable STARTTLS (OpenSSL) support +# noauth Disable SMTP AUTH (sasl) support +# nodev Disable generation of libmilter-dev package +# nodoc Disable generation of sendmail-doc package +# +# This make file uses scripts from the DBS (0.8) package! +# +# Richard Nelson <cowboy@debian.org> @sm_date@ @sm_time@ (@sm_utc@) +#------------------------------------------------------------------------------ diff --git a/debian/build/rules.in b/debian/build/rules.in deleted file mode 100644 index 8ee3f6a..0000000 --- a/debian/build/rules.in +++ /dev/null @@ -1,1189 +0,0 @@ -#!/usr/bin/make -f -#------------------------------------------------------------------------------ -# vim: syntax=make -# -# $Sendmail: rules,v @sm_version@ @sm_date@ @sm_time@ cowboy Exp $ -# -# Copyright (c) 1998-@SM_CPYRT@ Richard Nelson. All Rights Reserved. -# -# @configure_input@ -# -# Rules file for Sendmail @sm_version@@sm_revision@(@sm_version_math@) -# on @sm_dist_name@ @sm_dist_vers@ -# via Debhelper V@DEBIAN_DH@ -# -# Note: the .in file supports Sendmail @SM_MINVERS@ - @SM_MAXVERS@ -# on Debian slink, potato, woody, testing, sid, ... -# but the generated file is customized to the version noted above. -# -# The only thing to watch for is to make sure the changelog correctly -# reflects the appropriate version and distribution! -# -# To support private builds: -# 1) use the environment variables (defaults shown first): -# CC=gcc|gcc-3.0..........-- choose compiler -# CFLAGS='-O2 -Wall [-g]'.-- choose compile options -# DEFINES=''..............-- additional -Dxxx -# SM_CONF_OPT=''..........-- additional configure options -# SM_BUILD_OPT=''.........-- additional build options -# 2) Build the package using your normal setup: -# A) [fakeroot] debian/rules binary -# B) debuild -rfakeroot -# C) dpkg-buildpackage -rfakeroot -uc -us -# -# DEB_BUILD_OPTIONS (global Debian package build options) -# Debian specific, and common across package options -# noopt - Do *NOT* compile with optimization (force -O0) -# nostrip - Do *NOT* strip binaries (for debugging) -# -# -# SM_CONF_OPT -# Additional configure options and/or overrides may be specified thusly: -# 1) export SM_CONF_OPT='--enable-shm=no' -# dpkg-buildpackage -rfakeroot -uc -us -# 2) SM_CONF_OPT='--enable-shm=no' dpkg-buildpackage -# 3) debuild -e SM_CONF_OPT='--enable-shm=no' -# etc... -# -# SM_BUILD_OPT -# 1) export SM_BUILD_OPT='notls' -# dpkg-buildpackage -rfakeroot -uc -us -# 2) SM_BUILD_OPT='notls' dpkg-buildpackage -rfakeroot -uc -us -# 3) debuild -e SM_BUILD_OPT='notls' -e CLFAGS='-O3 Wall' -# etc... -# -# Supported options values for SM_BUILD_OPT: -# notls Disable STARTTLS (OpenSSL) support -# noauth Disable SMTP AUTH (sasl) support -# nodev Disable generation of libmilter-dev package -# nodoc Disable generation of sendmail-doc package -# -# This make file uses scripts from the DBS (0.8) package! -# -# Richard Nelson <cowboy@debian.org> @sm_date@ @sm_time@ (@sm_utc@) -#------------------------------------------------------------------------------ -#SHELL := /bin/sh -x - -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - -# This is the debhelper compatibility version to use. (we'll set it later) -#export DH_COMPAT=4 - -# This has to be exported to make some magic below work. -export DH_OPTIONS - -# Support separate debian directory -ifeq (yes, $(shell test -d debian && echo 'yes')) - debian_dir := debian - pwd_dir := ${PWD} -else - debian_dir := . - pwd_dir := ${PWD}/.. - endif - -# Determine build,host architectures (via dpkg-architecture) -ifeq (, ${DEB_BUILD_ARCH}) - ifeq (yes, $(shell test -x /usr/bin/dpkg-architecture && echo 'yes')) - include ${debian_dir}/scripts/dpkg-arch.mk - endif - endif - -# Check for cross-compilation -ifneq ($(DEB_BUILD_GNU_TYPE),$(DEB_HOST_GNU_TYPE)) - ifneq (, $(DEB_BUILD_GNU_TYPE)) - endif - endif - -# will want path info for some things... Like patches/changelogs... -pwd_string := $(shell expr "${pwd_dir}" : '.*-\([0-9.].*\)') -ifeq (, $(findstring +,${pwd_string})) - pwd_version := ${pwd_string} -else - pwd_version := $(shell expr "${pwd_string}" : '.*+\([0-9.].*\)') - endif -pwd_major := $(shell expr "${pwd_version}" : '\([0-9]*\.[0-9]*\)') - -# get package/version information from the changelog -package := $(shell (cd ${debian_dir}/.. && \ - dpkg-parsechangelog 2>/dev/null) | awk '/^Source:/ {print $$2}') -version_string := $(shell (cd ${debian_dir}/.. && \ - dpkg-parsechangelog 2>/dev/null) | awk '/^Version:/ {print $$2}') -version_full := $(shell expr "${version_string}" : '\([^-]*\)') -version_debian := $(shell expr "${version_string}" : '[^-]*\(-.*\)') -version := ${version_full} -version_major := $(shell expr "${version_full}" : '\([0-9]*\.[0-9]*\)') -version_minor := $(shell expr "${version_full}" : '[0-9]*\.[0-9]*\.\(.*\)') -ifneq (, $(findstring +,${version_minor})) - beta_version := $(shell expr "${version_full}" : '.*+\([0-9.].*\)') - beta_major := $(shell expr "${beta_version}" : '\([0-9]*\.[0-9]*\)') - beta_minor := $(shell expr "${beta_version}" : '[0-9]*\.[0-9]*\.\(.*\)') - ifneq (, $(beta_version)) - version := ${beta_version} - version_major := ${beta_major} - version_minor := ${beta_minor} - endif - endif - -# Many things depend upon which release (slink, potato, woody, etc.) -PKG_DIR := ${debian_dir}/${package} -DATA_DIR := /usr/share -ifeq (v4, $(shell (cd ${debian_dir}/.. && dh_testversion 4.0.0 2>/dev/null && echo 'v4'))) - DH_COMPAT := 4 -else - ifeq (v3, $(shell (cd ${debian_dir}/.. && dh_testversion 3.0.0 2>/dev/null && echo 'v3'))) - DH_COMPAT := 3 - else - ifeq (v2, $(shell (cd ${debian_dir}/.. && dh_testversion 2.0.40 2>/dev/null && echo 'v2'))) - DH_COMPAT := 2 - else - DH_COMPAT := 1 - PKG_DIR := ${debian_dir}/tmp - DATA_DIR := /usr - endif - endif - endif -export DH_COMPAT - -# the dbs rules -TAR_DIR := ${package}-${version} -# Handle the case where the changelog is newer that what we're building -ifneq (yes, $(shell test -e ${debian_dir}/../${TAR_DIR}.tar.gz && echo 'yes')) - TAR_DIR := ${package}-${pwd_version} - endif -SOURCE_DIR := build-tree -BUILD_TREE := ${SOURCE_DIR}/${TAR_DIR} -PATCH_DIR := ${debian_dir}/patches/${version_major}/${version} -SCRIPT_DIR := ${debian_dir}/scripts -STAMP_DIR := ${debian_dir}/build/stampdir - -# Include Debian Autoconf settings -ifeq (yes, $(shell test -e ${debian_dir}/build/autoconf.mk && echo 'yes')) - include ${debian_dir}/build/autoconf.mk -else - include ${debian_dir}/build/autoconf.mk.in - endif - -# these are strictly for my own consuption -PKG_DOC := ${debian_dir}/${package}-doc${docdir}/${package}-doc -MAKE_SUBDIRS := examples local sensible_mda -PACKAGES := sendmail sendmail-doc libmilter-dev -SM_SUBDIRS := editmap libmilter mail.local mailstats \ - makemap praliases rmail sendmail smrsh vacation -# -# We want delayed interpretation of the options ! -ifeq (yes, $(shell test -x /usr/bin/debuild && echo 'yes')) - DEB_BUILD = \ - SM_CONF_OPT="${SM_CONF_OPT}" \ - SM_BUILD_OPT="${SM_BUILD_OPT}" \ - DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS}" \ - debuild -e SM_CONF_OPT -e SM_BUILD_OPT -else - DEB_BUILD = \ - SM_CONF_OPT="${SM_CONF_OPT}" \ - SM_BUILD_OPT="${SM_BUILD_OPT}" \ - DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS}" \ - dpkg-buildpackage - endif - -# Process build-time options: -# 1) options from SM_BUILD_OPT (Prior to configure) -# 2) defaults (Prior to configure) -ENABLE_INDEP := yes -ENABLE_ARCH := yes -ENABLE_LIB := no -ENABLE_BIN := yes -ifneq (, $(findstring notls,${SM_BUILD_OPT})) - ENABLE_TLS := no -else - ENABLE_TLS := yes - endif -ifneq (, $(findstring noauth,${SM_BUILD_OPT})) - ENABLE_AUTH := no -else - ENABLE_AUTH := yes - endif -ifneq (, $(findstring nodev,${SM_BUILD_OPT})) - ENABLE_DEV := no -else - ENABLE_DEV := yes - endif -ifneq (, $(findstring nodoc,${SM_BUILD_OPT})) - ENABLE_DOC := no -else - ENABLE_DOC := yes - endif -# -# Summarize above options into -INDEP and -ARCH for this Makefile -ENABLE_INDEP := ${ENABLE_DOC} -ifeq (no, ${ENABLE_BIN}) - ifeq (no, ${ENABLE_LIB}) - ifeq (no, ${ENABLE_DEV}) - ENABLE_ARCH := no - endif - endif - endif - -all: - @echo 'Please specify a real target in the future...'; - $(MAKE) -f ${debian_dir}/rules \ - version_string=${pwd_string} \ - SM_CONF_OPT="${SM_CONF_OPT}" SM_BUILD_OPT="${SM_BUILD_OPT}" \ - DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS}" \ - binary; - - -#------------------------------------------------------------------------------ -# Rules to maintain the external Debian directory -#------------------------------------------------------------------------------ -#------------- -refresh-dbs: - @echo 'updating debian/scripts directory...'; - cp -af /usr/share/dbs/* ${SCRIPT_DIR}/; - chmod a-w ${SCRIPT_DIR}/*; - -#------------- -refresh-debian: - @dh_testdir; - @echo 'updating debian directory ...'; - sudo $(RM) -r debian; - cp -a ../debian ./; - sudo $(RM) -r ${SOURCE_DIR} ${STAMP_DIR}; - rm -f ${debian_dir}/config.status; - touch ${debian_dir}/rules; - $(MAKE) -f ${debian_dir}/rules \ - version_string=${pwd_string} \ - SM_CONF_OPT="${SM_CONF_OPT}" SM_BUILD_OPT="${SM_BUILD_OPT}" \ - DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS}" \ - debian-setup; - -debian-setup: - # Force a configure here, using $${PWD} so the changelog, etc. - # wind up with the right version numbers - rm -f ${debian_dir}/configure ${debian_dir}/config.status; - rm -f ${debian_dir}/build/autoconf.mk; - $(MAKE) -f ${debian_dir}/rules \ - version_string=${pwd_string} \ - SM_CONF_OPT="${SM_CONF_OPT}" SM_BUILD_OPT="${SM_BUILD_OPT}" \ - DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS}" \ - configure; - $(MAKE) -f ${debian_dir}/rules clean-debian; - - # Remove pieces not needed for further building - find ${debian_dir}/patches -type d -a ! -name 'patches' \ - -a ! -name 'contrib' \ - -a ! -name "${pwd_major}" \ - -a ! -name "${pwd_version}" \ - | xargs -r $(RM) -r; - $(RM) -r ${debian_dir}/bugs ${debian_dir}/private ${debian_dir}/watch; - $(RM) ${debian_dir}/build/acinclude.m4 \ - ${debian_dir}/build/aclocal.m4 \ - ${debian_dir}/build/sendmail.m4 \ - ${debian_dir}/build/ndbm.m4 \ - ${debian_dir}/config.log ${debian_dir}/config.cache \ - ${debian_dir}/config.status \ - ${debian_dir}/build/config.guess ${debian_dir}/build/config.sub; - $(RM) -r ${debian_dir}/autom4te.cache; - # Fakeout Make to look like current - $(RM) ${debian_dir}/configure.ac; - echo `date` > ${debian_dir}/configure.ac; - touch ${debian_dir}/configure; - touch ${debian_dir}/rules; - - -#------------- -clean-debian: - @echo 'cleaning debian directory...'; - find ${debian_dir} -name '*~' -o -name '\.*\.swp' \ - | xargs -r rm; - $(RM) ${debian_dir}/*.sav; - $(RM) ${debian_dir}/config.log ${debian_dir}/config.cache \ - ${debian_dir}/config.status \ - ${debian_dir}/build/config.guess.sav \ - ${debian_dir}/build/config.sub.sav; - $(RM) -r ${debian_dir}/autom4te.cache; - # can't touch control/changelog/configure -- needed by debuild, etc - for file in $$(find ${debian_dir} -type f -name '*\.in' \ - -a ! -name 'configure.in'); do \ - $(RM) $$(echo "$$file" | sed -e 's/\.in$$//'); \ - done; - $(RM) ${STAMP_DIR}/autotools ${STAMP_DIR}/configure; - -#------------- -refresh-faq: - @echo 'Refreshing FAQ' - @chmod u+w ${debian_dir}/faq.txt; - (cd ${debian_dir} && wget --passive-ftp --timestamping \ - --cache=off http://www.sendmail.org/faq/faq.txt;); - @chmod a-w ${debian_dir}/faq.txt; - @echo 'Refreshing Misc' - @chmod u+w ${debian_dir}/cf/feature/rhsbl.m4; - (cd ${debian_dir}/cf/feature && wget --passive-ftp --timestamping \ - --cache=off http://www.rfc-ignorant.org/rhsbl.m4;); - @chmod u-w ${debian_dir}/cf/feature/rhsbl.m4; - - -#------------- -world: - # Debian build daemons don't (for the nonce) support build-indep, - # so this rule allows *me* to build both arch and indep portions - # of sendmail in one go (so I don't forget). - @dh_testdir; - $(MAKE) -f ${debian_dir}/rules info; - time ${DEB_BUILD} -rfakeroot - -test: - @dh_testdir; - $(MAKE) -f ${debian_dir}/rules clean-debian; - fakeroot $(MAKE) -f ${debian_dir}/rules clean; - $(MAKE) -f ${debian_dir}/rules \ - ENABLE_TLS=yes ENABLE_DEV=no ENABLE_DOC=no \ - CFLAGS='-O2 -Wall' DEB_BUILD_OPTIONS='nostrip' configure; - #time ${DEB_BUILD} -rfakeroot -d -us -uc; - time $(MAKE) -f ${debian_dir}/rules build-arch; - -print: - @dh_testdir; - -(cd ${BUILD_TREE}/.. && \ - for file in `find . -name 'README'`; do \ - lpr $$file; \ - done; ); - -(cd ${BUILD_TREE}/.. && \ - lpr */KNOWNBUGS; \ - lpr */RELEASE_NOTES; \ - lpr */sendmail/SECURITY; \ - lpr */sendmail/TUNING; \ - lpr */sendmail/TRACEFLAGS; \ - lpr */doc/op/op.ps; \ - lpr */cf/feature/nullclient.m4; \ - lpr */cf/feature/msp.m4; \ - ); - -(cd ${debian_dir} && \ - lpr ../../${debian_dir}/configure.ac; \ - lpr ../../${debian_dir}/build/rules.in; \ - lpr build/site.config.m4.in; \ - lpr cf/hack/msp_nullclient.m4; \ - ); - - -#------------------------------------------------------------------------------ -# Misc rules -#------------------------------------------------------------------------------ -#------------- -${STAMP_DIR}: - mkdir -p ${STAMP_DIR}; - - -#------------------------------------------------------------------------------ -# Autoconf rules -#------------------------------------------------------------------------------ -#------------- -${debian_dir}/rules: ${debian_dir}/build/rules.in ${debian_dir}/config.status - # *** *** *** configure changed ?!? *** *** *** - if [ -e ${debian_dir}/config.status ]; then \ - chmod ug+x ${debian_dir}/config.status; \ - (cd ${debian_dir} && ./config.status;); \ - fi; - -#------------- -${debian_dir}/config.status: ${debian_dir}/configure - # *** *** *** configure changed ?!? *** *** *** - if [ -e ${debian_dir}/config.status ]; then \ - chmod ug+x ${debian_dir}/config.status; \ - (cd ${debian_dir} && ./config.status --recheck;) \ - fi; - -#------------- -${debian_dir}/configure: ${debian_dir}/configure.ac - # *** *** *** configure.ac changed ?!? *** *** *** - cp -af ${debian_dir}/configure.ac \ - ${debian_dir}/configure.in; - (cd ${debian_dir} && autoconf;); - $(RM) ${debian_dir}/configure.in; - chmod ug+x ${debian_dir}/configure; - -#------------- -autotools: ${STAMP_DIR} ${STAMP_DIR}/autotools -${STAMP_DIR}/autotools: - - #Add here commands to setup the autotools environment - - # Make sure we have the latest available config.{guess,sub} - # Allow the package to override either by faking the date... - if [ -e /usr/share/misc/config.guess -a \ - -e ${debian_dir}/build/config.guess ]; then \ - OLDDATEGUESS=`${debian_dir}/build/config.guess -t | tr -d - `; \ - NEWDATEGUESS=`/usr/share/misc/config.guess -t | tr -d - `; \ - if [ "$$OLDDATEGUESS" -lt "$$NEWDATEGUESS" ]; then \ - if [ ! -e ${debian_dir}/build/config.guess.sav ]; then \ - cp -pf ${debian_dir}/build/config.guess \ - ${debian_dir}/build/config.guess.sav;\ - fi; \ - if [ -e ${debian_dir}/build/config.guess.sav ]; then \ - cp -pf /usr/share/misc/config.guess \ - ${debian_dir}/build/config.guess; \ - fi; \ - fi; \ - fi; - if [ -e /usr/share/misc/config.sub -a \ - -e ${debian_dir}/build/config.sub ]; then \ - OLDDATESUB=`${debian_dir}/build/config.sub -t | tr -d - `; \ - NEWDATESUB=`/usr/share/misc/config.sub -t | tr -d - `; \ - if [ "$$OLDDATESUB" -lt "$$NEWDATESUB" ]; then \ - if [ ! -e ${debian_dir}/build/config.sub.sav ]; then \ - cp -pf ${debian_dir}/build/config.sub \ - ${debian_dir}/build/config.sub.sav; \ - fi; \ - if [ -e ${debian_dir}/build/config.sub.sav ]; then \ - cp -pf /usr/share/misc/config.sub \ - ${debian_dir}/build/config.sub; \ - fi; \ - fi; \ - fi; - - touch ${STAMP_DIR}/autotools; - - - -#------------------------------------------------------------------------------ -# Build/Package check rules -#------------------------------------------------------------------------------ -#------------- -info: - - #-------------------------------------------------------------------- - # The following information will be used for this run: - # Source = ${package} ${pwd_string} - # Package = ${package} ${version_string} - # Version = ${version_major}.${version_minor}${version_debian} - # Arch = ${DEB_BUILD_ARCH} on ${DEB_HOST_ARCH} - # Options - # config opt = ${SM_CONF_OPT} - # build opt = ${SM_BUILD_OPT} - # ENABLE_TLS = ${ENABLE_TLS} - # ENABLUE_AUTH= ${ENABLE_AUTH} - # ENABLE_DEV = ${ENABLE_DEV} - # ENABLE_DOC = ${ENABLE_DOC} - # compile opt = ${CC} ${CFLAGS} ${DEFINES} - # DEB_BUILD_OPTIONS = ${DEB_BUILD_OPTIONS} - # DH_VERBOSE = ${DH_VERBOSE} - # DH_OPTIONS = ${DH_OPTIONS} - # DH_COMPAT = ${DH_COMPAT} - #-------------------------------------------------------------------- - -#------------- -buildinfo: - @echo ''; - @dpkg -l \ - debhelper \ - dpkg-dev \ - gcc \ - 'libc6*' \ - binutils \ - ldso \ - make \ - m4 \ - libdb3 libdb3-dev \ - libdb2 libdb2-dev \ - libwrap0 libwrap0-dev \ - libldap2 libldap2-dev \ - libopenldap1 libopenldap-dev \ - umich-libldap umich-libldap-dev \ - libsasl7 libsasl-dev \ - openssl libssl-dev 'libssl0*' \ - ${BUILD_INFO} \ - 2> /dev/null \ - | awk '$$1 == "ii" { printf("%s-%s\n", $$2, $$3) }' \ - | tee ${debian_dir}/${package}.buildinfo.Debian; - @echo ''; - @chmod 644 ${debian_dir}/${package}.buildinfo.Debian; - -#------------- -pristine: - @dh_testdir; - #$(MAKE) -f ${debian_dir}/rules info; - # - # Fail if there are any modifications to the original - # tarball, other than the debian directory - if [ -f ../${package}_${version_string}.diff.gz ]; then \ - zgrep -e "^\+\+\+ " ../${package}_${version_string}.diff.gz \ - | sed -e "/^\+\+\+ ${package}-${version}\/debian\/.*$$/d" - \ - | sed -e "/^+\+\+ ${package}-${version}\/upstream\/patches\/.*$$/d" - \ - | [ ! -z - ]; \ - fi; - - # Check for presence of TLS (crypto) enablement and bitch if found - @if (grep -qEe '^#TLS:[[:space:]]*yes' \ - ${debian_dir}/build/site.config.m4); then \ - echo '** ** --------------------------------------------------- ** **';\ - echo '** ** This package contains crypto support ! Be careful ! ** **';\ - echo '** ** --------------------------------------------------- ** **';\ - fi; - -#------------- -verify: - @dh_testdir; - # Verifying the md5 summs and signed files - @for file in $$(find . -maxdepth 1 -name '*.md5'); do \ - echo "Checking MD5 source: $$file."; \ - cat $$file; \ - md5sum -c $$file; \ - done; - @for file in $$(find . -maxdepth 1 -name '*.sig'); do \ - echo "Checking signature file $$file."; \ - part=$$(echo "$$file" | sed -e 's/\.sig$$//'); \ - if [ -f $$part ]; then \ - gpg --verify $$part.sig $$part || true; \ - elif [ -f $$part.gz ]; then \ - gunzip -c $$part.gz > $$part; \ - gpg --verify $$part.sig $$part || true; \ - rm $$part; \ - fi; \ - done; - - -#------------------------------------------------------------------------------ -# User callable rules -#------------------------------------------------------------------------------ -#------------- -clean: - dh_testdir; - dh_testroot; - - # Add here commands to clean up after the build process. - #-$(MAKE) clean; - #-$(MAKE) distclean; - - # First, remove any patches, and source directories - #$(MAKE) -f ${debian_dir}/sys-build.mk source.clean; - - # Debian stuff - $(RM) -r ${SOURCE_DIR} ${STAMP_DIR}; - $(RM) ${debian_dir}/*.buildinfo.Debian; - for file in tmp ${PACKAGES};do \ - $(RM) -r ${debian_dir}/$$file; \ - done; - - # Local stuff - for subdir in ${MAKE_SUBDIRS}; do \ - (cd ${debian_dir}/$$subdir && $(MAKE) -f Makefile.in clean;); \ - done; - -ifeq (3, $(shell test ${DH_COMPAT} -ge 3 && echo '3')) - # Debhelper V3 conffile handling - prevent duplicates - for file in $$(find ${debian_dir} -maxdepth 1 -type f \ - -name '*\.conffiles\.sav'); do \ - mv $$file $$(echo "$$file" | sed -e 's?\.sav$$??'); \ - done; -endif - - # can't touch control/changelog/configure -- needed by debuild, etc - $(RM) ${debian_dir}/config.log ${debian_dir}/config.cache \ - ${debian_dir}/config.status; - $(RM) -r ${debian_dir}/autom4te.cache - for file in $$(find ${debian_dir} -type f -name '*\.in' \ - -a ! -name 'configure.in'); do \ - $(RM) $$(echo "$$file" | sed -e 's/\.in$$//'); \ - done; - - # Restore pre-existing config.{guess,sub} - -if [ -e ${debian_dir}/buil/config.sub.sav ]; then \ - cp -pf ${debian_dir}/build/config.sub.sav \ - ${debian_dir}/build/config.sub \ - && $(RM) ${debian_dir}/build/config.sub.sav; \ - fi; - -if [ -e ${debian_dir}/build/config.guess.sav ]; then \ - cp -pf ${debian_dir}/build/config.guess.sav \ - ${debian_dir}/build/config.guess \ - && $(RM) ${debian_dir}/build/config.guess.sav; \ - fi; - - # Cleanup after build (for pristine source, smaller diffs) - #find .. -name ${package}*.asc -size 0 -maxdepth 1 -exec rm {} ';'; - dh_clean; - - -#------------- -setup: ${STAMP_DIR}/setup -${STAMP_DIR}/setup: - -# Support separate debian directory -ifeq (yes, $(shell test -d debian && echo 'yes')) - dh_testdir; - - # unpack and patch source - $(MAKE) -f ${SCRIPT_DIR}/dbs-build.mk \ - BUILD_TREE="${BUILD_TREE}" TAR_DIR="${TAR_DIR}" \ - STAMP_DIR="${STAMP_DIR}" PATCH_DIR="${PATCH_DIR}" \ - SCRIPT_DIR="${SCRIPT_DIR}" \ - ${STAMP_DIR}/unpack ${STAMP_DIR}/patch; - - touch ${STAMP_DIR}/setup; -endif - - -#------------- -configure: ${STAMP_DIR}/configure -${STAMP_DIR}/configure: ${STAMP_DIR}/setup ${STAMP_DIR}/autotools - - $(MAKE) -f ${debian_dir}/rules info; - - #Add here commands to configure the package. - #./configure --prefix=/usr - - # Use autoconf to handle varying degrees of library support - # NOTE: options values are Yes/No/Auto, but auto isn't always - # used herein, as it can cause problems to be ignored - # so it is only used on items of lesser importance - chmod ug+x ${debian_dir}/configure; - (cd ${debian_dir} && \ - ./configure \ - --build=${DEB_BUILD_GNU_TYPE} \ - --host=${DEB_HOST_GNU_TYPE} \ - --prefix=/usr \ - --libexecdir=/usr/lib/sm.bin \ - --datadir=${DATA_DIR} \ - --sysconfdir=/etc \ - --localstatedir=/var \ - --infodir=${DATA_DIR}/info \ - --mandir=${DATA_DIR}/man \ - --srcdir=${pwd_dir}/debian \ - --with-buildtree=${BUILD_TREE} \ - --with-docdir=${DATA_DIR}/doc \ - --with-revision=${version_debian} \ - --enable-regex=auto \ - --enable-ndbm=no \ - --enable-newdb=yes \ - --enable-nis=auto \ - --enable-nisplus=auto \ - --enable-ldap=yes \ - --enable-hesiod=no \ - --enable-tcpd=auto \ - --enable-bind=no \ - --enable-ipv6=auto \ - --enable-maillock=yes \ - --enable-auth=${ENABLE_AUTH} \ - --enable-tls=${ENABLE_TLS} \ - --enable-shm=auto \ - --enable-doc=${ENABLE_DOC} \ - --enable-dev=${ENABLE_DEV} \ - ${SM_CONF_OPT} \ - ;); - # CC="${CC}" CFLAGS="${CFLAGS} - -ifeq (3, $(shell test ${DH_COMPAT} -ge 3 && echo '3')) - # Debhelper V3 conffile handling - prevent duplicates - for file in $$(find ${debian_dir} -maxdepth 1 -type f \ - -name '*.conffiles'); do \ - mv $$file $$file.sav; \ - done; -endif - - touch ${STAMP_DIR}/configure; - - -#------------- -build-indep: ${STAMP_DIR}/build-indep -${STAMP_DIR}/build-indep: ${STAMP_DIR}/configure - -# Skip work if nothing to do... -ifeq (yes, ${ENABLE_INDEP}) - dh_testdir; - - # Document what we're building against - $(MAKE) -f ${debian_dir}/rules buildinfo; - - # Add here commands to build/compile the documentation/package. - #$(MAKE) doc; - - # Only valid on newer (8.11+) Sendmails - #(cd ${BUILD_TREE}/doc/op/ && make op.txt); - # So we'll do it by hand... - $(RM) ${BUILD_TREE}/doc/op/op.txt; - pic -C ${BUILD_TREE}/doc/op/op.me | eqn -C -Tascii \ - | GROFF_NO_SGR=1 groff -Tascii -me | ul -t dumb > ${BUILD_TREE}/doc/op/op.txt; - - # Debian stuff - for subdir in ${MAKE_SUBDIRS}; do \ - (cd ${debian_dir}/$$subdir && $(MAKE) build-indep;); \ - done; -endif - - touch ${STAMP_DIR}/build-indep; - - -#------------- -build-arch: ${STAMP_DIR}/build-arch -${STAMP_DIR}/build-arch: ${STAMP_DIR}/configure - -# Skip work if nothing to do... -ifeq (yes, ${ENABLE_ARCH}) - dh_testdir; - - # Document what we're building against - $(MAKE) -f ${debian_dir}/rules buildinfo; - - # Add here commands to compile the package. - #$(MAKE); - - # Place our m4 configuration files for the sendmail build to use - if [ -d ${BUILD_TREE}/devtools/Site ]; then \ - cp -f ${debian_dir}/build/site.config.m4 ${BUILD_TREE}/devtools/Site/; \ - fi; - - # Correct some paths in upstream man pages - sed -e "s?/usr/adm/sm.bin?${sysconfdir}/mail/smrsh?g" \ - -e "s?sm.bin?${sysconfdir}/mail/smrsh?g" \ - ${BUILD_TREE}/smrsh/smrsh.8 \ - > ${BUILD_TREE}/smrsh/smrsh.8.new; - mv ${BUILD_TREE}/smrsh/smrsh.8.new ${BUILD_TREE}/smrsh/smrsh.8; - sed -e "s?/etc/mail/statistics?${localstatedir}/lib/sendmail/sendmail.st?g"\ - ${BUILD_TREE}/sendmail/sendmail.8 \ - > ${BUILD_TREE}/sendmail/sendmail.8.new; - mv ${BUILD_TREE}/sendmail/sendmail.8.new \ - ${BUILD_TREE}/sendmail/sendmail.8; - - # Finally, build the whole enchilada (we'll let sendmail figure - # which, if any of the dependant libraries each component needs) - for subdir in ${SM_SUBDIRS}; do \ - if [ -d ${BUILD_TREE}/$${subdir} ]; then \ - (cd ${BUILD_TREE}/$${subdir} && ./Build -S;); \ - fi; \ - done; - - # Remove our config m4 files - $(RM) ${BUILD_TREE}/devtools/Site/site.config.m4; - - # Debian stuff - for subdir in ${MAKE_SUBDIRS}; do \ - (cd ${debian_dir}/$$subdir && $(MAKE) build-arch;); \ - done; -endif - - touch ${STAMP_DIR}/build-arch; - - -#------------- -install-indep: ${STAMP_DIR}/install-indep -${STAMP_DIR}/install-indep: DH_OPTIONS=-i -${STAMP_DIR}/install-indep: ${STAMP_DIR}/build-indep - -# Skip work if nothing to do... -ifeq (yes, ${ENABLE_INDEP}) - dh_testdir; - dh_testroot; - dh_clean -k; - dh_installdirs; - if [ -x /usr/bin/dh_link ]; then dh_link; fi; - - # Add here commands to install the documentation/package. - #$(MAKE) prefix=`pwd`/${PKG_DIR}/usr install; - - # sendmail operations guide and other documentation - $(INSTALL_DATA) ${BUILD_TREE}/doc/op/op.ps ${PKG_DOC}/op; - $(INSTALL_DATA) ${BUILD_TREE}/doc/op/op.txt ${PKG_DOC}/op; - $(INSTALL_DATA) ${BUILD_TREE}/README ${PKG_DOC}/; - $(INSTALL_DATA) ${BUILD_TREE}/KNOWNBUGS ${PKG_DOC}/; - $(INSTALL_DATA) ${BUILD_TREE}/cf/README ${PKG_DOC}/cf.README; - $(INSTALL_DATA) debian/README.Debian.sendmail \ - ${PKG_DOC}/sendmail/README.Debian; - $(INSTALL_DATA) ${BUILD_TREE}/sendmail/README \ - ${PKG_DOC}/sendmail/; - if [ -f ${BUILD_TREE}/sendmail/SECURITY ]; then \ - $(INSTALL_DATA) ${BUILD_TREE}/sendmail/SECURITY \ - ${PKG_DOC}/sendmail/SECURITY; \ - fi; - $(INSTALL_DATA) ${BUILD_TREE}/sendmail/TRACEFLAGS \ - ${PKG_DOC}/sendmail/TRACEFLAGS; - if [ -f ${BUILD_TREE}/sendmail/TUNING ]; then \ - $(INSTALL_DATA) ${BUILD_TREE}/sendmail/TUNING \ - ${PKG_DOC}/sendmail/TUNING; \ - fi; - sed -e "s?/usr/libexec?${libexecdir}?g" \ - -e "s?/usr/ucb/vacation?${libexecdir}/vacation.sendmail?g" \ - -e "s?/usr/adm/sm.bin?/etc/mail/smrsh?g" \ - ${BUILD_TREE}/smrsh/README \ - > ${PKG_DOC}/smrsh.README; - $(INSTALL_DATA) debian/faq.txt ${PKG_DOC}/; - - # libmilter-dev package - if [ -d ${BUILD_TREE}/libmilter ]; then \ - $(INSTALL_DATA) debian/README.Debian.libmilter-dev \ - ${PKG_DOC}/libmilter/README.Debian; \ - $(INSTALL_DATA) ${BUILD_TREE}/libmilter/README \ - ${PKG_DOC}/libmilter/README; \ - if [ -d ${BUILD_TREE}/libmilter/docs ]; then \ - cp -a ${BUILD_TREE}/libmilter/docs/* \ - ${PKG_DOC}/libmilter/html; \ - fi; \ - fi; - - # Debian stuff - for subdir in ${MAKE_SUBDIRS}; do \ - (cd ${debian_dir}/$$subdir && \ - $(MAKE) install-indep \ - DESTDIR="../../${PKG_DOC}";); \ - done; - - # Multiple package fixup - #dh_movefiles -i --sourcedir debian/${package}; - - # Actions from binary-common - # - dh_fixperms; - # - # Cleanup misc permissions, etc... (fakeroot, dh_fixperms, etc.) -endif - - touch ${STAMP_DIR}/install-indep; - - -#------------- -install-arch: ${STAMP_DIR}/install-arch -${STAMP_DIR}/install-arch: DH_OPTIONS=-a -${STAMP_DIR}/install-arch: ${STAMP_DIR}/build-arch - -# Skip work if nothing to do... -ifeq (yes, ${ENABLE_ARCH}) - dh_testdir; - dh_testroot; - dh_clean -k; - dh_installdirs; - if [ -x /usr/bin/dh_link ]; then dh_link; fi; - - # Add here commands to install the package into ${PKG_DIR}. - #$(MAKE) prefix=`pwd`/${PKG_DIR}/usr install; - - # sendmail install proper... with a little help ;-} - #$(MAKE) install DESTDIR="$${pwd}/${PKG_DIR}"; - - # Finally, install the whole enchilada - for subdir in ${SM_SUBDIRS}; do \ - if [ -d ${BUILD_TREE}/$${subdir} ]; then \ - if [ "$${subdir}" = 'libmilter' ]; then \ - :; \ - elif [ "$${subdir}" = 'mail.local' -o \ - "$${subdir}" = 'rmail' ]; then \ - (cd ${BUILD_TREE}/obj*/$${subdir} && \ - $(MAKE) force-install \ - DESTDIR="../../../../${PKG_DIR}";); \ - else \ - (cd ${BUILD_TREE}/obj*/$${subdir} && \ - $(MAKE) install \ - DESTDIR="../../../../${PKG_DIR}";); \ - fi; \ - fi; \ - done; - # Support older Sendmail (below 8.10.0) - if [ -f ${PKG_DIR}${sysconfdir}/mail/sendmail.hf ]; then \ - mv -f ${PKG_DIR}${sysconfdir}/mail/sendmail.hf \ - ${PKG_DIR}${sysconfdir}/mail/helpfile; \ - $(RM) ${PKG_DIR}${localstatedir}/lib/sendmail/sendmail.st; \ - fi; - - # FHS says that rmail belongs in ${sbindir} - mv ${PKG_DIR}${bindir}/rmail ${PKG_DIR}${sbindir}/rmail; - - # Sendmail alias handling... - # NOTE: whilst smptd is a valid alias for sendmail, we don't create - # one so that we can co-exists with smtpd (a firewall frontend) - # NOTE: newscache package also contains ${sbindir}/hoststat - # NOTE: newalias, purgestat, etc. aren't for the general user.. - # yeah, yeah, I know... these can be done with -b<flag>! - (cd ${PKG_DIR}${bindir} && \ - $(RM) hoststat mailq newaliases purgestat smtpd;) - ln -sf ../sbin/sendmail ${PKG_DIR}${libdir}/sendmail; - (cd ${PKG_DIR}${sbindir} && for file in \ - newaliases hoststat purgestat \ - ; do \ - ln -sf sendmail $$file; \ - done;); - # Handle man pages for these aliases - (cd ${PKG_DIR}${mandir}/man8 && for file in \ - hoststat.8.gz purgestat.8.gz \ - ; do \ - ln -sf sendmail.8.gz $$file; \ - done;); - # Place those removed aliases in ${libexecdir} (mostly for me) - (cd ${PKG_DIR}${libexecdir} && for file in \ - hoststat mailq newaliases purgestat smtpd; do \ - ln -sf ../../sbin/sendmail $$file; \ - done;); - # NOTE: with the MSP/MTA split, we'll provide our own mailstats (keep orig) - mv ${PKG_DIR}${sbindir}/mailstats \ - ${PKG_DIR}${libexecdir}/mailstats; - # Special handling of vacation - Debian has a seperate package - # with a different version (sigh) keep our copy just in case... - if [ -d ${BUILD_TREE}/vacation ]; then \ - mv ${PKG_DIR}${bindir}/vacation \ - ${PKG_DIR}${libexecdir}/vacation.sendmail; \ - mv ${PKG_DIR}${mandir}/man1/vacation.1 \ - ${PKG_DIR}${mandir}/man1/vacation.sendmail.1; \ - fi; - # m4 configuration directories - cp -a ${BUILD_TREE}/cf/* ${PKG_DIR}${datadir}/sendmail/cf; - $(RM) ${PKG_DIR}${datadir}/sendmail/cf/README; - $(RM) ${PKG_DIR}${datadir}/sendmail/cf/sendmail.schema; - $(RM) ${PKG_DIR}${datadir}/sendmail/cf/cf/Build; - $(RM) ${PKG_DIR}${datadir}/sendmail/cf/cf/Makefile; - $(RM) ${PKG_DIR}${datadir}/sendmail/cf/cf/*.cf; - - # contributed stuff - scripts - sed -e 's?/usr/local/bin/perl?/usr/bin/perl?g' \ - -e "s?/etc/sendmail.cf?${sysconfdir}/mail/sendmail.cf?g" \ - ${BUILD_TREE}/contrib/etrn.pl \ - > ${PKG_DIR}${sbindir}/etrn; - chmod 0755 ${PKG_DIR}${sbindir}/etrn; - if [ -f ${BUILD_TREE}/contrib/etrn.0 ]; then \ - sed 's?/usr/local/bin/perl?/usr/bin/perl?g' \ - ${BUILD_TREE}/contrib/etrn.0 \ - > ${PKG_DIR}${mandir}/man8/etrn.8; \ - else \ - sed 's?/usr/local/bin/perl?/usr/bin/perl?g' \ - ${BUILD_TREE}/contrib/etrn.pl \ - > ${PKG_DIR}${mandir}/man8/etrn.8; \ - fi; - sed -e 's?/usr/local/bin/perl?/usr/bin/perl?g' \ - ${BUILD_TREE}/contrib/expn.pl \ - > ${PKG_DIR}${bindir}/expn; - chmod 0755 ${PKG_DIR}${bindir}/expn; - sed 's?/usr/local/bin/perl?/usr/bin/perl?g' \ - ${BUILD_TREE}/contrib/expn.pl \ - > ${PKG_DIR}${mandir}/man8/expn.8; - sed -e "s?/etc/sendmail.cf?${sysconfdir}/mail/sendmail.cf?g" \ - debian/checksendmail/checksendmail.perl \ - > ${PKG_DIR}${sbindir}/checksendmail; - chmod 0755 ${PKG_DIR}${sbindir}/checksendmail; - $(INSTALL_DATA) debian/checksendmail/checksendmail.8 \ - ${PKG_DIR}${mandir}/man8/; - sed -e 's?/usr/local/bin/perl?/usr/bin/perl?g' \ - -e 's?/usr/sbin/sendmail -q30m -bd?/etc/init.d/sendmail start?g' \ - ${BUILD_TREE}/contrib/smcontrol.pl \ - > ${PKG_DIR}${datadir}/sendmail/smcontrol.pl; - chmod 0755 ${PKG_DIR}${datadir}/sendmail/smcontrol.pl; - $(INSTALL_SCRIPT) ${BUILD_TREE}/contrib/doublebounce.pl \ - ${PKG_DIR}${datadir}/sendmail; - if [ -f ${BUILD_TREE}/contrib/qtool.pl ]; then \ - sed -e 's?/usr/bin/env perl?/usr/bin/perl?g' \ - ${BUILD_TREE}/contrib/qtool.pl \ - > ${PKG_DIR}${datadir}/sendmail/qtool.pl; \ - chmod 0755 ${PKG_DIR}${datadir}/sendmail/qtool.pl; \ - $(INSTALL_DATA) ${BUILD_TREE}/contrib/qtool.8 \ - ${PKG_DIR}${mandir}/man8/; \ - fi; - if [ -f ${BUILD_TREE}/contrib/buildvirtuser ]; then \ - $(INSTALL_SCRIPT) ${BUILD_TREE}/contrib/buildvirtuser \ - ${PKG_DIR}${datadir}/sendmail/; \ - fi; - - # contributed stuff - examples - sed 's?/bin/perl?/usr/bin/perl?g' \ - ${BUILD_TREE}/contrib/passwd-to-alias.pl \ - > ${PKG_DIR}${datadir}/sendmail/examples/passwd-to-alias; - chmod 0755 ${PKG_DIR}${datadir}/sendmail/examples/passwd-to-alias; - - # contributed stuff - m4 scripts - if [ -f ${BUILD_TREE}/contrib/domainmap.m4 ]; then \ - $(INSTALL_DATA) ${BUILD_TREE}/contrib/domainmap.m4 \ - ${PKG_DIR}${datadir}/sendmail/cf/feature; \ - fi; - if [ -f ${BUILD_TREE}/contrib/dnsblaccess.m4 ]; then \ - $(INSTALL_DATA) ${BUILD_TREE}/contrib/dnsblaccess.m4 \ - ${PKG_DIR}${datadir}/sendmail/cf/hack; \ - fi; - - # Debian stuff - for subdir in ${MAKE_SUBDIRS}; do \ - (cd ${debian_dir}/$$subdir && \ - $(MAKE) install-arch \ - DESTDIR="../../${PKG_DIR}";); \ - done; - # Debian stuff - m4 scripts - (cd debian && \ - for file in $$(find cf -type f -name '*.m4' -o -name '*.mc'); do \ - $(INSTALL_DATA) $$file \ - ../${PKG_DIR}${datadir}/sendmail/$$file; \ - done;); - # Debian stuff - examples - $(INSTALL_DATA) debian/checksendmail/address.resolve \ - ${PKG_DIR}${datadir}/sendmail/examples/; - - # libmilter-dev package -ifeq (yes, ${ENABLE_DEV}) - if [ -d ${BUILD_TREE}/libmilter ]; then \ - (cd ${BUILD_TREE}/obj*/libmilter && \ - $(MAKE) install \ - DESTDIR="../../../../debian/libmilter-dev";); \ - $(INSTALL_PROGRAM) ${BUILD_TREE}/obj.*/libmilter/libmilter.a \ - debian/libmilter-dev${libdir}/libmilter/; \ - $(INSTALL_DATA) ${BUILD_TREE}/include/libmilter/mfapi.h \ - debian/libmilter-dev${includedir}/libmilter/; \ - if [ -f ${BUILD_TREE}/include/libmilter/mfdef.h ]; then \ - $(INSTALL_DATA) ${BUILD_TREE}/include/libmilter/mfdef.h \ - debian/libmilter-dev${includedir}/libmilter/; \ - fi; \ - $(INSTALL_PROGRAM) ${BUILD_TREE}/obj.*/libsmutil/libsmutil.a \ - debian/libmilter-dev${libdir}/libmilter/; \ - if [ -d ${BUILD_TREE}/libsm ]; then \ - $(INSTALL_PROGRAM) ${BUILD_TREE}/obj.*/libsm/libsm.a \ - debian/libmilter-dev${libdir}/libmilter/; \ - fi; \ - fi; -endif - - # Multiple package fixup - #dh_movefiles -a --sourcedir debian/${package}; - - # Actions from binary-common - #dh_installcron; - $(INSTALL_SCRIPT) debian/${package}.cron.daily \ - ${PKG_DIR}${sysconfdir}/cron.daily/sendmail; - #dh_installlogrotate; - #$(INSTALL_DATA) debian/${package}.logrotate \ - # ${PKG_DIR}${sysconfdir}/logrotate.d/sendmail; - # - dh_fixperms; - # - # Cleanup misc permissions, etc... (fakeroot, dh_fixperms, etc.) - chmod a+x ${PKG_DIR}${datadir}/sendmail/cf/sh/makeinfo.sh; - chown root:root ${PKG_DIR}${sysconfdir}/mail/helpfile; - chown root:root ${PKG_DIR}${sysconfdir}/mail/peers/provider; - chown root:root ${PKG_DIR}${sysconfdir}/mail/service.switch*; - # - # You may want to make some executables suid here. - chown root:mail ${PKG_DIR}${sbindir}/sendmail; - chmod 04755 ${PKG_DIR}${sbindir}/sendmail; - chown root:mail ${PKG_DIR}${libexecdir}/mailstats; - chmod 02755 ${PKG_DIR}${libexecdir}/mailstats; - chown root:mail ${PKG_DIR}${libexecdir}/mail.local; - chmod 0755 ${PKG_DIR}${libexecdir}/mail.local; - chown root:mail ${PKG_DIR}${libexecdir}/smrsh; - chmod 0755 ${PKG_DIR}${libexecdir}/smrsh; - chown root:mail ${PKG_DIR}${libexecdir}/sensible-mda; - chmod 0755 ${PKG_DIR}${libexecdir}/sensible-mda; - - # Special case Perl for Debian Slink (2.1), debhelper v1 - if [ ! -x /usr/bin/dh_perl ]; then \ - echo 'perl:Depends=perl5|perl' >> debian/substvars; fi; - - # Install Lintian overrides - $(INSTALL_DATA) -d -g root -m 755 ${PKG_DIR}${datadir}/lintian/overrides - $(INSTALL_DATA) -g root -m 644 debian/${package}.lintian-overrides \ - ${PKG_DIR}${datadir}/lintian/overrides/${package} -endif - - touch ${STAMP_DIR}/install-arch; - - -#------------- -# This single target is used to build all the packages, all at once, or -# one at a time. So keep in mind: any options passed to commands here will -# affect _all_ packages. Anything you want to only affect one package -# should be put in another target, such as the install target. -# -# Must not depend on anything. This is to be called by -# binary-arch/binary-indep in another 'make' thread. -binary-common: - # Need this version of debhelper for DH_OPTIONS to work. - dh_testversion 1.1.17; - dh_testdir; - dh_testroot; - # Done in install-xxx, but still need to get rid of *.debhelper !!! - #dh_clean -k; - $(RM) debian/*.debhelper; - - dh_installchangelogs -k ${BUILD_TREE}/RELEASE_NOTES; - #-------- needs script name ala installinit ---- - # Done in install-xxx - #dh_installcron; - if [ -x /usr/bin/dh_installdebconf ]; then dh_installdebconf; fi; - dh_installdocs; - #dh_installemacsen; - #dh_installexamples; - #if [ -x /usr/bin/dh_installinfo ]; then dh_installinfo; fi; - dh_installinit --init-script=sendmail; - #-------- needs script name ala installinit ---- - # Done in install-xxx - #if [ -x /usr/bin/dh_installlogrotate ]; then dh_installlogrotate; fi; - if [ -x /usr/bin/dh_installman ]; then dh_installman; fi; - #dh_installmenu; - #dh_installmime; - #dh_undocumented; - if [ -x /usr/bin/dh_installpam ]; then dh_installpam; fi; - # Done in install-xxx - #if [ -x /usr/bin/dh_link ]; then dh_link; fi; -ifeq (, $(findstring nostrip,${DEB_BUILD_OPTIONS})) - dh_strip; -else - #dh_strip; -endif - dh_compress; - # Done in install-xxx - #dh_fixperms; - # Need to special case this now that we're using dynamic uid/gid - #if [ -x /usr/sbin/suidregister -a -s /etc/suid.conf ]; then - # dh_suidregister; fi; - # - # Cleanup misc permissions, etc... (fakeroot, dh_fixperms, etc.) - # Done in install-xxx - # - # You may want to make some executables suid here. - # Done in install-xxx - # - #dh_makeshlibs; - dh_installdeb; - dh_shlibdeps; - if [ -x /usr/bin/dh_perl ]; then dh_perl; fi - dh_gencontrol; - dh_md5sums; - dh_builddeb; - - $(MAKE) -f ${debian_dir}/rules pristine; - - -#------------- -# Build architecture independant packages using the common target. -# (Uncomment this next line if you have such packages.) -binary-indep: ${STAMP_DIR}/build-indep ${STAMP_DIR}/install-indep - -# Skip work if nothing to do... -ifeq (yes, ${ENABLE_INDEP}) - $(MAKE) -f ${debian_dir}/rules DH_OPTIONS=-i binary-common; -endif - - -#------------- -# Build architecture dependant packages using the common target. -binary-arch: ${STAMP_DIR}/build-arch ${STAMP_DIR}/install-arch - -# Skip work if nothing to do... -ifeq (yes, ${ENABLE_ARCH}) - $(MAKE) -f ${debian_dir}/rules DH_OPTIONS=-a binary-common; -endif - - -#------------- -# Any other binary targets build just one binary package at a time. -binary-%: - $(MAKE) -f ${debian_dir}/rules binary-common DH_OPTIONS=-p$*; - - -#------------- -# Below here is fairly generic really - -source diff: - @echo >&2 'source and diff are obsolete - use dpkg-source -b'; false - -# Due to buildd not (for the nonce) supporting build-arch, kluge next rule -build: build-arch -install: install-indep install-arch -binary: binary-indep binary-arch -.PHONY: refresh-dbs refresh-debian update-debian refresh-faq -.PHONY: pristine -.PHONY: info buildinfo -.PHONY: setup autotools configure -.PHONY: clean build build-indep build-arch -.PHONY: install install-indep install-arch -.PHONY: binary binary-indep binary-arch -.SUFFIXES: -.PRECIOUS: ${debian_dir}/rules diff --git a/debian/build/site.config.m4.in b/debian/build/site.config.m4.in index e07df3b..1f1e410 100644 --- a/debian/build/site.config.m4.in +++ b/debian/build/site.config.m4.in @@ -50,8 +50,12 @@ #Suggests: @sm_suggests@ # #------------------------------------------------------------------ -# Build Architecture (Debian) +# Build Setup #------------------------------------------------------------------ +#Autoconf version: @ac_version@ +#Automake version: @am_version@ +#DEBIAN_DH(DebHelper): @DEBIAN_DH@ internal use(not reliable) +# #DEB_BUILD_ARCH: @DEB_BUILD_ARCH@ #DEB_BUILD_GNU_CPU: @DEB_BUILD_GNU_CPU@ #DEB_BUILD_GNU_SYSTEM: @DEB_BUILD_GNU_SYSTEM@ @@ -156,15 +160,19 @@ APPENDDEF(`conf_vacation_LIBS', `@sm_vacation_libs@') #------------------------------------------------------------------ # compilation/link define(`confCC', `@CC@')dnl #Compiler +define(`confOPTIMIZE', `@CFLAGS@')dnl #Optimization define(`confCCOPTS', `')dnl #CC options define(`confCCOPTS_SO' `-fPIC')dnl #Shared libraries define(`confLD', confCC)dnl #Linker define(`confLDOPTS', `')dnl #Linker opts define(`confLDOPTS_SO', `-shared -Wl')dnl #linker shared lib define(`confLIBDIRS', `')dnl #-L linker flags -define(`confMTCCOPTS', `')dnl #Multi-thread cc opts -define(`confMTLDOPTS', `')dnl #Multi-thread ld opts -define(`confOPTIMIZE', `@CFLAGS@')dnl #Optimization +define(`confMTCCOPTS', `-D_REENTRANT')dnl #Multi-thread cc opts +define(`confMTLDOPTS', `-lpthread')dnl #Multi-thread ld opts +define(`confSHAREDLIB_EXT', `.so')dnl # +define(`confSHAREDLIB_SUFFIX', `')dnl # +define(`confSHAREDLIBDIR', `@libdir@')dnl # +define(`confSONAME',`-soname') # # # paths, owners, and modes # Note: can't use smmsp here, it is dynamically created @@ -192,13 +200,13 @@ define(`confMANROOTMAN',`@mandir@/man')dnl #man root define(`confMANGRP', `root')dnl #man group define(`confMANMODE', `0744')dnl #man mode define(`confMANOWN', `root')dnl #man owner -define(`confMBINDIR', `@sbindir@')dnl #MTA bindir +define(`confMBINDIR', `@libexecdir@')dnl #MTA bindir @sbindir@ define(`confMBINGRP', `root')dnl #MTA bin grp define(`confMBINMODE', `0755')dnl #MTA bin mode define(`confMBINOWN', `root')dnl #MTA bin owner define(`confMSPQOWN', `mail')dnl #MSP queue owner smmsp define(`confMSP_QUEUE_DIR', `/var/spool/mqueue-client')dnl -define(`confSBINDIR', `@sbindir@')dnl #suid bin dir +define(`confSBINDIR', `@libexecdir@')dnl #suid bin dir @sbindir@ define(`confSBINGRP', `root')dnl #suid bin grp define(`confSBINMODE', `04755')dnl #suid bin mode define(`confSBINOWN', `root')dnl #suid bin owner @@ -207,7 +215,7 @@ define(`confSTDIR', `@localstatedir@/lib/sendmail')dnl #Statistics dir define(`confSTFILE', `statistics')dnl #statistics name define(`confMSP_STFILE',`sm-client.st')dnl #MSP statistics name define(`confSTMODE', `0660')dnl #statistics mode -define(`confUBINDIR', `@bindir@')dnl #usr bin dir +define(`confUBINDIR', `@libexecdir@')dnl #usr bin dir @bindir@ define(`confUBINGRP', `mail')dnl #usr bin grp smmsp define(`confUBINMODE', `0755')dnl #usr bin mode define(`confUBINOWN', `root')dnl #usr bin owner diff --git a/debian/build/version.c b/debian/build/version.c index c54b2b6..f222e40 100644 --- a/debian/build/version.c +++ b/debian/build/version.c @@ -1 +1 @@ -char Version[] = "8.12.7"; +char Version[] = "8.13.3"; diff --git a/debian/cf/Makefile.in b/debian/cf/Makefile.in new file mode 100644 index 0000000..97d0ad9 --- /dev/null +++ b/debian/cf/Makefile.in @@ -0,0 +1,453 @@ +# Makefile.in generated by automake 1.9.4 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = cf +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/./build/mkinstalldirs +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBIAN = @DEBIAN@ +DEBIAN_DH = @DEBIAN_DH@ +DEB_BUILD_ARCH = @DEB_BUILD_ARCH@ +DEB_BUILD_GNU_CPU = @DEB_BUILD_GNU_CPU@ +DEB_BUILD_GNU_SYSTEM = @DEB_BUILD_GNU_SYSTEM@ +DEB_BUILD_GNU_TYPE = @DEB_BUILD_GNU_TYPE@ +DEB_HOST_ARCH = @DEB_HOST_ARCH@ +DEB_HOST_GNU_CPU = @DEB_HOST_GNU_CPU@ +DEB_HOST_GNU_SYSTEM = @DEB_HOST_GNU_SYSTEM@ +DEB_HOST_GNU_TYPE = @DEB_HOST_GNU_TYPE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SM_CPYRT = @SM_CPYRT@ +SM_DATE = @SM_DATE@ +SM_ENABLE_AUTH_FALSE = @SM_ENABLE_AUTH_FALSE@ +SM_ENABLE_AUTH_TRUE = @SM_ENABLE_AUTH_TRUE@ +SM_ENABLE_LDAP_FALSE = @SM_ENABLE_LDAP_FALSE@ +SM_ENABLE_LDAP_TRUE = @SM_ENABLE_LDAP_TRUE@ +SM_ENABLE_TLS_FALSE = @SM_ENABLE_TLS_FALSE@ +SM_ENABLE_TLS_TRUE = @SM_ENABLE_TLS_TRUE@ +SM_MAXVERS = @SM_MAXVERS@ +SM_MINVERS = @SM_MINVERS@ +SM_VERS = @SM_VERS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_STRIP = @ac_ct_STRIP@ +ac_version = @ac_version@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +am_version = @am_version@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +buildtree = @buildtree@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sm_auth_lib = @sm_auth_lib@ +sm_badepends = @sm_badepends@ +sm_build_arch = @sm_build_arch@ +sm_custom = @sm_custom@ +sm_databases = @sm_databases@ +sm_date = @sm_date@ +sm_depends = @sm_depends@ +sm_dist_name = @sm_dist_name@ +sm_dist_vers = @sm_dist_vers@ +sm_editmap_envdef = @sm_editmap_envdef@ +sm_editmap_libs = @sm_editmap_libs@ +sm_enable_auth = @sm_enable_auth@ +sm_enable_bind = @sm_enable_bind@ +sm_enable_dev = @sm_enable_dev@ +sm_enable_doc = @sm_enable_doc@ +sm_enable_hesiod = @sm_enable_hesiod@ +sm_enable_ipv6 = @sm_enable_ipv6@ +sm_enable_ldap = @sm_enable_ldap@ +sm_enable_maillock = @sm_enable_maillock@ +sm_enable_milter = @sm_enable_milter@ +sm_enable_ndbm = @sm_enable_ndbm@ +sm_enable_newdb = @sm_enable_newdb@ +sm_enable_nis = @sm_enable_nis@ +sm_enable_nisplus = @sm_enable_nisplus@ +sm_enable_regex = @sm_enable_regex@ +sm_enable_sfio = @sm_enable_sfio@ +sm_enable_shm = @sm_enable_shm@ +sm_enable_tcpd = @sm_enable_tcpd@ +sm_enable_tls = @sm_enable_tls@ +sm_envdef = @sm_envdef@ +sm_features = @sm_features@ +sm_ffr = @sm_ffr@ +sm_hesiod_parms = @sm_hesiod_parms@ +sm_host_arch = @sm_host_arch@ +sm_incdirs = @sm_incdirs@ +sm_ldap_lib = @sm_ldap_lib@ +sm_libmilter_envdef = @sm_libmilter_envdef@ +sm_libmilter_libs = @sm_libmilter_libs@ +sm_libs = @sm_libs@ +sm_libsm_envdef = @sm_libsm_envdef@ +sm_libsm_libs = @sm_libsm_libs@ +sm_libsmdb_envdef = @sm_libsmdb_envdef@ +sm_libsmdb_libs = @sm_libsmdb_libs@ +sm_libsmutil_envdef = @sm_libsmutil_envdef@ +sm_libsmutil_libs = @sm_libsmutil_libs@ +sm_m4_ffr = @sm_m4_ffr@ +sm_mail_local_envdef = @sm_mail_local_envdef@ +sm_mail_local_libs = @sm_mail_local_libs@ +sm_mailstats_envdef = @sm_mailstats_envdef@ +sm_mailstats_libs = @sm_mailstats_libs@ +sm_makemap_envdef = @sm_makemap_envdef@ +sm_makemap_libs = @sm_makemap_libs@ +sm_mapdef = @sm_mapdef@ +sm_newdb_lib = @sm_newdb_lib@ +sm_praliases_envdef = @sm_praliases_envdef@ +sm_praliases_libs = @sm_praliases_libs@ +sm_recommends = @sm_recommends@ +sm_revision = @sm_revision@ +sm_rmail_envdef = @sm_rmail_envdef@ +sm_rmail_libs = @sm_rmail_libs@ +sm_sendmail_envdef = @sm_sendmail_envdef@ +sm_sendmail_libs = @sm_sendmail_libs@ +sm_smrsh_envdef = @sm_smrsh_envdef@ +sm_smrsh_libs = @sm_smrsh_libs@ +sm_suggests = @sm_suggests@ +sm_time = @sm_time@ +sm_utc = @sm_utc@ +sm_vacation_envdef = @sm_vacation_envdef@ +sm_vacation_libs = @sm_vacation_libs@ +sm_version = @sm_version@ +sm_version_beta = @sm_version_beta@ +sm_version_major = @sm_version_major@ +sm_version_math = @sm_version_math@ +sm_version_minor = @sm_version_minor@ +sm_version_r = @sm_version_r@ +sm_version_v = @sm_version_v@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ + +#!/usr/bin/make -f +#------------------------------------------------------------------------------ +# vim: syntax=make +# +# $Sendmail: Makefile,v @sm_version@ @sm_date@ @sm_time@ cowboy Exp $ +# +# Copyright (c) 1998-@SM_CPYRT@ Richard Nelson. All Rights Reserved. +# +# @configure_input@ +# +# Rules file for Sendmail @sm_version@@sm_revision@(@sm_version_math@) +# on @sm_dist_name@ @sm_dist_vers@ +# via Debhelper V@DEBIAN_DH@ +# +# Note: the .in file supports Sendmail @SM_MINVERS@ - @SM_MAXVERS@ +# on Debian slink, potato, woody, testing, sid, ... +# but the generated file is customized to the version noted above. +# +# Richard Nelson <cowboy@debian.org> @sm_date@ @sm_time@ (@sm_utc@) +#------------------------------------------------------------------------------ +# +# Shipped data +# +# Installed cf subdirectories +CF_DIRS = cf debian domain feature hack m4 mailer ostype +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu cf/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu cf/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-data-hook install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am uninstall uninstall-am uninstall-info-am + +# +# Local customisation... not automake friendly +# +install-data-hook: + $(INSTALL) -d ${DESTDIR}${pkgdatadir}/cf; + cp -a ${top_srcdir}/../${buildtree}/cf/* ${DESTDIR}${pkgdatadir}/cf; + chmod a+x ${DESTDIR}${pkgdatadir}/cf/sh/makeinfo.sh; + $(RM) ${DESTDIR}${pkgdatadir}/cf/README; + $(RM) ${DESTDIR}${pkgdatadir}/cf/sendmail.schema; + $(RM) ${DESTDIR}${pkgdatadir}/cf/cf/Build; + $(RM) ${DESTDIR}${pkgdatadir}/cf/cf/Makefile; + $(RM) ${DESTDIR}${pkgdatadir}/cf/cf/*.cf; + for dir in ${CF_DIRS}; do \ + $(INSTALL) -d ${DESTDIR}${pkgdatadir}/cf/$$dir; \ + find $$dir -type f -name '*.mc' -o -name '*.m4' \ + | xargs -ri \ + $(INSTALL_DATA) '{}' ${DESTDIR}${pkgdatadir}/cf/'{}'; \ + done; + if [ -f ${top_srcdir}/../${buildtree}/contrib/domainmap.m4 ]; then \ + $(INSTALL_DATA) ${top_srcdir}/../${buildtree}/contrib/domainmap.m4 \ + ${DESTDIR}${pkgdatadir}/cf/feature; \ + fi; + if [ -f ${top_srcdir}/../${buildtree}/contrib/dnsblaccess.m4 ]; then \ + $(INSTALL_DATA) ${top_srcdir}/../${buildtree}/contrib/dnsblaccess.m4 \ + ${DESTDIR}${pkgdatadir}/cf/hack; \ + fi; +# +# Debian targets, phase out (this needs to be treated as -arch, not -indep) +# +.PHONY: build-indep build-arch +.PHONY: install-indep install-arch +build-indep: +build-arch: +install-indep: install +install-arch: +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/debian/cf/debian/autoconf.m4.in b/debian/cf/debian/autoconf.m4.in index e9d6430..70423d3 100644 --- a/debian/cf/debian/autoconf.m4.in +++ b/debian/cf/debian/autoconf.m4.in @@ -51,6 +51,7 @@ define(`sm_enable_maillock',`@sm_enable_maillock@')dnl define(`sm_enable_milter', `@sm_enable_milter@')dnl define(`sm_enable_sfio', `@sm_enable_sfio@')dnl define(`sm_enable_auth', `@sm_enable_auth@')dnl +define(`sm_auth_lib', `@sm_auth_lib@')dnl define(`sm_enable_tls', `@sm_enable_tls@')dnl define(`sm_enable_shm', `@sm_enable_shm@')dnl define(`sm_ffr', `@sm_ffr@')dnl diff --git a/debian/cf/debian/sendmail.mc.in b/debian/cf/debian/sendmail.mc.in index c52cadb..0e48387 100644 --- a/debian/cf/debian/sendmail.mc.in +++ b/debian/cf/debian/sendmail.mc.in @@ -27,7 +27,7 @@ divert(-1)dnl #----------------------------------------------------------------------------- divert(0)dnl # -# Copyright (c) 1998-2002 Richard Nelson. All Rights Reserved. +# Copyright (c) 1998-2005 Richard Nelson. All Rights Reserved. # # This file is used to configure Sendmail for use with Debian systems. # @@ -36,6 +36,9 @@ include(`@datadir@/sendmail/cf/m4/cf.m4')dnl VERSIONID(`$Id: sendmail.mc, v @sm_version@@sm_revision@ @sm_date@ @sm_time@ cowboy Exp $') OSTYPE(`debian')dnl DOMAIN(`debian-mta')dnl +dnl # Items controlled by /etc/mail/sendmail.conf - DO NOT TOUCH HERE +dnl undefine(`confHOST_STATUS_DIRECTORY')dnl #DAEMON_HOSTSTATS= +dnl # Items controlled by /etc/mail/sendmail.conf - DO NOT TOUCH HERE dnl # dnl # General defines dnl # @@ -44,3 +47,45 @@ dnl # into this directory before writing files. dnl # If *all* your user accounts are under /home then use that dnl # instead - it will prevent any writes outside of /home ! dnl # define(`confSAFE_FILE_ENV', `')dnl +dnl # +dnl # Daemon options - restrict to servicing LOCALHOST ONLY !!! +dnl # Remove `, Addr=' clauses to receive from any interface +dnl # If you want to support IPv6, switch the commented/uncommentd lines +FEATURE(`no_default_msa')dnl +dnl DAEMON_OPTIONS(`Family=inet6, Name=MTA-v6, Port=smtp, Addr=::1')dnl +DAEMON_OPTIONS(`Family=inet, Name=MTA-v4, Port=smtp, Addr=127.0.0.1')dnl +dnl DAEMON_OPTIONS(`Family=inet6, Name=MSP-v6, Port=submission, Addr=::1')dnl +DAEMON_OPTIONS(`Family=inet, Name=MSP-v4, Port=submission, Addr=127.0.0.1')dnl +dnl # +dnl # Be somewhat anal in what we allow +define(`confPRIVACY_FLAGS',dnl +`needmailhelo,needexpnhelo,needvrfyhelo,restrictqrun,restrictexpand,nobodyreturn,authwarnings')dnl +dnl # +dnl # Define connection throttling and window length +define(`confCONNECTION_RATE_THROTTLE', `15')dnl +define(`confCONNECTION_RATE_WINDOW_SIZE',`10m')dnl +dnl # +dnl # Features +dnl # +dnl # The access db is the basis for most of sendmail's checking +FEATURE(`access_db', , `skip')dnl +dnl # +dnl # The greet_pause feature stops some automail bots - but check the +dnl # provided access db for details on excluding localhosts... +FEATURE(`greet_pause', `1000')dnl 1 seconds +dnl # +dnl # Delay_checks allows sender<->recipient checking +FEATURE(`delay_checks', `friend', `n')dnl +dnl # +dnl # If we get too many bad recipients, slow things down... +define(`confBAD_RCPT_THROTTLE',`3')dnl +dnl # +dnl # Stop connections that overflow our concurrent and time connection rates +FEATURE(`conncontrol', `nodelay', `terminate')dnl +FEATURE(`ratecontrol', `nodelay', `terminate')dnl +dnl # +dnl # Default Mailer setup +MAILER_DEFINITIONS +MAILER(`local')dnl +MAILER(`smtp')dnl + diff --git a/debian/cf/domain/debian-msp.m4.in b/debian/cf/domain/debian-msp.m4.in index c3d04d5..16bdf30 100644 --- a/debian/cf/domain/debian-msp.m4.in +++ b/debian/cf/domain/debian-msp.m4.in @@ -23,6 +23,7 @@ ifdef(`sm_version', `dnl', dnl # VERSIONID(`$Id: debian-msp.m4, v @sm_version@@sm_revision@ @sm_date@ @sm_time@ cowboy Exp $') define(`DEBIAN_MSP')dnl +define(`confCF_VERSION', `Submit')dnl dnl # dnl # changes made herein *must* be reflected in parse_mc,update_db,debian.m4 dnl # @@ -46,7 +47,7 @@ define(`confRRT_IMPLIES_DSN', `True')dnl define(`confSAFE_FILE_ENV', `/')dnl define(`confSAFE_QUEUE', `True')dnl define(`confQUEUE_FILE_MODE', `0660')dnl -define(`confTEMP_FILE_MODE', `0600')dnl +define(`confTEMP_FILE_MODE', `0644')dnl dnl # dnl # Provide some 'more reasonable' timeout values dnl # See SASL/TLS sections below for more timeout values @@ -71,28 +72,3 @@ dnl # dnl # Optional items (should be a subset site.config.m4 used for build) dnl # to prevent sendmail error messages dnl # -dnl #--------------------------------------------------------------------- -dnl # SMTP AUTH (SASL) support (sendmail 8.10.0 +) -dnl # NOTE: we'll us inaddr_any instead of 127.0.0.1 (or not...) -dnl # Sigh: MSP AUTH doesn't work in -bs mode (/etc/sasldb !o+r) -dnl #--------------------------------------------------------------------- -ifelse(sm_enable_auth, `yes',dnl -`define(`confAUTH_MECHANISMS',dnl - `GSSAPI KERBEROS_V4 DIGEST-MD5 CRAM-MD5 PLAIN LOGIN')dnl' -`TRUST_AUTH_MECH(`GSSAPI KERBEROS_V4 DIGEST-MD5 CRAM-MD5 PLAIN LOGIN')' -`ifelse(eval(sm_version_math >= 527360), `1',dnl -`define(`confTO_AUTH', `2m')dnl # , def=10m' -`define(`confDONT_BLAME_SENDMAIL',dnl -defn(`confDONT_BLAME_SENDMAIL')`,GroupReadableSASLDBFile,GroupWritableSASLDBFile')dnl')' -`DAEMON_OPTIONS(`Name=NoMTA, Addr=127.0.0.1, M=EA')dnl' -)dnl -dnl # -dnl #--------------------------------------------------------------------- -dnl # SMTP STARTTLS (OpenSSL) support (sendmail 8.11.0 +) -dnl #--------------------------------------------------------------------- -ifelse(sm_enable_tls, `yes',dnl -`ifelse(eval(sm_version_math >= 527360), `1',dnl -`define(`confTO_STARTTLS', `2m')dnl # , def=10m' -`define(`confDONT_BLAME_SENDMAIL',dnl - defn(`confDONT_BLAME_SENDMAIL')`,GroupReadableKeyFile')dnl')' -)dnl diff --git a/debian/cf/domain/debian-mta.m4.in b/debian/cf/domain/debian-mta.m4.in index 1a82051..5169ef2 100644 --- a/debian/cf/domain/debian-mta.m4.in +++ b/debian/cf/domain/debian-mta.m4.in @@ -61,19 +61,19 @@ dnl # dnl # Debian users have group writable directories/files by default (8.9.0+) ifelse(eval(sm_version_math >= 526592), `1',dnl `define(`confDONT_BLAME_SENDMAIL',dnl -`AssumeSafeChown,ForwardFileInGroupWritableDirPath,GroupWritableForwardFileSafe,GroupWritableIncludeFileSafe,IncludeFileInGroupWritableDirPath')dnl' + defn(`confDONT_BLAME_SENDMAIL')`,AssumeSafeChown,ForwardFileInGroupWritableDirPath,GroupWritableForwardFileSafe,GroupWritableIncludeFileSafe,IncludeFileInGroupWritableDirPath')dnl' )dnl dnl # dnl # Don't warn for non-existant forward files (8.10.0+) ifelse(eval(sm_version_math >= 526848), `1',dnl `define(`confDONT_BLAME_SENDMAIL',dnl - defn(`confDONT_BLAME_SENDMAIL')`,DontWarnForwardFileInUnsafeDirPath')dnl' + defn(`confDONT_BLAME_SENDMAIL')`,DontWarnForwardFileInUnsafeDirPath,TrustStickyBit,NonRootSafeAddr')dnl' )dnl dnl # dnl # Allow group-writable include files (8.12.0+) ifelse(eval(sm_version_math >= 527360), `1',dnl `define(`confDONT_BLAME_SENDMAIL',dnl - defn(`confDONT_BLAME_SENDMAIL')`,GroupWritableIncludeFile')dnl' + defn(`confDONT_BLAME_SENDMAIL')`,GroupWritableIncludeFile,GroupReadableaDefaultAuthInfoFile')dnl' )dnl dnl # dnl # by default, disable Message Submission Agent (8.10.0+) @@ -95,6 +95,10 @@ ifelse(eval(sm_version_math >= 527360), `1',dnl `define(`confPRIVACY_FLAGS',dnl defn(`confPRIVACY_FLAGS')`,restrictexpand')dnl') dnl # +dnl # Define trusted user to be the new mta uid (smmta) +dnl # +ifdef(`confTRUSTED_USER',,`define(`confTRUSTED_USER',`smmta')dnl') +dnl # dnl # Provide a more reasonable default for number of queue-runners dnl # because many/most? people will not discover this themselves dnl # and the sendmail default is one! @@ -104,31 +108,3 @@ dnl # dnl # Optional items (should be a subset site.config.m4 used for build) dnl # to prevent sendmail error messages dnl # -dnl #--------------------------------------------------------------------- -dnl # SMTP AUTH (SASL) support (sendmail 8.10.0 +) -dnl # PLAIN/LOGIN needed to support SASL auth via PAM ;( -dnl # if this bothers you, you allow them only in conjunction w/STARTTLS ! -dnl # for 8.12.0+, add EXTERNAL as an available & trusted mech (w/STARTTLS) -dnl #--------------------------------------------------------------------- -ifelse(sm_enable_auth, `yes',dnl -`define(`confAUTH_MECHANISMS',dnl -`GSSAPI KERBEROS_V4 DIGEST-MD5 CRAM-MD5 PLAIN LOGIN')dnl' -`TRUST_AUTH_MECH(`GSSAPI KERBEROS_V4 DIGEST-MD5 CRAM-MD5 PLAIN LOGIN')' -`ifelse(eval(sm_version_math >= 527360), `1',dnl -`define(`confAUTH_MECHANISMS',dnl -`EXTERNAL 'defn(`confAUTH_MECHANISMS'))dnl' -`TRUST_AUTH_MECH(`EXTERNAL')' -`define(`confTO_AUTH', `2m')dnl # , def=10m' -`define(`confDONT_BLAME_SENDMAIL',dnl -defn(`confDONT_BLAME_SENDMAIL')`,GroupReadableSASLDBFile,GroupWritableSASLDBFile')dnl')' -)dnl -dnl # -dnl #--------------------------------------------------------------------- -dnl # SMTP STARTTLS (OpenSSL) support (sendmail 8.11.0 +) -dnl #--------------------------------------------------------------------- -ifelse(sm_enable_tls, `yes',dnl -`ifelse(eval(sm_version_math >= 527360), `1',dnl -`define(`confTO_STARTTLS', `2m')dnl # , def=10m' -`define(`confDONT_BLAME_SENDMAIL',dnl - defn(`confDONT_BLAME_SENDMAIL')`,GroupReadableKeyFile')dnl')' -)dnl diff --git a/debian/cf/feature/rhsbl.m4 b/debian/cf/feature/rhsbl.m4 index 857ce58..c81c45c 100644 --- a/debian/cf/feature/rhsbl.m4 +++ b/debian/cf/feature/rhsbl.m4 @@ -1,6 +1,6 @@ divert(-1) # -# Copyright (c) 2001 Derek J. Balling +# Copyright (c) 2002 Derek J. Balling # All rights reserved. # # Permission to use granted for all purposes. If modifications are made @@ -11,9 +11,13 @@ divert(-1) # works on sendmail-8.12.x ... use on any other version may require tinkering # by you the downloader. # +# Incorporates many changes by Sergey S. Mokryshev <mokr@mokr.net> +# +# + divert(0) ifdef(`_RHSBL_R_',`dnl',`dnl -VERSIONID(`$Id: rhsbl.m4,v 1.1 2001/08/27 15:41:15 dredd Exp $') +VERSIONID(`$Id: rhsbl.m4,v 1.4 2002/06/01 14:05:06 dredd Exp $') define(`_RHSBL_R_',`') ifdef(`_DNSBL_R_',`dnl',`dnl LOCAL_CONFIG @@ -22,19 +26,16 @@ Kdnsbl host -T<TMP>')') divert(-1) define(`_RHSBL_SRV_', `_ARG_')dnl define(`_RHSBL_MSG_', `ifelse(len(X`'_ARG2_),`1',`"550 Mail from " $`'&{RHS} " refused by blackhole site '_RHSBL_SRV_`"',`_ARG2_')')dnl -define(`_RHSBL_MSG_TMP_', `ifelse(_ARG3_,`t',`"451 Temporary lookup failure of " $`'&{RHS} " at '_RHSBL_SRV_`"',`_ARG2_')')dnl +define(`_RHSBL_MSG_TMP_', `ifelse(_ARG3_,`t',`"451 Temporary lookup failure of " $`'&{RHS} " at '_RHSBL_SRV_`"',`_ARG3_')')dnl divert(8) -LOCAL_RULESETS -SLocal_check_mail # DNS based RHS spam list _RHSBL_SRV_ R$+ $: <@> $>CanonAddr $&f -R<@> $*<@$+.> $:<@>$1<@$2.>$|$>SearchList<+ rhs>$|<F:$1@$2><D:$2><> -R$* $| <$={Accept}> $: OKSOFAR +R<@> $*<@$+.> $: <@> <@$2.> $| $>SearchList <+ rhs> $| <F:$1@$2> <D:$2> <> +R<@> $* $| <$={Accept}> $: OKSOFAR R<@> $*<@$+.> $| $* $: <?> $(dnsbl $2._RHSBL_SRV_. $: OK $) $(macro {RHS} $@ $2 $) R<@> $* $: OKSOFAR -R<?>OK $: OKSOFAR +R<?> OK $: OKSOFAR ifelse(len(X`'_ARG3_),`1', `R<?>$+<TMP> $: TMPOK', `R<?>$+<TMP> $#error $@ 4.7.1 $: _RHSBL_MSG_TMP_') R<?>$+ $#error $@ 5.7.1 $: _RHSBL_MSG_ -divert(-1) diff --git a/debian/cf/feature/vnet.m4 b/debian/cf/feature/vnet.m4 index 6086baf..aea804b 100644 --- a/debian/cf/feature/vnet.m4 +++ b/debian/cf/feature/vnet.m4 @@ -2,7 +2,7 @@ divert(-1)dnl #----------------------------------------------------------------------------- # $Sendmail: ./vnet.m4,v 8.12.0 2001/09/24 12:00:00 cowboy Exp $ # -# Copyright (c) 2001-2001 Richard Nelson. All Rights Reserved. +# Copyright (c) 2001-2004 Richard Nelson. All Rights Reserved. # # feature(vnet) config file for building Sendmail # @@ -21,10 +21,11 @@ LOCAL_CONFIG # Support routing of .rscs nodes via XAGENT # # Define vnet/rscs node hlq -CAvnet.ibm.com vnet rscs +CAvnet.ibm.com vnet rscs ipnet # # Note: you'll have to define your XAGENT node: #DAlexvmk.lexington.ibm.com +###################################################################### dnl dnl dnl @@ -37,13 +38,17 @@ LOCAL_RULE_3 # Support Lotus Notes and VM TCP/IP MTAs # # Remove stupid route addressing (%hack) added by VM TCP/IP -R$* % ibmus.rscs < @ $+> $* $: $1 < @ us.ibm.com > $3 -R$* % ibmuk.rscs < @ $+> $* $: $1 < @ uk.ibm.com > $3 -R$* % $-.rscs < @ $+> $* $: $1 < @ $2.rscs > $4 +R$* % ibmus.rscs < @ $+> $* $: $1 < @ us.ibm.com > $3 # Deprecated +R$* % ibmca.rscs < @ $+> $* $: $1 < @ ca.ibm.com > $3 # Deprecated +R$* % ibmuk.rscs < @ $+> $* $: $1 < @ uk.ibm.com > $3 # Deprecated +R$* % $-.rscs < @ $+> $* $: $1 < @ $2.rscs > $4 # Deprecated +# Now, rewrite those address to user@<node>.vnet +R$* < @ $-.$=A > $* $: $1 < @ $2.vnet . > # Now, try the domaintable yet again... -R$* < @ $-.rscs > $* $: $1 < @ $(domaintable $2.rscs $) > $3 +#R$* < @ $-.vnet > $* $: $1 < @ $(domaintable $2.vnet $) > $3 # Finally, allow an override on simply the rscs domain... -R$* < @ $-.rscs > $* $: $1 < @ $2.$(domaintable rscs $) > $3 +#R$* < @ $-.vnet > $* $: $1 < @ $2.$(domaintable vnet $) > $3 +###################################################################### dnl dnl dnl @@ -52,19 +57,18 @@ LOCAL_NET_CONFIG ### vnet: Handle .rscs domain, deliver to *.ibm.com, etc... ### ###################################################################### - # Skip any local addresses # (or we'll get a "mail loops back to itself" error -R$* < @ $=w . > $* $@ $1 < @ $2 . > $3 regular local name -R$* < @ $=w > $* $@ $1 < @ $2 . > $3 regular local name +R$* < @ $=w . > $* $@ $1 < @ $2 . > $3 regular local name +R$* < @ $=w > $* $@ $1 < @ $2 . > $3 regular local name -# Recipients inside IBM--transfer the mail directly. +# Recipients of the form user@node.{vnet,rscs,ipnet} get rewritten to +# user@node.vnet, the message itself is forwarded to +# the VM TCP/IP to RSCS gateway node specified in $A. +R$* < @ $- . vnet . > $* $#relay $@ $A $: $1 < @$2.VNET. > $3 +# Recipients inside IBM--transfer the mail directly. R$* < @ $+.ibm.com > $* $#relay $@ $2.ibm.com $: $1 < @$2.ibm.com > $3 R$* < @ $+.ibm.com. > $* $#relay $@ $2.ibm.com $: $1 < @$2.ibm.com > $3 - -# Recipients of the form user@node.vnet get rewritten to -# user@node.vnet.ibm.com, the message itself is forwarded to -# the RSCS/VM node specified in $A. - -R$* < @ $-.$=A > $* $#relay $@ $A $: $1 < @$2.vnet.ibm.com > $4 +###################################################################### +LOCAL_CONFIG diff --git a/debian/cf/hack/debian_auth.m4.in b/debian/cf/hack/debian_auth.m4.in index 66510b1..917c6b5 100644 --- a/debian/cf/hack/debian_auth.m4.in +++ b/debian/cf/hack/debian_auth.m4.in @@ -42,6 +42,6 @@ R$* $: $&{auth_authen} Put authentication id in the workspace ifdef(`DEBIAN_DEBUG',dnl `R$* $: $(log authtype:$&{auth_type} $) $1 R$* $: $(log authauthen:$&{auth_authen} $) $1 -R$* $: $(log authauthor:$&{auth_author} $) $1')dnl +R$* $: $(log authauthor:$&{auth_author} $) $1') R$=t $@ $#ok Trusted users... Allow trusted users to auth= as anyone #----------------------------------------------------------------------------- diff --git a/debian/cf/hack/virthost_by_ip.m4.in b/debian/cf/hack/virthost_by_ip.m4.in index d304213..922751a 100644 --- a/debian/cf/hack/virthost_by_ip.m4.in +++ b/debian/cf/hack/virthost_by_ip.m4.in @@ -52,7 +52,7 @@ ifdef(`_REC_BY_', `dnl', dnl # Now, override default settings for virtual hosting define(`_REC_BY_', `$.by $?{if_name}${if_name}$|$j$. ($v/$Z)$?r with $r$. id $i$?{tls_version}')dnl define(`confRECEIVED_HEADER', `_REC_HDR_ - _REC_AUTH_$?{auth_ssf} (${auth_ssf} bits)$.) + _REC_FULL_AUTH_$?{auth_ssf} bits=${auth_ssf}$.) _REC_BY_ _REC_TLS_ _REC_END_')dnl diff --git a/debian/cf/mailer/ssh.m4 b/debian/cf/mailer/ssh.m4 new file mode 100644 index 0000000..25cc475 --- /dev/null +++ b/debian/cf/mailer/ssh.m4 @@ -0,0 +1,42 @@ +PUSHDIVERT(-1) +dnl +dnl By using this file, you agree to the terms and conditions set +dnl forth in the LICENSE file which can be found at the top level of +dnl the sendmail distribution. +dnl +dnl Original version contributed by Andrzej Filip. +dnl +dnl $Log: ssh.m4,v $ +dnl Revision 8.1 2004/03/27 12:54:53 anfi +dnl *** empty log message *** +dnl +VERSIONID(`$Id: ssh.m4,v 8.1 2004/03/27 12:54:53 anfi Exp $') + +ifdef(`SSH_MAILER_PATH',, + `ifdef(`SSH_PATH', + `define(`SSH_MAILER_PATH', SSH_PATH)', + `define(`SSH_MAILER_PATH', `/usr/bin/ssh')')') +ifdef(`SSH_REMOTE_COMMAND',, + `define(`SSH_REMOTE_COMMAND', `/usr/sbin/sendmail -bs')') +define(`_SSH_QGRP', `ifelse(defn(`SSH_MAILER_QGRP'),`',`', ` Q=SSH_MAILER_QGRP,')')dnl +_DEFIFNOT(`_DEF_SSH_MAILER_FLAGS', `mDFMuX') +_DEFIFNOT(`SSH_MAILER_FLAGS',`') +ifdef(`SSH_MAILER_ARGS',, `define(`SSH_MAILER_ARGS', + `ssh -o BatchMode=yes -o EscapeChar=none -- 'SSH_MAILER_HOST` 'SSH_REMOTE_COMMAND)') +ifdef(`SSH_MAILER_HOST',, `define(`SSH_MAILER_HOST',`$h')') +ifdef(`SSH_MAILER_USER',`', +`errprint(`*** SSH_MAILER_USER must be defined before MAILER(`ssh'). +')') +ifdef(`SSH_MAILER_DIR',`', +`errprint(`*** SSH_MAILER_DIR must be defined before MAILER(`ssh'). +')') + +POPDIVERT +######################*****############## +### SSH Mailer specification ### +##################*****################## + +Mssh, P=SSH_MAILER_PATH, F=_MODMF_(CONCAT(_DEF_SSH_MAILER_FLAGS, SSH_MAILER_FLAGS), `SSH'), S=EnvFromSMTP/HdrFromSMTP, R=ifdef(`_ALL_MASQUERADE_', `EnvToSMTP/HdrFromSMTP', `EnvToSMTP'), E=\r\n, L=990, + _OPTINS(`SSH_MAILER_MAX', `M=', `, ')_OPTINS(`SSH_MAILER_MAXMSGS', `m=', `, ')_OPTINS(`SSH_MAILER_MAXRCPTS', `r=', `, ')_OPTINS(`SSH_MAILER_CHARSET', `C=', `, ')T=DNS/RFC822/SMTP,_SSH_QGRP + U=SSH_MAILER_USER, D=SSH_MAILER_DIR, + A=SSH_MAILER_ARGS diff --git a/debian/cf/ostype/debian.m4.in b/debian/cf/ostype/debian.m4.in index bf48888..7c04397 100644 --- a/debian/cf/ostype/debian.m4.in +++ b/debian/cf/ostype/debian.m4.in @@ -68,13 +68,15 @@ dnl # dnl #--------------------------------------------------------------------- dnl # mailer paths and options dnl #--------------------------------------------------------------------- -define(`LOCAL_MAILER_PATH', `@libexecdir@/sensible-mda')dnl +define(`LOCAL_MAILER_PATH', `@sbindir@/sensible-mda')dnl define(`LOCAL_MAILER_ARGS', `sensible-mda $g $u $h ${client_addr}')dnl -define(`LOCAL_MAILER_FLAGS', `SPhnu9')dnl -define(`LOCAL_SHELL_FLAGS', `u9')dnl +MODIFY_MAILER_FLAGS(`LOCAL', `+S')dnl #do keep root +MODIFY_MAILER_FLAGS(`LOCAL', `-r')dnl #do not munge args +MODIFY_MAILER_FLAGS(`LOCAL', `-m')dnl #do not try LMTP define(`PROCMAIL_MAILER_PATH', `/usr/bin/procmail')dnl define(`PROCMAIL_MAILER_ARGS', `procmail -m $h $f $u')dnl define(`USENET_MAILER_PATH', `/usr/bin/inews')dnl +dnl define(`confDEF_CHAR_SET', `iso-8859-1')dnl dnl # dnl # Optional items (should be a subset site.config.m4 used for build) dnl # to prevent sendmail error messages diff --git a/debian/changelog b/debian/changelog index 21d0882..b80628b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,104 +1,475 @@ -sendmail (8.12.3-7.2) oldstable-security; urgency=high +sendmail (8.13.3-6) unstable; urgency=high + * Correct m4 quoting in control file (FTBFS) + * Only call dh_shlibdeps for build-arch targets + * ditto for dh_strip + * Refresh FAQ + * Reinstate buildinfo (vi dh_buildinfo or locally) + * Add symlinks for the .so files into libmilter-dev + * Drop libwrap in favour of access.db -- libwrap has confused many + because sendmail uses it slightly different (being a daemon). This + will also allow for better performance at larger shops. - * Non-maintainer upload by the Security Team - * Backported upstream patch to fix remote command execution - [debian/patches/8.12/8.12.3/z_CVE-2006-0058.patch, VU#834865] + -- Richard A Nelson (Rick) <cowboy@debian.org> Fri, 04 Feb 2005 19:22:00 -0000 - -- Martin Schulze <joey@infodrom.org> Wed, 22 Mar 2006 23:24:46 +0100 +sendmail (8.13.3-5) unstable; urgency=high + * Remove *all* build directories on clean + * Make sure make clean is called for subdirectories + * Build-Depends make (>> 3.79.1-14) (FTBFS) + * Update to newer config.{guess,sub} + * Have sendmail depend upon exact versions of -base,-cf, etc. + * Add note in sendmail.mc about listening only on localhost closes: #275896 + * Support debian/${SM_CONF}.patches subdirectory, with a structure + like debian/patches (ie an 8.13/8.13.3 subdirectory) so that a + site can have local patches that get copied (possibly replacing + debian patches of the same name) and used. closes: #291981 + NOTE: you'll have to refit these patches yourself, there's not much + I can do automagically here... -sendmail (8.12.3-7.1) stable-security; urgency=high + This, I think, completes the local customization setup, you can + now have your own: + - ${SM_CONF}.options -- sendmail configuration options + - ${SM_CONF}.changelog -- local changelog, prepended to the Debian log + - ${SM_CONF}.patches -- local patches - * Non-maintainer upload by the Security Team - * Corrected the patch to not use default settings for the sasldb - [debian/local/update_auth.in, CAN-2004-0833] + Please, give it go and let me know what you think - -- Martin Schulze <joey@infodrom.org> Mon, 13 Sep 2004 09:07:18 +0200 + -- Richard A Nelson (Rick) <cowboy@debian.org> Wed, 02 Feb 2005 23:10:00 -0000 -sendmail (8.12.3-7) stable-security; urgency=high - +sendmail (8.13.3-4) unstable; urgency=high + ===== Install required to prevent mail loss with multiple recipients ==== + * remove -m from LOCAL_MAILER_FLAGS + + -- Richard A Nelson (Rick) <cowboy@debian.org> Mon, 31 Jan 2005 11:10:00 -0500 + +sendmail (8.13.3-3) unstable; urgency=medium + * Oops, need to remove -r from LOCAL_MAILER_FLAGS + + -- Richard A Nelson (Rick) <cowboy@debian.org> Thu, 27 Jan 2005 01:10:00 -0000 + +sendmail (8.13.3-2) unstable; urgency=medium + * ======== Important upgrade fixes ============= + * make sure debian/build/config.* are executable + * quote filenames in dynamic to not confuse bash + * Use upstream default LOCAL_MAILER_FLAGS +S-r closes: #288484 + - If you need 'u' or 'h', use MODIFY_MAILER_FLAGS(`LOCAL', `+<flag>')dnl + * correct smarthost in sendmailconfg closes: #286526 + * correct shutdown in sendmail-bin.postinst closes: #285897 + + -- Richard A Nelson (Rick) <cowboy@debian.org> Thu, 27 Jan 2005 00:41:00 -0000 + +sendmail (8.13.3-1) unstable; urgency=medium + * New upstream release + - Correct reversion in FallBackMXHost handling + - Better handling of of I/O errors (esp SSL - _FFR_DEAL_WITH_ERROR_SSL) + * Upstream patch for close_wait issues + * Build-Depends-Indep: on groff-base, drop groff closes: #289167 + * Hrm... finally nail the extraneous > in sendmailconfig closes: #289907 + * Update debian/rules to show SM_CONF on package build closes: #286460 + * Change OSTYPE(linux) to OSTYPE(debian) closes: #285896 + * Can't reproduce race condition closes: #283178 + + -- Richard A Nelson (Rick) <cowboy@debian.org> Sun, 23 Jan 2005 05:05:00 -0000 + +sendmail (8.13.3-0) unstable; urgency=medium + * New upstream release + * Remove lintian warnings + * Refit patches + * Refresh FAQ + + -- Richard A Nelson (Rick) <cowboy@debian.org> Wed, 12 Jan 2005 06:30:00 -0000 + +sendmail (8.13.2+8.13.3.Beta1-0) unstable; urgency=medium + * New upstream release + * Refit patches + + -- Richard A Nelson (Rick) <cowboy@debian.org> Tue, 11 Jan 2005 18:40:00 -0000 + +sendmail (8.13.2+8.13.3.Beta0-0) unstable; urgency=medium + * New upstream release + * Refit patches + + -- Richard A Nelson (Rick) <cowboy@debian.org> Mon, 10 Jan 2005 03:00:00 -0000 + +sendmail (8.13.2-1) unstable; urgency=medium + * New upstream release + - DB termination before exit (vacation, mail.local) + - threading for milter + - DNS for IPv6 and SASL + - Cyrus IMAP LMTP and AUTH + - see Changelog for the details + * Refresh FAQ + + -- Richard A Nelson (Rick) <cowboy@debian.org> Wed, 15 Dec 2004 19:30:00 -0000 + +sendmail (8.13.2-0) unstable; urgency=low + * New upstream release preview + * Refit patches + + -- Richard A Nelson (Rick) <cowboy@debian.org> Wed, 15 Dec 2004 06:00:00 -0000 + +sendmail (8.13.1+8.13.2.Beta0-0) unstable; urgency=low + * New upstream beta + * Refit patches + + -- Richard A Nelson (Rick) <cowboy@debian.org> Sat, 04 Dec 2004 04:50:00 -0000 + +sendmail (8.13.1-20) unstable; urgency=high + === Yet Another Round Of Migration AdjustmentS === + * Extraneous > in sendmailconfig cp command closes: #284516 + * Default to local, smtp mailers in new config closes: #284357 + + -- Richard A Nelson (Rick) <cowboy@debian.org> Mon, 06 Dec 2004 12:00:00 -0000 + +sendmail (8.13.1-19) unstable; urgency=high + * Add missing semicolon to /etc/mail/Makefile, preventing + updates to local databases from working closes: #283901 + + -- Richard A Nelson (Rick) <cowboy@debian.org> Sun, 05 Dec 2004 04:00:00 -0000 + +sendmail (8.13.1-18) unstable; urgency=high + * Ignore CRL list for now - since we're not building one + this is a migration issue, as otherwise sendmail spews warnings + on every connection :( closes: #282663 + + * Make local build configuration trivial + + Add SM_CONF=<custom> to debian/rules, this variable serves as: + - Name of debian/<custom>.options configuration options + - Name of debian/<custom>.changelog local changelog file + - Name prepended to the debian version (ie Fubar.8.13.1-18) + Usage: SM_CONF=Fubar debian/rules configure + See debian/rules for more information + + Move configuration options to debian/configure.options file + + Add --with-custom=<custom> configure option to alter the version + (ala make-kpkg). --with-custom=Fubar will create a debian native + package 'sendmail' with version 'Fubar.8.13.1-18'. Lintian will + mark the packages as in error because of the '-18', but no harm is + otherwise caused. + + Support <custom>.options to be used instead of configure.options + + Support <custom>.changelog in the debian directory to be pre-pended + to the standard changelog. The format must match that of a stock + changelog, and include a trailing empty line. + + Support locally edited changelogs, though the prior <custom>.changelog + is the preferred means. + + Remove SM_BUILD_OPT=no{tls,auth} as they are now redundant + * Update buildinfo rule to list the more modern libdb, sasl, etc. + + -- Richard A Nelson (Rick) <cowboy@debian.org> Tue, 23 Nov 2004 17:00:00 -0000 + +sendmail (8.13.1-17) unstable; urgency=high + * Yet Another Set Of Migration Fixes + * update_auth was failing due to bad C&P + * Finally, parse_mc handles included files closes: #273329 + and cleans old *some* stale entries closes: #273326 + update_mk can now do proper dependancy analysis :) + * Improve /etc/network/interfaces resolvconf support: IF_DNS_SEARCH + * Update sendmail.schema.v2 to current version + * Apply upstream patch to squelch error: cataddr: string too long. + * Install reportbug hooks in *all* packages + * Properly manage sasl/sasl.m4 and tls/starttls.m4 on upgrades + + -- Richard A Nelson (Rick) <cowboy@debian.org> Mon, 01 Nov 2004 17:00:00 -0000 + +sendmail (8.13.1-16) unstable; urgency=high + ***** Ease upgrades **** + * Remove unspecified dependancy on netbase closes: #278749 + * Make dynamic logging controled by sendmail.conf closes: #277603 + * Warn users when to expect a slowdown on upgrades closes: #275178 + * Quiet the use of group sasl, and move to update_auth + + -- Richard A Nelson (Rick) <cowboy@debian.org> Fri, 29 Oct 2004 19:00:00 -0000 + +sendmail (8.13.1-15) unstable; urgency=high + * Required for proper upgrades... + + Add MAILER defs to sample sendmail.mc closes: #274340 + + Sigh... had the sasl group test backwards closes: #273719 + + Heavy sigh... really fix build-from-source + * Provide configure.ac for local updates + + -- Richard A Nelson (Rick) <cowboy@debian.org> Thu, 07 Oct 2004 15:00:00 -0000 + +sendmail (8.13.1-14) unstable; urgency=high + * donotrunalloutputtogetherinsendmailstop/start + * correct dynamic log messages + * bashism patch for dynamic was flawed... + * do not add TLS _FFR options if TLS is not used + * Correct local build-from-source closes: #271848 + * Conditionally add {smmta,smmsp} to group sasl closes: #272160 + * For sarge, -bin must depend upon -base closes: #272222 + or user/group data is missing closes: #272502 + closes: #272526 + * Add NEWS item about TLS issues on upgrade closes: #271860 + so users know what to do closes: #271860 + + -- Richard A Nelson (Rick) <cowboy@debian.org> Wed, 15 Sep 2004 20:00:00 -0000 + +sendmail (8.13.1-13) unstable; urgency=high * Don't update sasldb with default settings (thanks Hugo) CAN-2004-0833 + * Add Homepage: to package descriptions -- Richard A Nelson (Rick) <cowboy@debian.org> Mon, 06 Sep 2004 12:00:00 -0000 -sendmail (8.12.3-6.6) stable-security; urgency=high - - * Non-maintainer upload by the Security Team - * Fix vulnerability in ruleset parsing - [debian/patches/8.12/8.12.3/CAN-2003-0681.patch] - - -- Matt Zimmerman <mdz@debian.org> Wed, 17 Sep 2003 14:34:02 -0400 - -sendmail (8.12.3-6.5) stable-security; urgency=high - - * Non-maintainer upload by the Security Team - * Fix vulnerability in parseaddr() which could be used to overwrite memory - [debian/patches/8.12/8.12.3/CAN-2003-0694.patch] - - -- Matt Zimmerman <mdz@debian.org> Tue, 16 Sep 2003 16:28:18 -0400 - -sendmail (8.12.3-6.4) stable-security; urgency=low - - * Non-maintainer upload by the Security Team - * Create temporary files securely - Report and patches from Paul Szabo <psz@maths.usyd.edu.au> - [debian/checksendmail/checksendmail.perl, - contrib/doublebounce.pl, - contrib/expn.pl] - (Closes: #173243) - * Configure with --enable-bind=no and remove build-dep on bind-dev. - Linking with libbind broke LDAP support in 8.12.3-5 - (Closes: #183434) - [debian/rules, debian/build/rules.in] - - -- Matt Zimmerman <mdz@debian.org> Thu, 24 Apr 2003 13:02:08 -0400 - -sendmail (8.12.3-6.3) stable-security; urgency=high - - * Non-maintainer upload by the Security Team - * Corrected the patch to fix a potentially remotely exploitable bug. - - -- Martin Schulze <joey@infodrom.org> Fri, 4 Apr 2003 15:39:21 +0200 - -sendmail (8.12.3-6.2) stable-security; urgency=high - - * Non-maintainer upload by the Security Team - * Fixed a buffer overflow in address parsing due to a char to int - conversion problem which is potentially remotely exploitable found by - Michal Zalewski. (VU#897604 CA-2003-12 CAN-2003-0161, - debian/patches/8.12/8.12.3/security.parsaddr) - * Force no optimization for arm - buggy compiler... - - -- Martin Schulze <joey@infodrom.org> Tue, 1 Apr 2003 20:58:30 +0200 - -sendmail (8.12.3-5) stable-security; urgency=urgent - - * Finally, bring a working, installable (and removable) sendmail to - Woody !!! - * !!! A remote buffer overflow is squashed via upstream fix !!! - * The following GRAVE bugs are fixed - + sendmailconfig sets sm_path incorrectly (fixed in sid, but not woody) - + sendmail_8.12.3-4 cannot install from scratch - + sendmailconfig silly checks - + sendmailconfig no longer works (due to update_conf location) - Closes: #146331, #150179, #153908, #158445 - * The following Serious Policy Violations - + sendmail preinst does not check for /etc/cron.d - Closes: #154702 - * The following Important problems - + Lots of syslog messages regarding SSL after upgrade, reinstall fails - Closes: #158751 - * The following Normal problems - + sendmailconfig assumes incorrectly location of loadable modules - + sendmail: package sendmail can't be removed/replaced - + not having STARTTLS configured spams messages to the logs - + sendmail: Installation fails to create SSL certificates - + sendmail issues in Woody - Closes: #160612, #162997, #170625, #169527, #171085, #171407 - * Included (at no additional charge) - + Fix for numeric ids (got several mails on this - HESIOD problem) - + Several upstream patches for MX, MSP, SMRSH and improved DNS handling - that cleans up potential DOS issues - - -- Richard A Nelson (Rick) <cowboy@debian.org> Tue, 21 Jan 2003 12:00:00 -0500 +sendmail (8.13.1-12) unstable; urgency=high + * remove bashisms, missing $ in dynamic closes: #270058 + -- thanks to Blars + + -- Richard A Nelson (Rick) <cowboy@debian.org> Sun, 05 Sep 2004 19:17:00 -0000 + +sendmail (8.13.1-11) unstable; urgency=high + * New config.guess + * Actually set $j in dynamic processing for roaming clients + * DHCP support actually works now + * Correct oddity in m4 generated control file that left + libmilter-dev without a description closes: #269240 + + -- Richard A Nelson (Rick) <cowboy@debian.org> Sun, 29 Aug 2004 16:00:00 -0000 + +sendmail (8.13.1-10) unstable; urgency=high + * s/{client,check}_hello/{client,check}_helo + * add _FFR_heloname + * Make sure milter code is compiled with -D_REENTRANT + * relax shared library dependancies (specify version after -V) + * Move FEATURE(NULLCLIENT) after other features closes: #268081 + there may still be warnings issued - but they should now be + benign + + -- Richard A Nelson (Rick) <cowboy@debian.org> Mon, 23 Aug 2004 15:00:00 -0000 + +sendmail (8.13.1-9) unstable; urgency=high + * Cleanup control file dependancies + + libmilter0 *does* have dependancies + + remove now useless lintian override + * Package is now lintian clean (with a few overrides) ! + * Imbed /usr/share/sendmail/sendmail into /etc/init.d/sendmail + * Correct configure.ac for smtps on < 8.13.0 + * Correct mailq link (back to /usr/share/sendmail/mailq) + * refresh faq + + -- Richard A Nelson (Rick) <cowboy@debian.org> Wed, 18 Aug 2004 22:00:00 -0000 + +sendmail (8.13.1-8) unstable; urgency=high + * Make initial install prompt free (by using a sane&safe default): + + listen only to 127.0.0.1 + + if /etc/mailname extant, use it as the masquerade value + + no smarthost (would have to prompt) + + Issue msg to run sendmailconfig *later* if desired + closes: #112397 #213022 #227464 + * Now lintian free (sans overrides and one message I can't get rid of): + W: sendmail source: newer-standards-version 3.6.10.0 + * if HANDS_OFF != No, also remove /etc/cron.d/sendmail + * remove empty NEWS files closes: #265977 + * Correct sasl2 instructions - closes: #265976 + Here's what you must do to make sasl usable with smtp/smmsp: + + chown smmta:smmsp /etc/sasldb2 (problematic if used by others) + + dpkg-statoverride --remove /var/run/saslauthd + + dpkg-statoverride --add root sasl 711 /var/run/saslauthd + + -- Richard A Nelson (Rick) <cowboy@debian.org> Mon, 16 Aug 2004 04:30:00 -0000 + +sendmail (8.13.1-7) unstable; urgency=high + * LAST PACKAGE SPLIT FOR SARGE ... + this is required to support those wish to install the minimum + amount required to run sendmail (skipping rmail, sensible-mda, etc.) + and is the final step all the other splits have been gearing up for! + Post sarge, even sendmail-base should become optional + * Create /etc/mail/access if one is not found -- enhanced security ! + especially since the newer sendmail.mc references it... + * cleanup lintian somewhat - still have some 0-length files to deal with + * stop update_notices from spewing crap + * remove more cruft in the .diff.gz + * mv {dialup,provider}.m4 to new m4 subdirectory and adjust sendmail.mc + * cleanup and extend alternative support + * added nodelay,terminate to ratecontrol + * Add HANDS_OFF variable to sendmail.conf (the blood be upon your hands) + * Make all new sendmailconfig installations listen to 127.0.0.1 by default + * correct trap syntax in sendmailconfig + + -- Richard A Nelson (Rick) <cowboy@debian.org> Sun, 15 Aug 2004 15:00:00 -0000 + +sendmail (8.13.1-6) unstable; urgency=low + * Make nullmailer work again and expose root closes: #192613 + also makes it listen only to 127.0.0.1 closes: #227031 + also set masquerade name closes: #206224 + + -- Richard A Nelson (Rick) <cowboy@debian.org> Thu, 12 Aug 2004 00:30:00 -0000 + +sendmail (8.13.1-5) unstable; urgency=low + * Don't prompt upgrades for configure/start - doit... closes: #265146 + * Make nullmailer work again and expose root closes: #192613 + also makes it listen only to 127.0.0.1 closes: #227031 + + -- Richard A Nelson (Rick) <cowboy@debian.org> Wed, 11 Aug 2004 23:00:00 -0000 + +sendmail (8.13.1-4) unstable; urgency=high + * Don't leave extraneous sendmails laying about closes: #264784 + + -- Richard A Nelson (Rick) <cowboy@debian.org> Wed, 11 Aug 2004 21:00:00 -0000 + +sendmail (8.13.1-3) unstable; urgency=high + * Add private, undocumented new client_ macro + * update_db now also appends *.mc to the bottom of *.cf (like Makefile) + * make sure there is a valid /etc/mail/submit.mc closes: #264383 + * Sigh... got the POSIX bit backwards :( closes: #264783 + * Here's what you must do to make sasl usable with smtp/smmsp: + + chown smmta:smmsp /etc/sasldb2 (problematic if used by others) + + dpkg-statoverride --remove /var/run/saslauthd + + dpkg-statoverride --add root sasl 711 /var/run/saslauthd + + -- Richard A Nelson (Rick) <cowboy@debian.org> Wed, 11 Aug 2004 07:00:00 -0000 + +sendmail (8.13.1-2) unstable; urgency=high + * Add reportbug script/control file to obtain more information - + of course, reportbug in unstable is b0rked :( + * Regress default charset and 67 mail flags... causes some problems + * force auto_transition to true, not false now that sasl2 supports it + * correct /etc/mail{sasl,smrsh,tls} permissions = smmta:smmsp 0755 + * STARTTLS certs & key must be owned by root:smmsp + * cleanup feature(vnet.m4) somewhat for IBM RSCS routing + + -- Richard A Nelson (Rick) <cowboy@debian.org> Sun, 08 Aug 2004 19:00:00 -0000 + +sendmail (8.13.1-1) unstable; urgency=high + * Quoting error in sasl.m4 :( + + -- Richard A Nelson (Rick) <cowboy@debian.org> Sun, 08 Aug 2004 19:00:00 -0000 + +sendmail (8.13.1-0) unstable; urgency=high + * New upstream release correcting some issue - see the changelog + * Refit patches + * update_conf was setting wrong mode on /var/lib/sendmail/host_status + * avoid double reload-if-running on DHCP client changes + * Auto_transition now works with SASL2 :) + * Allow specification of SASL Realm in /etc/mail/sasl/sasl.m4 + * Add default charset and mime conversion to cf/ostype/debian.m4 + * a few bashism scattered in /usr/share/sendmail and {pre,post}{init,rm} + and the build scripts... but I'll bet I've still missed a few :( + * A few new and updated logcheck rules closes: #263321 + * sendmail -bs now supports authentication with two changes: + + chown smmta:smmsp /etc/sasldb2 (problematic if used by others) + + chmod o+x /var/run/saslauthd + + -- Richard A Nelson (Rick) <cowboy@debian.org> Sat, 31 Jul 2004 17:40:00 -0000 + +sendmail (8.13.0-2) unstable; urgency=high + * <<<<==== This really needs to make sarge ====>>>> + This brings a shared mail filter library to the package, making it + much easier to package spam/ddos/etc. packages for sendmail - and + yes, there a few just waiting in the wings. + * The "sort some loose ends" update + * Add the .mc file to the end of the .cf file - Just In Case... + * Add _FFR_SKIP_DOMAINS (work by Stephen Frost) + * Update received hdr format in hacks/virthost_by_ip.m4 to match current + sendmail format + * Tighten permissions on .db files to prevent local DOS (due to locks) + * refresh feature/rhsbl.m4 + * update template sendmail.mc and access for some decent spam/DOS control + * FINALLY... get rid of hoststats syslog errors iff $DAEMON_HOSTSTATS=No + * /etc/mail/Makefile is cleaner & more robust + * Newer pidfile handling in sendmail and scripts closes: #123712 + * Fix new bash incompatability closes: #262211 + * RunAsUser support (not ready for prime-time yet) + + add smmta uid/gid + + sendmail.conf supports (doesn't yet document) DAEMON_RUNASUSER=No/yes + + update_sys, update_mk, update_db change ownership appropriately + still to go: + + complete the sendmail.conf support (documentation) + + document what must be changed + + MAILER_FLAGS(local) -= S (can't change uid/gid) + + chown smmta:sasl /etc/sasldb2 + + Must use SUID MDA (sensible-mda,procmail,mail.local) + + set RunAsUser to smmta:smmsp in sendmail.mc + + socket files (spamassassin, clamav, etc) need to be owned/writeable + by smmta + + *ALL* forward files, :include:, etc *MUST* be readable by the new + smmta uid - or your mail *will* go *poof* + + Summary: great for a mail bastion host, or a machine with a limited + number of users - or well mannered users... otherwise - skip it ! + * Supply shared libmilter.o in a new package libmilter0 ! closes: #164282 + + -- Richard A Nelson (Rick) <cowboy@debian.org> Sat, 24 Jul 2004 14:00:00 -0800 + +sendmail (8.13.0-1) unstable; urgency=critical + * <<<<==== This really needs to make sarge ====>>>> + While a large update, and a version bump, it is critical that this + makes it into sarge so that we have a clean migration path for the + future and because of the enhance security features included in + the upstream changes (leakage of confidential information) as well + as numerous other items that protect the system from abuse (greet_pause) + * New upstream version closes: #257483 + * Upstream patch for milter corrections + * Refresh FAQ + * Split out the arch independent portion of sendmail into new + packages (sendmail-{base,cf}) and make sendmail depend upon them. + This cuts down dramatically on the size of the sendmail .deb, and + will reduce the space/time constraints on dbuilds. It also gives + a good start on co-existing MTAs (more on this later). There may + still be a few rough edges in the new packaging - just let me know! + * Modernize the networking handling for sendmail: + By setting up /etc/mail/sendmail.conf, you can tell sendmail to + monitor one or more network interfaces for up/down status and + reconfigure itself automatically - with no editting of scripts + inside /etc/ppp/, /etc/network, or /etc/dhcp3. + 1) For ppp connections, the IPPARAM is for the file in /etc/mail/peers + 2) For dhcp connections, the dhcp provided domain name is used + 3) For ifup/down, you must add 'provider <name>' in the appropriate + stanza for the interface (or use dns_domain ala resolvconf) + Whenever /etc/resolv.conf is changed (resolvconf), sendmail's host + status data will be refreshed to expedite the sending of any queued mail. + * Add /etc/resolvconf/update-libc.d/sendmail + * Add /etc/dhcp3/dhclient-exit-hooks.d/sendmail + * Add /etc/network/if-{down,up}.d/sendmail + * Add /usr/share/sendmail/dynamic + * Update /etc/ppp/ip-{down,up}.d/sendmail + * Update /usr/share/sendmail/update_conf and /etc/mail/sendmail.config + * Add automake handling for the cf directories and expand its use + in the examples, further simplifying the rules (more to go) + * correct checksendmail's use of address.resolve (now in /etc/mail) + * Improve dependancy relationships in /etc/mail/Makefile: + *) databases depends upon {dialup,provider}.m4 and {sasl,starttls}.m4 + *) Parse_mc.pm also now scans those files + This allows databases to also be defined in /etc/mail/peers/<...> + and they will be recognized and updated accordingly. + closes: #233288 + * Prevent debian-mta.m4 from overwriting DONT_BLAME_SENDMAIL + NOTE WELL that the only correct way to start your sendmail.mc is: + define(`_USE_ETC_MAIL_')dnl + include(`/usr/share/sendmail/cf/m4/cf.m4')dnl + VERSIONID(`$Id: sendmail.mc, v ... cowboy Exp $') + OSTYPE(`debian')dnl + DOMAIN(`debian-mta')dnl + Placing ANYTHING before or in between this may BITE you !!! + closes: #248802 + * rename /etc/logcheck/violations.ignore.d/logcheck.sendmail -> sendmail + closes: #252560 + + -- Richard A Nelson (Rick) <cowboy@debian.org> Fri, 23 Jul 2004 10:00:00 -0800 + +sendmail (8.13.0-0) private; urgency=low + + * New upstream release + * Refit patches + + -- Richard A Nelson (Rick) <cowboy@debian.org> Sun, 20 Jun 2004 13:00:00 -0000 + +sendmail (8.13.0.Beta0-0) private; urgency=low + + * New upstream beta release + * Refit patches + + -- Richard A Nelson (Rick) <cowboy@debian.org> Tue, 04 May 2004 16:00:00 -0000 + +sendmail (8.13.0.Alpha0-0) private; urgency=low + + * New upstream alpha release + * Refit patches + + -- Richard A Nelson (Rick) <cowboy@debian.org> Sat, 28 Feb 2004 02:30:00 -0000 + +sendmail (8.13.0.PreAlpha4-0) private; urgency=low + + * New upstream pre release + * Refit patches + * Relook at _FRR_s + + -- Richard A Nelson (Rick) <cowboy@debian.org> Mon, 13 Oct 2003 15:00:00 -0000 /* vim:set ai et tw=80 */ diff --git a/debian/checksendmail/CVS/Entries b/debian/checksendmail/CVS/Entries deleted file mode 100644 index 692e38d..0000000 --- a/debian/checksendmail/CVS/Entries +++ /dev/null @@ -1,5 +0,0 @@ -/BSDI_CONTRIB/1.1/Mon Jan 22 10:57:27 1996 Tue Oct 24 17:29:51 1995// -/Makefile/1.3/Mon Jan 22 10:57:28 1996 Fri Jan 6 22:34:35 1995// -/address.resolve/1.1.1.1/Mon Jan 22 10:57:28 1996 Thu Jan 13 14:15:30 1994// -/checksendmail.8/1.1.1.1/Mon Jan 22 10:57:28 1996 Thu Jan 13 14:15:31 1994// -/checksendmail.perl/1.1.1.1/Mon Jan 22 10:57:29 1996 Thu Jan 13 14:15:31 1994// diff --git a/debian/checksendmail/CVS/Repository b/debian/checksendmail/CVS/Repository deleted file mode 100644 index b300606..0000000 --- a/debian/checksendmail/CVS/Repository +++ /dev/null @@ -1 +0,0 @@ -/master/contrib/checksendmail diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..b8626c4 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +4 diff --git a/debian/configure b/debian/configure index 37059e1..ff45eed 100644 --- a/debian/configure +++ b/debian/configure @@ -1,40 +1,32 @@ #! /bin/sh -# From configure.ac Revision: 8.12.7 . +# From configure.ac Revision: 8.13.3 . # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.53 for Sendmail 8.12.7. +# Generated by GNU Autoconf 2.59 for Sendmail 8.13.3. # # Report bugs to <bug/reportbug or sendmail@packages.debian.org>. # # # # # $Sendmail$ -# # from Sendmail: ./configure.ac,v 8.12.7 2003-01-20 15:00:00 +# # from Sendmail: ./configure.ac,v 8.13.3 2005-02-21 21:00:00 # # # cat <<EOF # -# Copyright (c) 1998-2003 Richard Nelson. All Rights Reserved. +# Copyright (c) 1998-2005 Richard Nelson. All Rights Reserved. # -# Generated by Autoconf 2.53 for Sendmail 8.12.7 +# Sendmail 8.13.3 +# Generated by Autoconf 2.59, Automake 1.9 # # Debian configure script for building Sendmail -# Note: this file supports Sendmail 8.7.6 - 8.12.7 +# Note: this file supports Sendmail 8.7.6 - 9.0.0 # and has been tested on autoconf 2.12, 2.13, 2.50, 2.52, 2.53 # # # EOF # # -# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 -# Free Software Foundation, Inc. +# Copyright (C) 2003 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. - -if expr a : '\(a\)' >/dev/null 2>&1; then - as_expr=expr -else - as_expr=false -fi - - ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## @@ -43,46 +35,57 @@ fi if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi +DUALCASE=1; export DUALCASE # for MKS sh -# NLS nuisances. # Support unset when possible. -if (FOO=FOO; unset FOO) >/dev/null 2>&1; then +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi -(set +x; test -n "`(LANG=C; export LANG) 2>&1`") && - { $as_unset LANG || test "${LANG+set}" != set; } || - { LANG=C; export LANG; } -(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") && - { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } || - { LC_ALL=C; export LC_ALL; } -(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") && - { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } || - { LC_TIME=C; export LC_TIME; } -(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") && - { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } || - { LC_CTYPE=C; export LC_CTYPE; } -(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") && - { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } || - { LANGUAGE=C; export LANGUAGE; } -(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") && - { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } || - { LC_COLLATE=C; export LC_COLLATE; } -(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") && - { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } || - { LC_NUMERIC=C; export LC_NUMERIC; } -(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") && - { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } || - { LC_MESSAGES=C; export LC_MESSAGES; } + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi # Name of the executable. -as_me=`(basename "$0") 2>/dev/null || +as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ @@ -93,6 +96,7 @@ echo X/"$0" | /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` + # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' @@ -103,15 +107,15 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conftest.sh - echo "exit 0" >>conftest.sh - chmod +x conftest.sh - if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi - rm -f conftest.sh + rm -f conf$$.sh fi @@ -159,6 +163,8 @@ do as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} @@ -231,13 +237,20 @@ else fi rm -f conf$$ conf$$.exe conf$$.file +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. -as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. -as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS @@ -247,7 +260,7 @@ as_nl=' IFS=" $as_nl" # CDPATH. -$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; } +$as_unset CDPATH # Name of the host. @@ -261,6 +274,7 @@ exec 6>&1 # Initializations. # ac_default_prefix=/usr/local +ac_config_libobj_dir=. cross_compiling=no subdirs= MFLAGS= @@ -275,11 +289,11 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='Sendmail' PACKAGE_TARNAME='sendmail' -PACKAGE_VERSION='8.12.7' -PACKAGE_STRING='Sendmail 8.12.7' +PACKAGE_VERSION='8.13.3' +PACKAGE_STRING='Sendmail 8.13.3' PACKAGE_BUGREPORT='bug/reportbug or sendmail@packages.debian.org' -ac_unique_file="./build/rules.in" +ac_unique_file="./build/site.config.m4.in" ac_default_prefix=/usr # Factoring default headers for most tests. ac_includes_default="\ @@ -318,6 +332,8 @@ ac_includes_default="\ # include <unistd.h> #endif" +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os SET_MAKE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK am__leading_dot AMTAR am__tar am__untar MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT ac_version am_version SM_VERS SM_DATE SM_MINVERS SM_MAXVERS SM_CPYRT sm_date sm_time sm_utc sm_version sm_version_v sm_version_r sm_version_major sm_version_minor sm_version_beta sm_version_math sm_revision sm_custom buildtree docdir sm_dist_name sm_dist_vers DEBIAN DEBIAN_DH DEB_BUILD_ARCH DEB_BUILD_GNU_CPU DEB_BUILD_GNU_SYSTEM DEB_BUILD_GNU_TYPE DEB_HOST_ARCH DEB_HOST_GNU_CPU DEB_HOST_GNU_SYSTEM DEB_HOST_GNU_TYPE sm_build_arch sm_host_arch CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP LN_S EGREP sm_incdirs sm_mapdef sm_envdef sm_libs sm_editmap_envdef sm_editmap_libs sm_libmilter_envdef sm_libmilter_libs sm_libsm_envdef sm_libsm_libs sm_libsmdb_envdef sm_libsmdb_libs sm_libsmutil_envdef sm_libsmutil_libs sm_mail_local_envdef sm_mail_local_libs sm_mailstats_envdef sm_mailstats_libs sm_makemap_envdef sm_makemap_libs sm_praliases_envdef sm_praliases_libs sm_rmail_envdef sm_rmail_libs sm_sendmail_envdef sm_sendmail_libs sm_smrsh_envdef sm_smrsh_libs sm_vacation_envdef sm_vacation_libs sm_databases sm_features sm_badepends sm_depends sm_recommends sm_suggests sm_newdb_lib sm_ldap_lib sm_hesiod_parms sm_ffr sm_m4_ffr sm_enable_doc sm_enable_dev sm_enable_shm sm_enable_milter sm_enable_regex sm_enable_ndbm sm_enable_newdb sm_enable_nis sm_enable_nisplus sm_enable_ldap SM_ENABLE_LDAP_TRUE SM_ENABLE_LDAP_FALSE sm_enable_bind sm_enable_hesiod sm_enable_tcpd sm_enable_ipv6 sm_enable_maillock sm_enable_sfio sm_enable_auth sm_auth_lib SM_ENABLE_AUTH_TRUE SM_ENABLE_AUTH_FALSE sm_enable_tls SM_ENABLE_TLS_TRUE SM_ENABLE_TLS_FALSE LIBOBJS LTLIBOBJS' +ac_subst_files='' # Initialize some variables set by options. ac_init_help= @@ -675,7 +691,7 @@ done # Be sure to have absolute paths. for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ - localstatedir libdir includedir oldincludedir infodir mandir + localstatedir libdir includedir oldincludedir infodir mandir do eval ac_val=$`echo $ac_var` case $ac_val in @@ -715,10 +731,10 @@ if test -z "$srcdir"; then # Try the directory containing this script, then its parent. ac_confdir=`(dirname "$0") 2>/dev/null || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$0" : 'X\(//\)[^/]' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } @@ -741,6 +757,9 @@ if test ! -r $srcdir/$ac_unique_file; then { (exit 1); exit 1; }; } fi fi +(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || + { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 + { (exit 1); exit 1; }; } srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` ac_env_build_alias_set=${build_alias+set} ac_env_build_alias_value=$build_alias @@ -782,7 +801,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures Sendmail 8.12.7 to adapt to many kinds of systems. +\`configure' configures Sendmail 8.13.3 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -807,9 +826,9 @@ _ACEOF cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] + [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] + [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify @@ -834,18 +853,30 @@ Fine tuning of the installation directories: _ACEOF cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] + --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of Sendmail 8.12.7:";; + short | recursive ) echo "Configuration of Sendmail 8.13.3:";; esac cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-maintainer-mode enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer --enable-regex=.........Allow REGEX maps [auto] --enable-ndbm=..........Allow NDBM maps [auto] --enable-newdb=.........Allow NEWDB maps [auto] @@ -864,6 +895,8 @@ Optional Features: --enable-shm=...........Allow shared memory [auto] --enable-doc=...........Build sendmail-doc pkg --enable-dev=...........Build libmilter-dev pkg + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] @@ -871,6 +904,7 @@ Optional Packages: --with-buildtree=.......Build directory [.] --with-docdir=..........Document directory [PREFIX/doc] --with-revision=........Package revision [''] + --with-custom=..........Custom package name [''] Some influential environment variables: CC C compiler command @@ -918,12 +952,45 @@ case $srcdir in ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac -# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be -# absolute. -ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` -ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd` -ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` -ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac cd $ac_dir # Check for guested configure; otherwise get Cygnus style configure. @@ -934,39 +1001,39 @@ ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` echo $SHELL $ac_srcdir/configure --help=recursive elif test -f $ac_srcdir/configure.ac || - test -f $ac_srcdir/configure.in; then + test -f $ac_srcdir/configure.in; then echo $ac_configure --help else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi - cd $ac_popdir + cd "$ac_popdir" done fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF -Sendmail configure 8.12.7 -generated by GNU Autoconf 2.53 +Sendmail configure 8.13.3 +generated by GNU Autoconf 2.59 -Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 -Free Software Foundation, Inc. +Copyright (C) 2003 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. # # $Sendmail$ -# from Sendmail: ./configure.ac,v 8.12.7 2003-01-20 15:00:00 +# from Sendmail: ./configure.ac,v 8.13.3 2005-02-21 21:00:00 # cat <<EOF - Copyright (c) 1998-2003 Richard Nelson. All Rights Reserved. + Copyright (c) 1998-2005 Richard Nelson. All Rights Reserved. - Generated by Autoconf 2.53 for Sendmail 8.12.7 + Sendmail 8.13.3 + Generated by Autoconf 2.59, Automake 1.9 Debian configure script for building Sendmail - Note: this file supports Sendmail 8.7.6 - 8.12.7 + Note: this file supports Sendmail 8.7.6 - 9.0.0 and has been tested on autoconf 2.12, 2.13, 2.50, 2.52, 2.53 @@ -980,8 +1047,8 @@ cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by Sendmail $as_me 8.12.7, which was -generated by GNU Autoconf 2.53. Invocation command line was +It was created by Sendmail $as_me 8.13.3, which was +generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ @@ -1033,27 +1100,54 @@ _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= +ac_configure_args0= +ac_configure_args1= ac_sep= -for ac_arg +ac_must_keep_next=false +for ac_pass in 1 2 do - case $ac_arg in - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n ) continue ;; - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - continue ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) - ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" - ac_sep=" " ;; - esac - # Get rid of the leading space. + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + # Get rid of the leading space. + ac_sep=" " + ;; + esac + done done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there @@ -1064,6 +1158,7 @@ trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo + cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## @@ -1076,16 +1171,45 @@ _ASBOX case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in *ac_space=\ *) sed -n \ - "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ;; *) sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------- ## +## Output files. ## +## ------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + fi + if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## @@ -1093,14 +1217,14 @@ _ASBOX ## ----------- ## _ASBOX echo - sed "/^$/d" confdefs.h + sed "/^$/d" confdefs.h | sort echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 - rm -f core core.* *.core && + rm -f core *.core && rm -rf conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 @@ -1180,7 +1304,7 @@ fi # value. ac_cache_corrupted=false for ac_var in `(set) 2>&1 | - sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val="\$ac_cv_env_${ac_var}_value" @@ -1197,13 +1321,13 @@ echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then - { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} - { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} - ac_cache_corrupted=: + ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. @@ -1258,7 +1382,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu -ac_version='2.53'; + ac_aux_dir= for ac_dir in ./build $srcdir/./build; do if test -f $ac_dir/install-sh; then @@ -1283,13 +1407,536 @@ fi ac_config_guess="$SHELL $ac_aux_dir/config.guess" ac_config_sub="$SHELL $ac_aux_dir/config.sub" ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. +# Make sure we can run config.sub. +$ac_config_sub sun4 >/dev/null 2>&1 || + { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 +echo "$as_me: error: cannot run $ac_config_sub" >&2;} + { (exit 1); exit 1; }; } + +echo "$as_me:$LINENO: checking build system type" >&5 +echo $ECHO_N "checking build system type... $ECHO_C" >&6 +if test "${ac_cv_build+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_build_alias=$build_alias +test -z "$ac_cv_build_alias" && + ac_cv_build_alias=`$ac_config_guess` +test -z "$ac_cv_build_alias" && + { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +echo "${ECHO_T}$ac_cv_build" >&6 +build=$ac_cv_build +build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +echo "$as_me:$LINENO: checking host system type" >&5 +echo $ECHO_N "checking host system type... $ECHO_C" >&6 +if test "${ac_cv_host+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_host_alias=$host_alias +test -z "$ac_cv_host_alias" && + ac_cv_host_alias=$ac_cv_build_alias +ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +echo "${ECHO_T}$ac_cv_host" >&6 +host=$ac_cv_host +host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + +echo "$as_me:$LINENO: checking target system type" >&5 +echo $ECHO_N "checking target system type... $ECHO_C" >&6 +if test "${ac_cv_target+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_target_alias=$target_alias +test "x$ac_cv_target_alias" = "x" && + ac_cv_target_alias=$ac_cv_host_alias +ac_cv_target=`$ac_config_sub $ac_cv_target_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_target_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_target_alias failed" >&2;} + { (exit 1); exit 1; }; } -SM_VERS='8.12.7'; -SM_DATE='2003-01-20 15:00:00'; +fi +echo "$as_me:$LINENO: result: $ac_cv_target" >&5 +echo "${ECHO_T}$ac_cv_target" >&6 +target=$ac_cv_target +target_cpu=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +target_vendor=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +target_os=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + +# The aliases save the names the user supplied, while $host etc. +# will get canonicalized. +test -n "$target_alias" && + test "$program_prefix$program_suffix$program_transform_name" = \ + NONENONEs,x,x, && + program_prefix=${target_alias}- +test "$program_prefix" != NONE && + program_transform_name="s,^,$program_prefix,;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s,\$,$program_suffix,;$program_transform_name" +# Double any \ or $. echo might interpret backslashes. +# By default was `s,x,x', remove it if useless. +cat <<\_ACEOF >conftest.sed +s/[\\$]/&&/g;s/;s,x,x,$// +_ACEOF +program_transform_name=`echo $program_transform_name | sed -f conftest.sed` +rm conftest.sed + +echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\_ACEOF +all: + @echo 'ac_maketemp="$(MAKE)"' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftest.make +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + SET_MAKE= +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + +am__api_version="1.9" +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done + + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +echo "$as_me:$LINENO: checking whether build environment is sane" >&5 +echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&5 +echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&2;} + { (exit 1); exit 1; }; } + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! +Check your system clock" >&5 +echo "$as_me: error: newly created file is older than distributed files! +Check your system clock" >&2;} + { (exit 1); exit 1; }; } +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 +echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + # We used to keeping the `.' as first argument, in order to + # allow $(mkdir_p) to be used without argument. As in + # $(mkdir_p) $(somedir) + # where $(somedir) is conditionally defined. However this is wrong + # for two reasons: + # 1. if the package is installed by a user who cannot write `.' + # make install will fail, + # 2. the above comment should most certainly read + # $(mkdir_p) $(DESTDIR)$(somedir) + # so it does not work when $(somedir) is undefined and + # $(DESTDIR) is not. + # To support the latter case, we have to write + # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), + # so the `.' trick is pointless. + mkdir_p='mkdir -p --' +else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + for d in ./-p ./--version; + do + test -d $d && rmdir $d + done + # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. + if test -f "$ac_aux_dir/mkinstalldirs"; then + mkdir_p='$(mkinstalldirs)' + else + mkdir_p='$(install_sh) -d' + fi +fi + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AWK+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + echo "$as_me:$LINENO: result: $AWK" >&5 +echo "${ECHO_T}$AWK" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$AWK" && break +done + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} + { (exit 1); exit 1; }; } +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='sendmail' + VERSION='8.13.3' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +install_sh=${install_sh-"$am_aux_dir/install-sh"} + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + echo "$as_me:$LINENO: result: $STRIP" >&5 +echo "${ECHO_T}$STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +echo "${ECHO_T}$ac_ct_STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + STRIP=$ac_ct_STRIP +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' + + + + + +echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 +echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6 + # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then + enableval="$enable_maintainer_mode" + USE_MAINTAINER_MODE=$enableval +else + USE_MAINTAINER_MODE=no +fi; + echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 +echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6 + + +if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + + MAINT=$MAINTAINER_MODE_TRUE + + +ac_version="2.59"; +am_version="1.9"; + + +am_version="$am__api_version"; + + +SM_VERS='8.13.3'; +SM_DATE='2005-02-21 21:00:00'; SM_MINVERS='8.7.6'; -SM_MAXVERS='8.12.7'; -SM_CPYRT='2003'; +SM_MAXVERS='9.0.0'; +SM_CPYRT='2005'; @@ -1344,12 +1991,14 @@ PACKAGE_STRING="${PACKAGE_NAME} ${PACKAGE_VERSION}"; # minor = last component (8.9.3 -> 3) # beta = suffix for beta version (8.12.0.Beta7 -> 7) # math = for numeric (<, >=, etc.) comparisons -# 8.12.7 = 527367 (8.12 = 527360) -# 8.11.6 = 527110 (8.11 = 527104) -# 8.10.2 = 526850 (8.10 = 526848) -# 8.9.3 = 526595 (8.9 = 526592) -# 8.8.8 = 526344 (8.8 = 526336) -# 8.7.6 = 526086 (8.7 = 526080) +# 9.0.0 = 589824 (9.0 = 589824) +# 8.13.1 = 527617 (8.13 = 527616) +# 8.12.11 = 527371 (8.12 = 527360) +# 8.11.7 = 527111 (8.11 = 527104) +# 8.10.2 = 526850 (8.10 = 526848) +# 8.9.3 = 526595 (8.9 = 526592) +# 8.8.8 = 526344 (8.8 = 526336) +# 8.7.6 = 526086 (8.7 = 526080) v2i () { sm_version_test=`expr 65536 \* $(expr "$1" : '\([0-9]*\)') + \ 256 \* $(expr "$1" : '[0-9]*\.\([0-9]*\)') + \ @@ -1424,6 +2073,14 @@ if test "${with_revision+set}" = set; then else sm_revision='' fi; + +# Check whether --with-custom or --without-custom was given. +if test "${with_custom+set}" = set; then + withval="$with_custom" + sm_custom="$withval" +else + sm_custom='' +fi; # Check whether --enable-regex or --disable-regex was given. if test "${enable_regex+set}" = set; then enableval="$enable_regex" @@ -1576,6 +2233,8 @@ eval mandir="${mandir}"; eval srcdir="${srcdir}"; +test -n "$sm_custom" && sm_custom="${sm_custom}."; + eval buildtree="${buildtree}"; eval docdir="${docdir}"; @@ -1630,9 +2289,10 @@ echo "${ECHO_T}$DEBIAN, using debhelper v$DEBIAN_DH" >&6 #------------------------------------------------------------------- echo "" -echo "Autoconf ${ac_version} for Sendmail ${sm_version}${sm_revision} \ +echo "Sendmail ${sm_custom}${sm_version}${sm_revision} \ on ${sm_dist_name} ${sm_dist_vers} ${sm_build_arch}/${sm_host_arch}."; -echo "" +echo "Generated by Autoconf ${ac_version}, Automake ${am_version}."; +echo ""; #------------------------------------------------------------------- # Required programs @@ -1845,9 +2505,7 @@ if test $ac_prog_rejected = yes; then # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift - set dummy "$as_dir/$ac_word" ${1+"$@"} - shift - ac_cv_prog_CC="$@" + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi @@ -1952,8 +2610,10 @@ fi fi -test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH" >&5 -echo "$as_me: error: no acceptable C compiler found in \$PATH" >&2;} +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. @@ -1977,15 +2637,12 @@ ac_compiler=`set X $ac_compile; echo $2` (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" - -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + int main () { @@ -1995,12 +2652,12 @@ main () } _ACEOF ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.exe" +ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -echo "$as_me:$LINENO: checking for C compiler default output" >&5 -echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6 +echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 (eval $ac_link_default) 2>&5 @@ -2014,26 +2671,39 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 # Be careful to initialize this variable, since it used to be cached. # Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. ac_cv_exeext= -for ac_file in `ls a_out.exe a.exe conftest.exe 2>/dev/null; - ls a.out conftest 2>/dev/null; - ls a.* conftest.* 2>/dev/null`; do +# b.out is created by i960 compilers. +for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out +do + test -f "$ac_file" || continue case $ac_file in - *.$ac_ext | *.o | *.obj | *.xcoff | *.tds | *.d | *.pdb | *.xSYM ) ;; - a.out ) # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - # FIXME: I believe we export ac_cv_exeext for Libtool --akim. - export ac_cv_exeext - break;; - * ) break;; + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) + ;; + conftest.$ac_ext ) + # This is the source file. + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool, + # but it would be cool to find out if it's true. Does anybody + # maintain Libtool? --akim. + export ac_cv_exeext + break;; + * ) + break;; esac done else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 -{ { echo "$as_me:$LINENO: error: C compiler cannot create executables" >&5 -echo "$as_me: error: C compiler cannot create executables" >&2;} +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi @@ -2060,9 +2730,11 @@ if test "$cross_compiling" != yes; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'." >&5 +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'." >&2;} +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi @@ -2070,7 +2742,7 @@ fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 -rm -f a.out a.exe conftest$ac_cv_exeext +rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. @@ -2090,18 +2762,21 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. -for ac_file in `(ls conftest.exe; ls conftest; ls conftest.*) 2>/dev/null`; do +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue case $ac_file in - *.$ac_ext | *.o | *.obj | *.xcoff | *.tds | *.d | *.pdb ) ;; + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - export ac_cv_exeext - break;; + export ac_cv_exeext + break;; * ) break;; esac done else - { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link" >&5 -echo "$as_me: error: cannot compute suffix of executables: cannot compile and link" >&2;} + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi @@ -2118,15 +2793,12 @@ if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" - -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + int main () { @@ -2143,16 +2815,19 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (exit $ac_status); }; then for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb ) ;; + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 -{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile" >&5 -echo "$as_me: error: cannot compute suffix of object files: cannot compile" >&2;} +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi @@ -2168,15 +2843,12 @@ if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" - -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + int main () { @@ -2190,11 +2862,20 @@ main () _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2203,10 +2884,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_compiler_gnu=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi @@ -2222,15 +2904,12 @@ if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" - -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + int main () { @@ -2241,11 +2920,20 @@ main () _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2254,10 +2942,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_prog_cc_g=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 @@ -2276,6 +2965,120 @@ else CFLAGS= fi fi +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <stdarg.h> +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std1 is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std1. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + # Some people use a C++ compiler to compile C. Since we use `exit', # in C++ we need to declare it. In case someone uses the same compiler # for both compiling C and C++ we need to have the C++ compiler decide @@ -2287,19 +3090,27 @@ cat >conftest.$ac_ext <<_ACEOF _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then for ac_declaration in \ - ''\ - '#include <stdlib.h>' \ + '' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ @@ -2307,16 +3118,13 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" -#include <stdlib.h> +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_declaration -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif +#include <stdlib.h> int main () { @@ -2327,11 +3135,20 @@ exit (42); _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2340,20 +3157,18 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 : else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + continue fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_declaration -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -2364,11 +3179,20 @@ exit (42); _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2377,9 +3201,10 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 break else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then @@ -2390,14 +3215,189 @@ fi else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu +DEPDIR="${am__leading_dot}deps" + + ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 +echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi + + +echo "$as_me:$LINENO: result: $_am_result" >&5 +echo "${ECHO_T}$_am_result" >&6 +rm -f confinc confmf + +# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then + enableval="$enable_dependency_tracking" + +fi; +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + + +if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + + +depcc="$CC" am_compiler_list= + +echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -2422,24 +3422,34 @@ for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" -#include <assert.h> - Syntax error +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? - egrep -v '^ *\+' conftest.er1 >conftest.err + grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -2450,7 +3460,8 @@ if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Broken: fails on valid input. continue fi @@ -2459,20 +3470,24 @@ rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <ac_nonexistent.h> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? - egrep -v '^ *\+' conftest.er1 >conftest.err + grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -2484,7 +3499,8 @@ if test -z "$ac_cpp_err"; then continue else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Passes both tests. ac_preproc_ok=: break @@ -2513,24 +3529,34 @@ for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" -#include <assert.h> - Syntax error +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? - egrep -v '^ *\+' conftest.er1 >conftest.err + grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -2541,7 +3567,8 @@ if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Broken: fails on valid input. continue fi @@ -2550,20 +3577,24 @@ rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <ac_nonexistent.h> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? - egrep -v '^ *\+' conftest.er1 >conftest.err + grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -2575,7 +3606,8 @@ if test -z "$ac_cpp_err"; then continue else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + # Passes both tests. ac_preproc_ok=: break @@ -2588,8 +3620,10 @@ rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else - { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check" >&5 -echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&2;} + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi @@ -2610,6 +3644,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 @@ -2626,6 +3661,7 @@ do case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. @@ -2633,20 +3669,20 @@ case $as_dir/ in # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi done done ;; @@ -2676,6 +3712,32 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' +echo "$as_me:$LINENO: checking whether ln -s works" >&5 +echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:$LINENO: result: no, using $LN_S" >&5 +echo "${ECHO_T}no, using $LN_S" >&6 +fi + +echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6 +if test "${ac_cv_prog_egrep+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 +echo "${ECHO_T}$ac_cv_prog_egrep" >&6 + EGREP=$ac_cv_prog_egrep + + @@ -2685,49 +3747,67 @@ if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <stdlib.h> #include <stdarg.h> #include <string.h> #include <float.h> +int +main () +{ + + ; + return 0; +} _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? - egrep -v '^ *\+' conftest.er1 >conftest.err + grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 - ac_cv_header_stdc=no +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_stdc=no fi -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <string.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "memchr" >/dev/null 2>&1; then + $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no @@ -2739,13 +3819,16 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <stdlib.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "free" >/dev/null 2>&1; then + $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no @@ -2760,16 +3843,20 @@ if test $ac_cv_header_stdc = yes; then : else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <ctype.h> #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else -# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif @@ -2780,7 +3867,7 @@ main () int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) + || toupper (i) != TOUPPER (i)) exit(2); exit (0); } @@ -2800,11 +3887,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ( exit $ac_status ) ac_cv_header_stdc=no fi -rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi @@ -2831,16 +3919,16 @@ sm_libs=''; sm_editmap_envdef=''; sm_editmap_libs=''; # libmilter -sm_libmilter_envdef=''; +sm_libmilter_envdef='-fPIC'; sm_libmilter_libs=''; # libsm -sm_libsm_envdef=''; +sm_libsm_envdef='-fPIC'; sm_libsm_libs=''; # libsmdb sm_libsmdb_envdef=''; sm_libsmdb_libs=''; # libsmutil -sm_libsmutil_envdef=''; +sm_libsmutil_envdef='-fPIC'; sm_libsmutil_libs=''; # mail.local sm_mail_local_envdef=''; @@ -2895,21 +3983,39 @@ sm_smrsh_envdef="$sm_smrsh_envdef \ sm_smrsh_envdef="$sm_smrsh_envdef -DPATH=\\\"/usr/bin:/bin\\\""; # # Everything we'll build on has strerror(3) -sm_libsm_envdef="$sm_libsm_envdef -DHASSTRERROR=1"; -sm_sendmail_envdef="$sm_sendmail_envdef -DHASSTRERROR=1"; +# sm_envdef="$sm_envdef -DHASSTRERROR=1"; # # The next two require a patch to {include/sm,sendmail,src}/conf.h # and would give duplicate definition warnings if left herein -#sm_sendmail_envdef="$sm_sendmail_envdef -DUSESETEUID=1 -DHASGETUSERSHELL=1"; -sm_sendmail_envdef="$sm_sendmail_envdef -DHASFCHMOD=1 -DHASSETRLIMIT=1"; +#sm_envdef="$sm_envdef -DUSESETEUID=1 -DHASGETUSERSHELL=1"; +sm_envdef="$sm_envdef -DHASFCHMOD=1 -DHASSETRLIMIT=1"; +# +# Back by request... +#sm_envdef="$sm_envdef -DPICKY_HELO_CHECK"; # # flock() doens't work over NFS and there's a rumour of b0rkedness in # Linux 2.4.x kernels ;( -sm_sendmail_envdef="$sm_sendmail_envdef -DHASFLOCK=0"; +sm_envdef="$sm_envdef -DHASFLOCK=0"; +sm_libsm_envdef="$sm_libsm_envdef -DHAVE_NANOSLEEP=1"; +sm_ffr="$sm_ffr -D_FFR_QUEUE_SCHED_DBG"; # %%%%%% TESTING %%%%%%%% # # version specific setup -if test "$sm_version_major" = "8.12"; then - sm_sendmail_envdef="$sm_sendmail_envdef -DUSESETEUID=1 -DHASGETUSERSHELL=1"; +if test "$sm_version_major" = "8.13"; then + sm_ffr="$sm_ffr -D_FFR_SKIP_DOMAINS"; + sm_mapdef="$sm_mapdef -DSOCKETMAP"; + sm_ffr="$sm_ffr -D_FFR_BLOCK_PROXIES"; + sm_envdef="$sm_envdef -DUSESETEUID=1 -DHASGETUSERSHELL=1"; + sm_ffr="$sm_ffr -D_FFR_GROUPREADABLEAUTHINFOFILE"; + sm_ffr="$sm_ffr -D_FFR_CONTROL_MSTAT"; + sm_ffr="$sm_ffr -D_FFR_DAEMON_NETUNIX"; + sm_ffr="$sm_ffr -D_FFR_NO_PIPE"; + sm_ffr="$sm_ffr -D_FFR_SHM_STATUS"; + sm_ffr="$sm_ffr -D_FFR_RHS"; + sm_ffr="$sm_ffr -D_FFR_MAIL_MACRO"; + sm_ffr="$sm_ffr -D_FFR_HELONAME"; + sm_m4_ffr="$sm_m4_ffr define(\`_FFR_MAIL_MACRO')"; +elif test "$sm_version_major" = "8.12"; then + sm_envdef="$sm_envdef -DUSESETEUID=1 -DHASGETUSERSHELL=1"; # # Note: There is a problem with both <=2.2.19 and <=2.4.2-acx in # that setitimer() sometimes looses events, this is mentioned @@ -2917,22 +4023,20 @@ if test "$sm_version_major" = "8.12"; then # heavy loading. So, we revert back to alarm() - which, thusfar # has proven stable. # Note: This actually seems to have been a sendmail issue fixed in 8.12.3 - sm_libsm_envdef="$sm_libsm_envdef -DSM_CONF_SETITIMER=1"; + sm_envdef="$sm_envdef -DSM_CONF_SETITIMER=0"; # - # Note: this *only* for testing... there is a performance hit - #sm_libsm_envdef="$sm_libsm_envdef -DSM_OMIT_BOGUS_WARNINGS"; sm_ffr="$sm_ffr -D_FFR_MAX_FORWARD_ENTRIES=1"; sm_ffr="$sm_ffr -D_FFR_QUEUEDELAY=1"; sm_ffr="$sm_ffr -D_FFR_CONTROL_MSTAT"; sm_ffr="$sm_ffr -D_FFR_GROUPREADABLEAUTHINFOFILE"; sm_ffr="$sm_ffr -D_FFR_DAEMON_NETUNIX"; sm_ffr="$sm_ffr -D_FFR_SHM_STATUS"; - sm_ffr="$sm_ffr -D_FFR_QUEUE_SCHED_DBG"; # Debugging....%%%%%%%%%%%% sm_ffr="$sm_ffr -D_FFR_RHS"; sm_ffr="$sm_ffr -D_FFR_MAIL_MACRO"; sm_m4_ffr="$sm_m4_ffr define(\`_FFR_MAIL_MACRO')"; sm_ffr="$sm_ffr -D_FFR_NO_PIPE"; sm_ffr="$sm_ffr -D_FFR_QUARANTINE"; + sm_ffr="$sm_ffr -D_FFR_DEAL_WITH_ERROR_SSL"; sm_mailstats_envdef="$sm_mailstats_envdef -D_FFR_QUARANTINE"; sm_vacation_envdef="$sm_vaction_envdef -D_FFR_RETURN_ADDR"; elif test "$sm_version_major" = "8.11"; then @@ -3058,13 +4162,22 @@ if test "$sm_enable_milter" != "no"; then sm_enable_milter=yes; v2i 8.12.0; if test $sm_version_math -ge $sm_version_test; then - sm_sendmail_envdef="$sm_sendmail_envdef -DMILTER"; - sm_libmilter_envdef="$sm_libmilter_envdef \ + sm_libmilter_envdef="$sm_libmilter_envdef -D_FFR_MULTILINE"; + v2i 8.13.0; + if test $sm_version_math -lt $sm_version_test; then + sm_sendmail_envdef="$sm_sendmail_envdef -DMILTER"; + sm_libmilter_envdef="$sm_libmilter_envdef \ -D_FFR_MILTER_ROOT_UNSAFE"; + fi; + sm_libmilter_libs="$sm_libmilter_libs" else sm_libmilter_envdef="$sm_libmilter_envdef -D_FFR_MILTER"; sm_sendmail_envdef="$sm_sendmail_envdef -D_FFR_MILTER"; fi; + v2i 8.11.0; + if test $sm_version_math -ge $sm_version_test; then + sm_libmilter_envdef="$sm_libmilter_envdef -D_FFR_SMFI_PROGRESS"; + fi; fi; fi; @@ -3096,13 +4209,6 @@ echo "$as_me: WARNING: TLS is disabled, no need for SFIO" >&2;} fi; #------------------------------------------------------------------- -# logrotate - not on Debian Slink (2.1) -#------------------------------------------------------------------- -if test "${DEBIAN_DH}" != '1'; then - sm_suggests="$sm_suggests, logrotate"; - fi; - -#------------------------------------------------------------------- # # Check for presence of REGEX headers # @@ -3119,7 +4225,7 @@ if test $sm_enable_regex != no; then for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h + inttypes.h stdint.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_header" >&5 @@ -3128,19 +4234,31 @@ if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3149,10 +4267,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + eval "$as_ac_Header=no" fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 @@ -3183,18 +4302,30 @@ else echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3203,10 +4334,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_compiler=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 @@ -3214,20 +4346,24 @@ echo "${ECHO_T}$ac_header_compiler" >&6 echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? - egrep -v '^ *\+' conftest.er1 >conftest.err + grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -3238,7 +4374,8 @@ if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext @@ -3246,26 +4383,43 @@ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? -case $ac_header_compiler:$ac_header_preproc in - yes:no ) +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; - no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------------------------ ## +## Report this to bug/reportbug or sendmail@packages.debian.org ## +## ------------------------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - eval "$as_ac_Header=$ac_header_preproc" + eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 @@ -3291,49 +4445,72 @@ if test "${ac_cv_func_regfree+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define regfree to an innocuous variant, in case <limits.h> declares regfree. + For example, HP-UX 11i <limits.h> declares gettimeofday. */ +#define regfree innocuous_regfree + /* System header to define __stub macros and hopefully few prototypes, - which can conflict with char regfree (); below. */ -#include <assert.h> + which can conflict with char regfree (); below. + Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + <limits.h> exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + +#undef regfree + /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" +{ #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char regfree (); -char (*f) (); - -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif -int -main () -{ /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_regfree) || defined (__stub___regfree) choke me #else -f = regfree; +char (*f) () = regfree; +#endif +#ifdef __cplusplus +} #endif +int +main () +{ +return f != regfree; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3342,10 +4519,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_func_regfree=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_func_regfree=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_regfree" >&5 echo "${ECHO_T}$ac_cv_func_regfree" >&6 @@ -3399,18 +4578,30 @@ else echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3419,10 +4610,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_compiler=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 @@ -3430,20 +4622,24 @@ echo "${ECHO_T}$ac_header_compiler" >&6 echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? - egrep -v '^ *\+' conftest.er1 >conftest.err + grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -3454,7 +4650,8 @@ if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext @@ -3462,26 +4659,43 @@ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? -case $ac_header_compiler:$ac_header_preproc in - yes:no ) +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; - no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------------------------ ## +## Report this to bug/reportbug or sendmail@packages.debian.org ## +## ------------------------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - eval "$as_ac_Header=$ac_header_preproc" + eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 @@ -3502,8 +4716,11 @@ done if test $sm_have_ndbm != no; then cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #if defined(HAVE_DB1_NDBM_H) #include <db1/ndbm.h> @@ -3514,7 +4731,7 @@ done _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "DBM_PAGFNO_NOT_AVAILABLE" >/dev/null 2>&1; then + $EGREP "DBM_PAGFNO_NOT_AVAILABLE" >/dev/null 2>&1; then sm_have_ndbm=no fi rm -f conftest* @@ -3535,16 +4752,13 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-lndbm $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -3555,11 +4769,20 @@ main (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3568,10 +4791,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_ndbm_main=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_lib_ndbm_main=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_ndbm_main" >&5 @@ -3647,18 +4872,30 @@ else echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3667,10 +4904,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_compiler=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 @@ -3678,20 +4916,24 @@ echo "${ECHO_T}$ac_header_compiler" >&6 echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? - egrep -v '^ *\+' conftest.er1 >conftest.err + grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -3702,7 +4944,8 @@ if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext @@ -3710,26 +4953,43 @@ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? -case $ac_header_compiler:$ac_header_preproc in - yes:no ) +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; - no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------------------------ ## +## Report this to bug/reportbug or sendmail@packages.debian.org ## +## ------------------------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - eval "$as_ac_Header=$ac_header_preproc" + eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 @@ -3744,11 +5004,11 @@ fi done - if test $ac_cv_header_db4_db_h = yes -o \ - $ac_cv_header_db3_db_h = yes -o \ - $ac_cv_header_db2_db_h = yes -o \ - $ac_cv_header_db1_db_h = yes -o \ - $ac_cv_header_db_h = yes ; then + if [ $ac_cv_header_db4_db_h = yes ] \ + || [ $ac_cv_header_db3_db_h = yes ] \ + || [ $ac_cv_header_db2_db_h = yes ] \ + || [ $ac_cv_header_db1_db_h = yes ] \ + || [ $ac_cv_header_db_h = yes ]; then sm_have_newdb=yes; fi; @@ -3756,8 +5016,11 @@ done echo "$as_me:$LINENO: checking newdb version" >&5 echo $ECHO_N "checking newdb version... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #if defined(HAVE_DB4_DB_H) #include <db4/db.h> @@ -3770,13 +5033,16 @@ echo $ECHO_N "checking newdb version... $ECHO_C" >&6 _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "sm_newdb_lib=4" >/dev/null 2>&1; then - sm_newdb_lib=db-4.0 + $EGREP "sm_newdb_lib=4" >/dev/null 2>&1; then + sm_newdb_lib=db-4.2 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #if defined(HAVE_DB3_DB_H) #include <db3/db.h> @@ -3789,13 +5055,16 @@ else _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "sm_newdb_lib=3" >/dev/null 2>&1; then + $EGREP "sm_newdb_lib=3" >/dev/null 2>&1; then sm_newdb_lib=db3 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #if defined(HAVE_DB2_DB_H) #include <db2/db.h> @@ -3808,13 +5077,16 @@ else _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "sm_newdb_lib=2" >/dev/null 2>&1; then + $EGREP "sm_newdb_lib=2" >/dev/null 2>&1; then sm_newdb_lib=db2 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #if defined(HAVE_DB1_DB_H) #include <db1/db.h> @@ -3830,7 +5102,7 @@ else _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "sm_newdb_lib=1" >/dev/null 2>&1; then + $EGREP "sm_newdb_lib=1" >/dev/null 2>&1; then sm_newdb_lib=db1 fi rm -f conftest* @@ -3850,14 +5122,14 @@ rm -f conftest* # < 8.10.x can't handle db3+ v2i 8.10.0; if test $sm_version_math -lt $sm_version_test; then - #if test $ac_cv_header_db3_db_185_h = yes -o \ - # $ac_cv_header_db_185_h = yes; then + #if t[ $ac_cv_header_db3_db_185_h = yes ] \ + #|| [ $ac_cv_header_db_185_h = yes ]; then # sm_use_185=yes; #else ac_cv_header_db4_db_h=no; ac_cv_header_db3_db_h=no; - if test $sm_newdb_lib = db-4.0 -o \ - $sm_newdb_lib = db3; then + if [ $sm_newdb_lib = db-4.2 ] \ + || [ $sm_newdb_lib = db3 ]; then if test $ac_cv_header_db2_db_h = yes; then { echo "$as_me:$LINENO: WARNING: <8.10.0 & $sm_newdb_lib: trying db2" >&5 echo "$as_me: WARNING: <8.10.0 & $sm_newdb_lib: trying db2" >&2;} @@ -3895,18 +5167,21 @@ echo "$as_me: WARNING: NEWDB version unknown, omitting support!" >&2;} # then check to see if -ldb will work if test $sm_have_newdb != no; then sm_old_libs="$LIBS"; - if test $sm_newdb_lib = db-4.0; then - as_ac_Lib=`echo "ac_cv_lib_$sm_newdb_lib''_db_create_4000" | $as_tr_sh` -echo "$as_me:$LINENO: checking for db_create_4000 in -l$sm_newdb_lib" >&5 -echo $ECHO_N "checking for db_create_4000 in -l$sm_newdb_lib... $ECHO_C" >&6 + if test $sm_newdb_lib = db-4.2; then + as_ac_Lib=`echo "ac_cv_lib_$sm_newdb_lib''_db_create_4002" | $as_tr_sh` +echo "$as_me:$LINENO: checking for db_create_4002 in -l$sm_newdb_lib" >&5 +echo $ECHO_N "checking for db_create_4002 in -l$sm_newdb_lib... $ECHO_C" >&6 if eval "test \"\${$as_ac_Lib+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$sm_newdb_lib $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -3914,28 +5189,31 @@ extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ -char db_create_4000 (); -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif +char db_create_4002 (); int main () { -db_create_4000 (); +db_create_4002 (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3944,10 +5222,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 eval "$as_ac_Lib=yes" else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + eval "$as_ac_Lib=no" fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Lib'}'`" >&5 @@ -3956,16 +5236,19 @@ if test `eval echo '${'$as_ac_Lib'}'` = yes; then : else - echo "$as_me:$LINENO: checking for db_create_4000 in -ldb" >&5 -echo $ECHO_N "checking for db_create_4000 in -ldb... $ECHO_C" >&6 -if test "${ac_cv_lib_db_db_create_4000+set}" = set; then + echo "$as_me:$LINENO: checking for db_create_4002 in -ldb" >&5 +echo $ECHO_N "checking for db_create_4002 in -ldb... $ECHO_C" >&6 +if test "${ac_cv_lib_db_db_create_4002+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldb $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -3973,45 +5256,50 @@ extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ -char db_create_4000 (); -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif +char db_create_4002 (); int main () { -db_create_4000 (); +db_create_4002 (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then - ac_cv_lib_db_db_create_4000=yes + ac_cv_lib_db_db_create_4002=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 -ac_cv_lib_db_db_create_4000=no +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_db_db_create_4002=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_db_db_create_4000" >&5 -echo "${ECHO_T}$ac_cv_lib_db_db_create_4000" >&6 -if test $ac_cv_lib_db_db_create_4000 = yes; then +echo "$as_me:$LINENO: result: $ac_cv_lib_db_db_create_4002" >&5 +echo "${ECHO_T}$ac_cv_lib_db_db_create_4002" >&6 +if test $ac_cv_lib_db_db_create_4002 = yes; then sm_newdb_lib='db' else sm_have_newdb=no @@ -4028,8 +5316,11 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-l$sm_newdb_lib $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -4038,12 +5329,6 @@ extern "C" /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char db_create (); -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -4054,11 +5339,20 @@ db_create (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4067,10 +5361,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 eval "$as_ac_Lib=yes" else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + eval "$as_ac_Lib=no" fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Lib'}'`" >&5 @@ -4087,8 +5383,11 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-ldb $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -4097,12 +5396,6 @@ extern "C" /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char db_create (); -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -4113,11 +5406,20 @@ db_create (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4126,10 +5428,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_db_db_create=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_lib_db_db_create=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_db_db_create" >&5 @@ -4151,8 +5455,11 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-l$sm_newdb_lib $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -4161,12 +5468,6 @@ extern "C" /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char db_open (); -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -4177,11 +5478,20 @@ db_open (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4190,10 +5500,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 eval "$as_ac_Lib=yes" else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + eval "$as_ac_Lib=no" fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Lib'}'`" >&5 @@ -4210,8 +5522,11 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-ldb $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -4220,12 +5535,6 @@ extern "C" /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char db_open (); -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -4236,11 +5545,20 @@ db_open (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4249,10 +5567,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_db_db_open=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_lib_db_db_open=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_db_db_open" >&5 @@ -4274,8 +5594,11 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-l$sm_newdb_lib $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -4284,12 +5607,6 @@ extern "C" /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dbopen (); -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -4300,11 +5617,20 @@ dbopen (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4313,10 +5639,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 eval "$as_ac_Lib=yes" else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + eval "$as_ac_Lib=no" fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Lib'}'`" >&5 @@ -4333,8 +5661,11 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-ldb $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -4343,12 +5674,6 @@ extern "C" /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dbopen (); -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -4359,11 +5684,20 @@ dbopen (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4372,10 +5706,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_db_dbopen=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_lib_db_dbopen=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_db_dbopen" >&5 @@ -4398,8 +5734,11 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-l$sm_newdb_lib $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -4408,12 +5747,6 @@ extern "C" /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dbopen (); -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -4424,11 +5757,20 @@ dbopen (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4437,10 +5779,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 eval "$as_ac_Lib=yes" else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + eval "$as_ac_Lib=no" fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Lib'}'`" >&5 @@ -4457,8 +5801,11 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-ldb $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -4467,12 +5814,6 @@ extern "C" /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dbopen (); -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -4483,11 +5824,20 @@ dbopen (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4496,10 +5846,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_db_dbopen=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_lib_db_dbopen=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_db_dbopen" >&5 @@ -4523,7 +5875,7 @@ echo "$as_me: WARNING: Could not find -l$sm_newdb_lib (or -ldb)" >&2;} # only libsmdb and sendmail #include <db.h>, but libsmdb is needed # by most of the other components if test $sm_have_newdb = yes; then - if test \( $ac_cv_header_db4_db_h = yes -a $sm_newdb_lib = db-4.0 \) \ + if test \( $ac_cv_header_db4_db_h = yes -a $sm_newdb_lib = db-4.1 \) \ -o \( $ac_cv_header_db3_db_h = yes -a $sm_newdb_lib = db3 \) \ -o \( $ac_cv_header_db2_db_h = yes -a $sm_newdb_lib = db2 \) \ -o \( $ac_cv_header_db1_db_h = yes -a $sm_newdb_lib = db1 \); then @@ -4583,18 +5935,30 @@ else echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4603,10 +5967,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_compiler=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 @@ -4614,20 +5979,24 @@ echo "${ECHO_T}$ac_header_compiler" >&6 echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? - egrep -v '^ *\+' conftest.er1 >conftest.err + grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -4638,7 +6007,8 @@ if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext @@ -4646,26 +6016,43 @@ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? -case $ac_header_compiler:$ac_header_preproc in - yes:no ) +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; - no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------------------------ ## +## Report this to bug/reportbug or sendmail@packages.debian.org ## +## ------------------------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - eval "$as_ac_Header=$ac_header_preproc" + eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 @@ -4693,16 +6080,13 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -4713,11 +6097,20 @@ main (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4726,10 +6119,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_nsl_main=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_lib_nsl_main=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_main" >&5 @@ -4786,18 +6181,30 @@ else echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4806,10 +6213,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_compiler=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 @@ -4817,20 +6225,24 @@ echo "${ECHO_T}$ac_header_compiler" >&6 echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? - egrep -v '^ *\+' conftest.er1 >conftest.err + grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -4841,7 +6253,8 @@ if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext @@ -4849,26 +6262,43 @@ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? -case $ac_header_compiler:$ac_header_preproc in - yes:no ) +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; - no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------------------------ ## +## Report this to bug/reportbug or sendmail@packages.debian.org ## +## ------------------------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - eval "$as_ac_Header=$ac_header_preproc" + eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 @@ -4887,8 +6317,8 @@ fi done - if test $sm_have_nisplus = yes -a \ - $sm_have_nis = no; then + if [ $sm_have_nisplus = yes ] \ + && [ $sm_have_nis = no ]; then echo "$as_me:$LINENO: checking for main in -lnsl" >&5 echo $ECHO_N "checking for main in -lnsl... $ECHO_C" >&6 if test "${ac_cv_lib_nsl_main+set}" = set; then @@ -4897,16 +6327,13 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -4917,11 +6344,20 @@ main (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -4930,10 +6366,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_nsl_main=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_lib_nsl_main=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_main" >&5 @@ -4998,18 +6436,30 @@ else echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -5018,10 +6468,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_compiler=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 @@ -5029,20 +6480,24 @@ echo "${ECHO_T}$ac_header_compiler" >&6 echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? - egrep -v '^ *\+' conftest.er1 >conftest.err + grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -5053,7 +6508,8 @@ if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext @@ -5061,26 +6517,43 @@ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? -case $ac_header_compiler:$ac_header_preproc in - yes:no ) +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; - no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------------------------ ## +## Report this to bug/reportbug or sendmail@packages.debian.org ## +## ------------------------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - eval "$as_ac_Header=$ac_header_preproc" + eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 @@ -5105,16 +6578,13 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-lldap -llber $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -5125,11 +6595,20 @@ main (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -5138,10 +6617,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_ldap_main=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_lib_ldap_main=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_ldap_main" >&5 @@ -5162,8 +6643,11 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-lldap -llber $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -5172,12 +6656,6 @@ extern "C" /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char ldap_init (); -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -5188,11 +6666,20 @@ ldap_init (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -5201,10 +6688,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_ldap_ldap_init=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_lib_ldap_ldap_init=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_ldap_ldap_init" >&5 @@ -5225,8 +6714,11 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-lldap -llber $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -5235,12 +6727,6 @@ extern "C" /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char ldap_memfree (); -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -5251,11 +6737,20 @@ ldap_memfree (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -5264,10 +6759,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_ldap_ldap_memfree=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_lib_ldap_ldap_memfree=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_ldap_ldap_memfree" >&5 @@ -5290,16 +6787,13 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-llber $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -5310,11 +6804,20 @@ main (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -5323,10 +6826,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_lber_main=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_lib_lber_main=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_lber_main" >&5 @@ -5344,8 +6849,11 @@ fi echo "$as_me:$LINENO: checking for openldap package" >&5 echo $ECHO_N "checking for openldap package... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #if defined(HAVE_LDAP_H) #include <ldap.h> @@ -5358,7 +6866,7 @@ echo $ECHO_N "checking for openldap package... $ECHO_C" >&6 _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "sm_ldap_version=3" >/dev/null 2>&1; then + $EGREP "sm_ldap_version=3" >/dev/null 2>&1; then sm_ldap_pkg="libldap2-dev" else @@ -5379,8 +6887,8 @@ echo "$as_me: WARNING: Could not find OpenLDAP -lldap or -llber" >&2;} fi; fi; - if test "X$ac_cv_header_umich_ldap_ldap_h" = Xyes -a \ - $sm_have_ldap != yes; then + if [ "X$ac_cv_header_umich_ldap_ldap_h" = Xyes ] \ + && [ $sm_have_ldap != yes ]; then echo "$as_me:$LINENO: checking for main in -lumich_ldap" >&5 echo $ECHO_N "checking for main in -lumich_ldap... $ECHO_C" >&6 if test "${ac_cv_lib_umich_ldap_main+set}" = set; then @@ -5389,16 +6897,13 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-lumich_ldap -lumich_lber $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -5409,11 +6914,20 @@ main (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -5422,10 +6936,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_umich_ldap_main=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_lib_umich_ldap_main=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_umich_ldap_main" >&5 @@ -5448,16 +6964,13 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-lumich_lber $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -5468,11 +6981,20 @@ main (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -5481,10 +7003,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_umich_lber_main=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_lib_umich_lber_main=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_umich_lber_main" >&5 @@ -5525,6 +7049,7 @@ echo "$as_me: WARNING: Could not find UMich -lldap or -llber" >&2;} sm_sendmail_libs="$sm_sendmail_libs $sm_ldap_lib"; sm_smrsh_libs="$sm_smrsh_libs $sm_ldap_lib"; sm_vacation_libs="$sm_vacation_libs $sm_ldap_lib"; + sm_libsm_envdef="$sm_libsm_envdef -D_LDAP_EXAMPLE_"; if test $sm_have_ldap_init = yes; then sm_libsm_envdef="$sm_libsm_envdef -DLDAP_REFERRALS"; sm_sendmail_envdef="$sm_sendmail_envdef -DLDAP_REFERRALS"; @@ -5547,6 +7072,16 @@ echo "$as_me: error: Could not locate LDAP (libldap2-dev) package" >&2;} fi; sm_enable_ldap=$sm_have_ldap; + +if test x$sm_enable_ldap = xyes; then + SM_ENABLE_LDAP_TRUE= + SM_ENABLE_LDAP_FALSE='#' +else + SM_ENABLE_LDAP_TRUE='#' + SM_ENABLE_LDAP_FALSE= +fi + + #------------------------------------------------------------------- # # Check for presence of resolve(and/or bind) headers @@ -5581,18 +7116,30 @@ else echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -5601,10 +7148,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_compiler=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 @@ -5612,20 +7160,24 @@ echo "${ECHO_T}$ac_header_compiler" >&6 echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? - egrep -v '^ *\+' conftest.er1 >conftest.err + grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -5636,7 +7188,8 @@ if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext @@ -5644,26 +7197,43 @@ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? -case $ac_header_compiler:$ac_header_preproc in - yes:no ) +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; - no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------------------------ ## +## Report this to bug/reportbug or sendmail@packages.debian.org ## +## ------------------------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - eval "$as_ac_Header=$ac_header_preproc" + eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 @@ -5694,8 +7264,11 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-lresolv $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -5704,12 +7277,6 @@ extern "C" /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char __res_query (); -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -5720,11 +7287,20 @@ __res_query (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -5733,10 +7309,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_resolv___res_query=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_lib_resolv___res_query=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_resolv___res_query" >&5 @@ -5753,8 +7331,11 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-lresolv $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -5763,12 +7344,6 @@ extern "C" /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char res_query (); -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -5779,11 +7354,20 @@ res_query (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -5792,10 +7376,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_resolv_res_query=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_lib_resolv_res_query=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_resolv_res_query" >&5 @@ -5829,8 +7415,11 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-lbind $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -5839,12 +7428,6 @@ extern "C" /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char __res_query (); -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -5855,11 +7438,20 @@ __res_query (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -5868,10 +7460,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_bind___res_query=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_lib_bind___res_query=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_bind___res_query" >&5 @@ -5942,18 +7536,30 @@ else echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -5962,10 +7568,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_compiler=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 @@ -5973,20 +7580,24 @@ echo "${ECHO_T}$ac_header_compiler" >&6 echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? - egrep -v '^ *\+' conftest.er1 >conftest.err + grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -5997,7 +7608,8 @@ if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext @@ -6005,26 +7617,43 @@ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? -case $ac_header_compiler:$ac_header_preproc in - yes:no ) +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; - no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------------------------ ## +## Report this to bug/reportbug or sendmail@packages.debian.org ## +## ------------------------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - eval "$as_ac_Header=$ac_header_preproc" + eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 @@ -6041,8 +7670,8 @@ done if test $ac_cv_header_hesiod_h = yes; then sm_have_hesiod=yes; - elif test $ac_cv_header_bind_hesiod_h = yes -a \ - $sm_have_bind = yes; then + elif [ $ac_cv_header_bind_hesiod_h = yes ] \ + && [ $sm_have_bind = yes ]; then sm_have_hesiod=yes; fi; @@ -6052,14 +7681,17 @@ echo $ECHO_N "checking for hes_getmailhost... $ECHO_C" >&6 CPPFLAGS_SAVE="$CPPFLAGS"; CPPFLAGS="$resolve_inc"; cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <hesiod.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "hes_getmailhost\(" >/dev/null 2>&1; then + $EGREP "hes_getmailhost\(" >/dev/null 2>&1; then sm_hesiod_parms="-DHES_GETMAILHOST" fi rm -f conftest* @@ -6118,18 +7750,30 @@ else echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -6138,10 +7782,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_compiler=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 @@ -6149,20 +7794,24 @@ echo "${ECHO_T}$ac_header_compiler" >&6 echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? - egrep -v '^ *\+' conftest.er1 >conftest.err + grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -6173,7 +7822,8 @@ if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext @@ -6181,26 +7831,43 @@ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? -case $ac_header_compiler:$ac_header_preproc in - yes:no ) +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; - no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------------------------ ## +## Report this to bug/reportbug or sendmail@packages.debian.org ## +## ------------------------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - eval "$as_ac_Header=$ac_header_preproc" + eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 @@ -6221,19 +7888,16 @@ done if test $ac_cv_header_tcpd_h = yes ; then cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ int allow_severity = 0; int deny_severity = 0; -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -6245,11 +7909,20 @@ hosts_access() _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -6259,10 +7932,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + sm_have_tcpd=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi; if test $sm_have_tcpd = yes; then @@ -6274,16 +7948,13 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-lwrap $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -6294,11 +7965,20 @@ main (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -6307,10 +7987,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_wrap_main=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_lib_wrap_main=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_wrap_main" >&5 @@ -6368,18 +8050,30 @@ else echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -6388,10 +8082,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_compiler=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 @@ -6399,20 +8094,24 @@ echo "${ECHO_T}$ac_header_compiler" >&6 echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? - egrep -v '^ *\+' conftest.er1 >conftest.err + grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -6423,7 +8122,8 @@ if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext @@ -6431,26 +8131,43 @@ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? -case $ac_header_compiler:$ac_header_preproc in - yes:no ) +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; - no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------------------------ ## +## Report this to bug/reportbug or sendmail@packages.debian.org ## +## ------------------------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - eval "$as_ac_Header=$ac_header_preproc" + eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 @@ -6471,8 +8188,11 @@ done if test $ac_cv_header_netinet_ip6_h = yes ; then cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <netdb.h> #if defined(AI_DEFAULT) @@ -6481,13 +8201,16 @@ done _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "sm_have_ipv6=yes" >/dev/null 2>&1; then + $EGREP "sm_have_ipv6=yes" >/dev/null 2>&1; then sm_have_ipv6=yes else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <bind/netdb.h> #if defined(AI_DEFAULT) @@ -6496,7 +8219,7 @@ else _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "sm_have_ipv6=yes" >/dev/null 2>&1; then + $EGREP "sm_have_ipv6=yes" >/dev/null 2>&1; then sm_have_ipv6=yes fi rm -f conftest* @@ -6523,49 +8246,72 @@ if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func. + For example, HP-UX 11i <limits.h> declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + /* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. */ -#include <assert.h> + which can conflict with char $ac_func (); below. + Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + <limits.h> exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + +#undef $ac_func + /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" +{ #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); -char (*f) (); - -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif -int -main () -{ /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else -f = $ac_func; +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} #endif +int +main () +{ +return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -6574,10 +8320,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + eval "$as_ac_var=no" fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 @@ -6603,10 +8351,11 @@ echo "$as_me: error: IPv6 support requires getaddrinfo" >&2;} v2i 8.10.0; if test $sm_version_math -ge $sm_version_test; then sm_features="$sm_features, IPv6"; - sm_sendmail_envdef="$sm_sendmail_envdef -DNETINET6"; + # Needed by sendmail, libmilter, maybe others + sm_envdef="$sm_envdef -DNETINET6"; # Need following if using bind headers if test ! -z "$resolve_inc"; then - sm_sendmail_envdef="$sm_sendmail_envdef -DNEEDSGETIPNODE=0"; + sm_envdef="$sm_envdef -DNEEDSGETIPNODE=0"; fi; fi; elif test $sm_enable_ipv6 = auto; then @@ -6643,18 +8392,30 @@ else echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -6663,10 +8424,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_compiler=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 @@ -6674,20 +8436,24 @@ echo "${ECHO_T}$ac_header_compiler" >&6 echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? - egrep -v '^ *\+' conftest.er1 >conftest.err + grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -6698,7 +8464,8 @@ if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext @@ -6706,26 +8473,43 @@ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? -case $ac_header_compiler:$ac_header_preproc in - yes:no ) +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; - no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------------------------ ## +## Report this to bug/reportbug or sendmail@packages.debian.org ## +## ------------------------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - eval "$as_ac_Header=$ac_header_preproc" + eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 @@ -6753,16 +8537,13 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-llockfile $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -6773,11 +8554,20 @@ main (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -6786,10 +8576,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_lockfile_main=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_lib_lockfile_main=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_lockfile_main" >&5 @@ -6853,18 +8645,30 @@ else echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -6873,10 +8677,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_compiler=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 @@ -6884,20 +8689,24 @@ echo "${ECHO_T}$ac_header_compiler" >&6 echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? - egrep -v '^ *\+' conftest.er1 >conftest.err + grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -6908,7 +8717,8 @@ if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext @@ -6916,26 +8726,43 @@ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? -case $ac_header_compiler:$ac_header_preproc in - yes:no ) +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; - no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------------------------ ## +## Report this to bug/reportbug or sendmail@packages.debian.org ## +## ------------------------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - eval "$as_ac_Header=$ac_header_preproc" + eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 @@ -6964,16 +8791,13 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-lsfio $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -6984,11 +8808,20 @@ main (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -6997,10 +8830,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_sfio_main=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_lib_sfio_main=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_sfio_main" >&5 @@ -7066,18 +8901,30 @@ else echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -7086,10 +8933,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_compiler=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 @@ -7097,20 +8945,24 @@ echo "${ECHO_T}$ac_header_compiler" >&6 echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? - egrep -v '^ *\+' conftest.er1 >conftest.err + grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -7121,7 +8973,8 @@ if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext @@ -7129,26 +8982,43 @@ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? -case $ac_header_compiler:$ac_header_preproc in - yes:no ) +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; - no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------------------------ ## +## Report this to bug/reportbug or sendmail@packages.debian.org ## +## ------------------------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - eval "$as_ac_Header=$ac_header_preproc" + eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 @@ -7175,8 +9045,11 @@ done echo "$as_me:$LINENO: checking sasl version" >&5 echo $ECHO_N "checking sasl version... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #if defined(HAVE_SASL_SASL_H) #include <sasl/sasl.h> @@ -7189,7 +9062,7 @@ echo $ECHO_N "checking sasl version... $ECHO_C" >&6 _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "sm_auth_lib=2" >/dev/null 2>&1; then + $EGREP "sm_auth_lib=2" >/dev/null 2>&1; then sm_auth_lib=2 else sm_auth_lib=1 @@ -7206,7 +9079,7 @@ echo "$as_me: WARNING: SASL version unknown, omitting support!" >&2;} fi; # < 8.12.4 can't handle saslv2+ - v2i 8.12.99; # FIXME: need ldap & saslv2 1st !!! + v2i 8.12.4; # FIXME: need ldap & saslv2 1st !!! if test $sm_version_math -lt $sm_version_test; then if test $sm_auth_lib = 2; then { echo "$as_me:$LINENO: WARNING: <8.12.4 & saslv$sm_auth_lib: trying saslv1" >&5 @@ -7230,8 +9103,11 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-l$junk $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -7240,12 +9116,6 @@ extern "C" /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char sasl_client_init (); -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -7256,11 +9126,20 @@ sasl_client_init (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -7269,10 +9148,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 eval "$as_ac_Lib=yes" else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + eval "$as_ac_Lib=no" fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Lib'}'`" >&5 @@ -7294,8 +9175,9 @@ echo "$as_me: WARNING: Could not find -l${junk} (lib${junk}-dev)" >&2;} sm_features="$sm_features, SMTP AUTH(SASL)"; sm_badepends="$sm_badepends, lib${junk}-dev"; sm_suggests="$sm_suggests, ${junk}-bin"; - sm_suggests="$sm_suggests, lib${junk}-modules-plain"; - sm_suggests="$sm_suggests, lib${junk}-digestmd5-plain"; + sm_suggests="$sm_suggests, lib${junk}-modules"; + sm_suggests="$sm_suggests | lib${junk}-modules-plain"; + sm_suggests="$sm_suggests | lib${junk}-digestmd5-plain"; sm_suggests="$sm_suggests | lib${junk}-digestmd5-des"; sm_sendmail_envdef="$sm_sendmail_envdef -DSASL"; if test $ac_cv_header_sasl_sasl_h = yes; then @@ -7325,6 +9207,16 @@ echo "$as_me: error: SMTP authentication not supported!" >&2;} sm_enable_auth=$sm_have_auth; + +if test x$sm_enable_auth = xyes; then + SM_ENABLE_AUTH_TRUE= + SM_ENABLE_AUTH_FALSE='#' +else + SM_ENABLE_AUTH_TRUE='#' + SM_ENABLE_AUTH_FALSE= +fi + + #------------------------------------------------------------------- # # Check for presence of SSL headers @@ -7348,18 +9240,30 @@ else echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 + (eval $ac_compile) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest.$ac_objext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -7368,10 +9272,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_compiler=no fi -rm -f conftest.$ac_objext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 @@ -7379,20 +9284,24 @@ echo "${ECHO_T}$ac_header_compiler" >&6 echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? - egrep -v '^ *\+' conftest.er1 >conftest.err + grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi @@ -7403,7 +9312,8 @@ if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 - cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext @@ -7411,26 +9321,43 @@ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? -case $ac_header_compiler:$ac_header_preproc in - yes:no ) +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; - no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};; +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------------------------ ## +## Report this to bug/reportbug or sendmail@packages.debian.org ## +## ------------------------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - eval "$as_ac_Header=$ac_header_preproc" + eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 @@ -7458,8 +9385,11 @@ else ac_check_lib_save_LIBS=$LIBS LIBS="-lssl -lcrypto $LIBS" cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -7468,12 +9398,6 @@ extern "C" /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char SSL_library_init (); -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -7484,11 +9408,20 @@ SSL_library_init (); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -7497,10 +9430,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_lib_ssl_SSL_library_init=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_lib_ssl_SSL_library_init=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_ssl_SSL_library_init" >&5 @@ -7522,8 +9457,8 @@ echo "$as_me: WARNING: Could not find -lssl (libssl-dev)" >&2;} # SFIO is required for TLS/SSL support on 8.11 if test $sm_have_tls = yes; then - if test $sm_have_sfio != yes -a \ - "$sm_version_major" = '8.11'; then + if [ $sm_have_sfio != yes ] \ + && [ "$sm_version_major" = '8.11' ]; then { echo "$as_me:$LINENO: WARNING: SFIO is required for SSL privacy protection!" >&5 echo "$as_me: WARNING: SFIO is required for SSL privacy protection!" >&2;} sm_have_tls=no; @@ -7539,10 +9474,14 @@ echo "$as_me: WARNING: SFIO is required for SSL privacy protection!" >&2;} sm_sendmail_envdef="$sm_sendmail_envdef -DSTARTTLS"; sm_sendmail_libs="$sm_sendmail_libs -lcrypto -lssl"; sm_ffr="$sm_ffr -D_FFR_TLS_1"; + sm_ffr="$sm_ffr -D_FFR_DEAL_WITH_ERROR_SSL"; fi; - v2i 8.12.0; - if test $sm_version_math -ge $sm_version_test; then - sm_ffr="$sm_ffr -D_FFR_SMTP_SSL"; + v2i 8.13.0; + if test $sm_version_math -lt $sm_version_test; then + v2i 8.12.0; + if test $sm_version_math -ge $sm_version_test; then + sm_ffr="$sm_ffr -D_FFR_SMTP_SSL"; + fi; fi; elif test $sm_enable_tls = auto; then { echo "$as_me:$LINENO: WARNING: SSL/TLS privacy protection not supported!" >&5 @@ -7555,15 +9494,22 @@ echo "$as_me: error: SSL/TLS privacy protection not supported!" >&2;} fi; sm_enable_tls=$sm_have_tls; + +if test x$sm_enable_tls = xyes; then + SM_ENABLE_TLS_TRUE= + SM_ENABLE_TLS_FALSE='#' +else + SM_ENABLE_TLS_TRUE='#' + SM_ENABLE_TLS_FALSE= +fi + + #------------------------------------------------------------------- # Any requisite variable cleanup #------------------------------------------------------------------- sm_databases=$(echo "${sm_databases}" | sed -e 's/^, //'); sm_features=$(echo "${sm_features}" | sed -e 's/^, //'); -sm_badepends=$(echo "${sm_badepends}" | sed -e 's/^, //'); -sm_depends=$(echo "${sm_depends}" | sed -e 's/^, //'); sm_recommends=$(echo "${sm_recommends}" | sed -e 's/^, //'); -sm_suggests=$(echo "${sm_suggests}" | sed -e 's/^, //'); #------------------------------------------------------------------- # Add any FFRs to sendmail_ENVDEF @@ -7589,8 +9535,168 @@ if test $sm_version_math -lt $sm_version_test; then #------------------------------------------------------------------- # Fini - define configuration files, and commands upon them #------------------------------------------------------------------- -ac_config_files="$ac_config_files ./build/autoconf.mk ./build/autoconf.pl ./build/autoconf.sh ./build/changelog.sh ./build/control.m4 ./build/update_chaos ./build/site.config.m4 ./rules:./build/rules.in ./libmilter-dev.dirs ./libmilter-dev.postrm ./libmilter-dev.preinst ./sendmail-doc.dirs ./sendmail-doc.postrm ./sendmail-doc.preinst ./sendmail.conffiles ./sendmail.cron.daily ./sendmail.dirs ./sendmail.init.d ./sendmail.links ./sendmail.postinst ./sendmail.postrm ./sendmail.preinst ./sendmail.prerm ./sendmail.suid ./cf/debian/autoconf.m4 ./cf/debian/sendmail.mc ./cf/debian/starttls.m4 ./cf/debian/submit.mc ./cf/domain/debian-msp.m4 ./cf/domain/debian-mta.m4 ./cf/hack/debian_auth.m4 ./cf/hack/virthost_by_ip.m4 ./cf/ostype/debian.m4 ./examples/Makefile ./local/Makefile ./local/Parse_mc.pm ./local/parse_mc ./local/sendmailconfig ./local/sendmail ./local/update_auth ./local/update_conf ./local/update_db ./local/update_ldap ./local/update_mc ./local/update_mk ./local/update_smrsh ./local/update_sys ./local/update_tls ./sensible_mda/Makefile ./sensible_mda/sensible-mda.c" -ac_config_commands="$ac_config_commands default" + ac_config_files="$ac_config_files Makefile" + + ac_config_files="$ac_config_files build/autoconf.mk" + + ac_config_files="$ac_config_files build/autoconf.pl" + + ac_config_files="$ac_config_files build/autoconf.sh" + + ac_config_files="$ac_config_files build/debian/changelog.sh" + + ac_config_files="$ac_config_files build/debian/changelog:build/debian/changelog.in" + + ac_config_files="$ac_config_files build/update_chaos" + + ac_config_files="$ac_config_files build/site.config.m4" + + ac_config_files="$ac_config_files build/debian/control.m4" + + ac_config_files="$ac_config_files libmilter0.dirs:./build/debian/libmilter0.dirs.in" + + ac_config_files="$ac_config_files libmilter0.postrm:./build/debian/libmilter0.postrm.in" + + ac_config_files="$ac_config_files libmilter0.preinst:./build/debian/libmilter0.preinst.in" + + ac_config_files="$ac_config_files libmilter-dev.dirs:./build/debian/libmilter-dev.dirs.in" + + ac_config_files="$ac_config_files libmilter-dev.postrm:./build/debian/libmilter-dev.postrm.in" + + ac_config_files="$ac_config_files libmilter-dev.preinst:./build/debian/libmilter-dev.preinst.in" + + ac_config_files="$ac_config_files rmail.dirs:./build/debian/rmail.dirs.in" + + ac_config_files="$ac_config_files rmail.postrm:./build/debian/rmail.postrm.in" + + ac_config_files="$ac_config_files rmail.preinst:./build/debian/rmail.preinst.in" + + ac_config_files="$ac_config_files sendmail.dirs:./build/debian/sendmail.dirs.in" + + ac_config_files="$ac_config_files sendmail-base.dirs:./build/debian/sendmail-base.dirs.in" + + ac_config_files="$ac_config_files sendmail-base.postinst:./build/debian/sendmail-base.postinst.in" + + ac_config_files="$ac_config_files sendmail-base.postrm:./build/debian/sendmail-base.postrm.in" + + ac_config_files="$ac_config_files sendmail-base.preinst:./build/debian/sendmail-base.preinst.in" + + ac_config_files="$ac_config_files sendmail-base.prerm:./build/debian/sendmail-base.prerm.in" + + ac_config_files="$ac_config_files sendmail-doc.dirs:./build/debian/sendmail-doc.dirs.in" + + ac_config_files="$ac_config_files sendmail-doc.postrm:./build/debian/sendmail-doc.postrm.in" + + ac_config_files="$ac_config_files sendmail-doc.preinst:./build/debian/sendmail-doc.preinst.in" + + ac_config_files="$ac_config_files sendmail-cf.dirs:./build/debian/sendmail-cf.dirs.in" + + ac_config_files="$ac_config_files sendmail-cf.postrm:./build/debian/sendmail-cf.postrm.in" + + ac_config_files="$ac_config_files sendmail-cf.preinst:./build/debian/sendmail-cf.preinst.in" + + ac_config_files="$ac_config_files sendmail-bin.conffiles:./build/debian/sendmail-bin.conffiles.in" + + ac_config_files="$ac_config_files sendmail.cron.daily:./build/debian/sendmail.cron.daily.in" + + ac_config_files="$ac_config_files sendmail-bin.dirs:./build/debian/sendmail-bin.dirs.in" + + ac_config_files="$ac_config_files sendmail.init.d:./build/debian/sendmail.init.d.in:./local/sendmail.in" + + ac_config_files="$ac_config_files sendmail-bin.postinst:./build/debian/sendmail-bin.postinst.in" + + ac_config_files="$ac_config_files sendmail-bin.postrm:./build/debian/sendmail-bin.postrm.in" + + ac_config_files="$ac_config_files sendmail-bin.preinst:./build/debian/sendmail-bin.preinst.in" + + ac_config_files="$ac_config_files sendmail-bin.prerm:./build/debian/sendmail-bin.prerm.in" + + ac_config_files="$ac_config_files sendmail-bin.suid:./build/debian/sendmail-bin.suid.in" + + ac_config_files="$ac_config_files sensible-mda.dirs:./build/debian/sensible-mda.dirs.in" + + ac_config_files="$ac_config_files sensible-mda.postrm:./build/debian/sensible-mda.postrm.in" + + ac_config_files="$ac_config_files sensible-mda.preinst:./build/debian/sensible-mda.preinst.in" + + ac_config_files="$ac_config_files cf/Makefile" + + ac_config_files="$ac_config_files cf/debian/autoconf.m4" + + ac_config_files="$ac_config_files cf/debian/sendmail.mc" + + ac_config_files="$ac_config_files cf/debian/submit.mc" + + ac_config_files="$ac_config_files cf/domain/debian-msp.m4" + + ac_config_files="$ac_config_files cf/domain/debian-mta.m4" + + ac_config_files="$ac_config_files cf/hack/debian_auth.m4" + + ac_config_files="$ac_config_files cf/hack/virthost_by_ip.m4" + + ac_config_files="$ac_config_files cf/ostype/debian.m4" + + ac_config_files="$ac_config_files examples/Makefile" + + ac_config_files="$ac_config_files examples/dhcp3/dhclient-exit-hooks.d/sendmail" + + ac_config_files="$ac_config_files examples/network/if-down.d/sendmail" + + ac_config_files="$ac_config_files examples/network/if-up.d/sendmail" + + ac_config_files="$ac_config_files examples/ppp/ip-down.d/sendmail" + + ac_config_files="$ac_config_files examples/ppp/ip-up.d/sendmail" + + ac_config_files="$ac_config_files examples/resolvconf/update-libc.d/sendmail" + + ac_config_files="$ac_config_files examples/sasl/sasl.m4" + + ac_config_files="$ac_config_files examples/tls/starttls.m4" + + ac_config_files="$ac_config_files local/Makefile" + + ac_config_files="$ac_config_files local/Parse_conf.pm" + + ac_config_files="$ac_config_files local/Parse_mc.pm" + + ac_config_files="$ac_config_files local/dynamic" + + ac_config_files="$ac_config_files local/parse_mc" + + ac_config_files="$ac_config_files local/sendmailconfig" + + ac_config_files="$ac_config_files local/sendmail" + + ac_config_files="$ac_config_files local/update_auth" + + ac_config_files="$ac_config_files local/update_authm4" + + ac_config_files="$ac_config_files local/update_conf" + + ac_config_files="$ac_config_files local/update_db" + + ac_config_files="$ac_config_files local/update_ldap" + + ac_config_files="$ac_config_files local/update_mc" + + ac_config_files="$ac_config_files local/update_mk" + + ac_config_files="$ac_config_files local/update_smrsh" + + ac_config_files="$ac_config_files local/update_sys" + + ac_config_files="$ac_config_files local/update_tls" + + ac_config_files="$ac_config_files local/update_tlsm4" + + ac_config_files="$ac_config_files local/bug/sendmail/script" + + ac_config_files="$ac_config_files sensible_mda/Makefile" + + ac_config_files="$ac_config_files sensible_mda/sensible-mda.c" + cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure @@ -7601,7 +9707,7 @@ cat >confcache <<\_ACEOF # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # -# `ac_cv_env_foo' variables (set or unset) will be overriden when +# `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. @@ -7619,13 +9725,13 @@ _ACEOF # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | @@ -7636,7 +9742,7 @@ _ACEOF t end /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ : end' >>confcache -if cmp -s $cache_file confcache; then :; else +if diff $cache_file confcache >/dev/null 2>&1; then :; else if test -w $cache_file; then test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" cat confcache >$cache_file @@ -7655,13 +9761,13 @@ test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ + ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; -s/^\([^=]*=[ ]*\):*/\1/; +s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; -s/^[^=]*=[ ]*$//; +s/^[^=]*=[ ]*$//; }' fi @@ -7675,13 +9781,13 @@ fi cat >confdef2opt.sed <<\_ACEOF t clear : clear -s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g t quote -s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g t quote d : quote -s,[ `~#$^&*(){}\\|;'"<>?],\\&,g +s,[ `~#$^&*(){}\\|;'"<>?],\\&,g s,\[,\\&,g s,\],\\&,g s,\$,$$,g @@ -7698,6 +9804,63 @@ DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` rm -f confdef2opt.sed +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_i=`echo "$ac_i" | + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${SM_ENABLE_LDAP_TRUE}" && test -z "${SM_ENABLE_LDAP_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"SM_ENABLE_LDAP\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"SM_ENABLE_LDAP\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${SM_ENABLE_AUTH_TRUE}" && test -z "${SM_ENABLE_AUTH_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"SM_ENABLE_AUTH\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"SM_ENABLE_AUTH\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${SM_ENABLE_TLS_TRUE}" && test -z "${SM_ENABLE_TLS_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"SM_ENABLE_TLS\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"SM_ENABLE_TLS\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files @@ -7712,11 +9875,12 @@ cat >$CONFIG_STATUS <<_ACEOF # configure, is in config.log if it exists. debug=false +ac_cs_recheck=false +ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF - ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## @@ -7725,46 +9889,57 @@ cat >>$CONFIG_STATUS <<\_ACEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi +DUALCASE=1; export DUALCASE # for MKS sh -# NLS nuisances. # Support unset when possible. -if (FOO=FOO; unset FOO) >/dev/null 2>&1; then +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi -(set +x; test -n "`(LANG=C; export LANG) 2>&1`") && - { $as_unset LANG || test "${LANG+set}" != set; } || - { LANG=C; export LANG; } -(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") && - { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } || - { LC_ALL=C; export LC_ALL; } -(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") && - { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } || - { LC_TIME=C; export LC_TIME; } -(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") && - { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } || - { LC_CTYPE=C; export LC_CTYPE; } -(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") && - { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } || - { LANGUAGE=C; export LANGUAGE; } -(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") && - { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } || - { LC_COLLATE=C; export LC_COLLATE; } -(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") && - { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } || - { LC_NUMERIC=C; export LC_NUMERIC; } -(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") && - { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } || - { LC_MESSAGES=C; export LC_MESSAGES; } + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi # Name of the executable. -as_me=`(basename "$0") 2>/dev/null || +as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ @@ -7775,6 +9950,7 @@ echo X/"$0" | /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` + # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' @@ -7785,15 +9961,15 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conftest.sh - echo "exit 0" >>conftest.sh - chmod +x conftest.sh - if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi - rm -f conftest.sh + rm -f conf$$.sh fi @@ -7842,6 +10018,8 @@ do as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} @@ -7915,13 +10093,20 @@ else fi rm -f conf$$ conf$$.exe conf$$.file +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. -as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. -as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS @@ -7931,7 +10116,7 @@ as_nl=' IFS=" $as_nl" # CDPATH. -$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; } +$as_unset CDPATH exec 6>&1 @@ -7947,8 +10132,8 @@ _ASBOX } >&5 cat >&5 <<_CSEOF -This file was extended by Sendmail $as_me 8.12.7, which was -generated by GNU Autoconf 2.53. Invocation command line was +This file was extended by Sendmail $as_me 8.13.3, which was +generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -7988,10 +10173,11 @@ Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number, then exit + -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] - instantiate the configuration file FILE + instantiate the configuration file FILE Configuration files: $config_files @@ -8004,12 +10190,11 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ -Sendmail config.status 8.12.7 -configured by $0, generated by GNU Autoconf 2.53, +Sendmail config.status 8.13.3 +configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" -Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 -Free Software Foundation, Inc. +Copyright (C) 2003 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=$srcdir @@ -8026,25 +10211,25 @@ do --*=*) ac_option=`expr "x$1" : 'x\([^=]*\)='` ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` - shift - set dummy "$ac_option" "$ac_optarg" ${1+"$@"} - shift + ac_shift=: + ;; + -*) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift ;; - -*);; *) # This is not an option, so the user has probably given explicit # arguments. + ac_option=$1 ac_need_defaults=false;; esac - case $1 in + case $ac_option in # Handling of the options. _ACEOF -cat >>$CONFIG_STATUS <<_ACEOF - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - echo "running $SHELL $0 " $ac_configure_args " --no-create --no-recursion" - exec $SHELL $0 $ac_configure_args --no-create --no-recursion ;; -_ACEOF cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; --version | --vers* | -V ) echo "$ac_cs_version"; exit 0 ;; --he | --h) @@ -8059,13 +10244,16 @@ Try \`$0 --help' for more information." >&2;} --debug | --d* | -d ) debug=: ;; --file | --fil | --fi | --f ) - shift - CONFIG_FILES="$CONFIG_FILES $1" + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) - shift - CONFIG_HEADERS="$CONFIG_HEADERS $1" + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; # This is an error. -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 @@ -8080,9 +10268,30 @@ Try \`$0 --help' for more information." >&2;} shift done +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +if \$ac_cs_recheck; then + echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + _ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +# +# INIT-COMMANDS section. +# + +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" +_ACEOF @@ -8091,57 +10300,88 @@ for ac_config_target in $ac_config_targets do case "$ac_config_target" in # Handling of arguments. - "./build/autoconf.mk" ) CONFIG_FILES="$CONFIG_FILES ./build/autoconf.mk" ;; - "./build/autoconf.pl" ) CONFIG_FILES="$CONFIG_FILES ./build/autoconf.pl" ;; - "./build/autoconf.sh" ) CONFIG_FILES="$CONFIG_FILES ./build/autoconf.sh" ;; - "./build/changelog.sh" ) CONFIG_FILES="$CONFIG_FILES ./build/changelog.sh" ;; - "./build/control.m4" ) CONFIG_FILES="$CONFIG_FILES ./build/control.m4" ;; - "./build/update_chaos" ) CONFIG_FILES="$CONFIG_FILES ./build/update_chaos" ;; - "./build/site.config.m4" ) CONFIG_FILES="$CONFIG_FILES ./build/site.config.m4" ;; - "./rules" ) CONFIG_FILES="$CONFIG_FILES ./rules:./build/rules.in" ;; - "./libmilter-dev.dirs" ) CONFIG_FILES="$CONFIG_FILES ./libmilter-dev.dirs" ;; - "./libmilter-dev.postrm" ) CONFIG_FILES="$CONFIG_FILES ./libmilter-dev.postrm" ;; - "./libmilter-dev.preinst" ) CONFIG_FILES="$CONFIG_FILES ./libmilter-dev.preinst" ;; - "./sendmail-doc.dirs" ) CONFIG_FILES="$CONFIG_FILES ./sendmail-doc.dirs" ;; - "./sendmail-doc.postrm" ) CONFIG_FILES="$CONFIG_FILES ./sendmail-doc.postrm" ;; - "./sendmail-doc.preinst" ) CONFIG_FILES="$CONFIG_FILES ./sendmail-doc.preinst" ;; - "./sendmail.conffiles" ) CONFIG_FILES="$CONFIG_FILES ./sendmail.conffiles" ;; - "./sendmail.cron.daily" ) CONFIG_FILES="$CONFIG_FILES ./sendmail.cron.daily" ;; - "./sendmail.dirs" ) CONFIG_FILES="$CONFIG_FILES ./sendmail.dirs" ;; - "./sendmail.init.d" ) CONFIG_FILES="$CONFIG_FILES ./sendmail.init.d" ;; - "./sendmail.links" ) CONFIG_FILES="$CONFIG_FILES ./sendmail.links" ;; - "./sendmail.postinst" ) CONFIG_FILES="$CONFIG_FILES ./sendmail.postinst" ;; - "./sendmail.postrm" ) CONFIG_FILES="$CONFIG_FILES ./sendmail.postrm" ;; - "./sendmail.preinst" ) CONFIG_FILES="$CONFIG_FILES ./sendmail.preinst" ;; - "./sendmail.prerm" ) CONFIG_FILES="$CONFIG_FILES ./sendmail.prerm" ;; - "./sendmail.suid" ) CONFIG_FILES="$CONFIG_FILES ./sendmail.suid" ;; - "./cf/debian/autoconf.m4" ) CONFIG_FILES="$CONFIG_FILES ./cf/debian/autoconf.m4" ;; - "./cf/debian/sendmail.mc" ) CONFIG_FILES="$CONFIG_FILES ./cf/debian/sendmail.mc" ;; - "./cf/debian/starttls.m4" ) CONFIG_FILES="$CONFIG_FILES ./cf/debian/starttls.m4" ;; - "./cf/debian/submit.mc" ) CONFIG_FILES="$CONFIG_FILES ./cf/debian/submit.mc" ;; - "./cf/domain/debian-msp.m4" ) CONFIG_FILES="$CONFIG_FILES ./cf/domain/debian-msp.m4" ;; - "./cf/domain/debian-mta.m4" ) CONFIG_FILES="$CONFIG_FILES ./cf/domain/debian-mta.m4" ;; - "./cf/hack/debian_auth.m4" ) CONFIG_FILES="$CONFIG_FILES ./cf/hack/debian_auth.m4" ;; - "./cf/hack/virthost_by_ip.m4" ) CONFIG_FILES="$CONFIG_FILES ./cf/hack/virthost_by_ip.m4" ;; - "./cf/ostype/debian.m4" ) CONFIG_FILES="$CONFIG_FILES ./cf/ostype/debian.m4" ;; - "./examples/Makefile" ) CONFIG_FILES="$CONFIG_FILES ./examples/Makefile" ;; - "./local/Makefile" ) CONFIG_FILES="$CONFIG_FILES ./local/Makefile" ;; - "./local/Parse_mc.pm" ) CONFIG_FILES="$CONFIG_FILES ./local/Parse_mc.pm" ;; - "./local/parse_mc" ) CONFIG_FILES="$CONFIG_FILES ./local/parse_mc" ;; - "./local/sendmailconfig" ) CONFIG_FILES="$CONFIG_FILES ./local/sendmailconfig" ;; - "./local/sendmail" ) CONFIG_FILES="$CONFIG_FILES ./local/sendmail" ;; - "./local/update_auth" ) CONFIG_FILES="$CONFIG_FILES ./local/update_auth" ;; - "./local/update_conf" ) CONFIG_FILES="$CONFIG_FILES ./local/update_conf" ;; - "./local/update_db" ) CONFIG_FILES="$CONFIG_FILES ./local/update_db" ;; - "./local/update_ldap" ) CONFIG_FILES="$CONFIG_FILES ./local/update_ldap" ;; - "./local/update_mc" ) CONFIG_FILES="$CONFIG_FILES ./local/update_mc" ;; - "./local/update_mk" ) CONFIG_FILES="$CONFIG_FILES ./local/update_mk" ;; - "./local/update_smrsh" ) CONFIG_FILES="$CONFIG_FILES ./local/update_smrsh" ;; - "./local/update_sys" ) CONFIG_FILES="$CONFIG_FILES ./local/update_sys" ;; - "./local/update_tls" ) CONFIG_FILES="$CONFIG_FILES ./local/update_tls" ;; - "./sensible_mda/Makefile" ) CONFIG_FILES="$CONFIG_FILES ./sensible_mda/Makefile" ;; - "./sensible_mda/sensible-mda.c" ) CONFIG_FILES="$CONFIG_FILES ./sensible_mda/sensible-mda.c" ;; - "default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "build/autoconf.mk" ) CONFIG_FILES="$CONFIG_FILES build/autoconf.mk" ;; + "build/autoconf.pl" ) CONFIG_FILES="$CONFIG_FILES build/autoconf.pl" ;; + "build/autoconf.sh" ) CONFIG_FILES="$CONFIG_FILES build/autoconf.sh" ;; + "build/debian/changelog.sh" ) CONFIG_FILES="$CONFIG_FILES build/debian/changelog.sh" ;; + "build/debian/changelog" ) CONFIG_FILES="$CONFIG_FILES build/debian/changelog:build/debian/changelog.in" ;; + "build/update_chaos" ) CONFIG_FILES="$CONFIG_FILES build/update_chaos" ;; + "build/site.config.m4" ) CONFIG_FILES="$CONFIG_FILES build/site.config.m4" ;; + "build/debian/control.m4" ) CONFIG_FILES="$CONFIG_FILES build/debian/control.m4" ;; + "libmilter0.dirs" ) CONFIG_FILES="$CONFIG_FILES libmilter0.dirs:./build/debian/libmilter0.dirs.in" ;; + "libmilter0.postrm" ) CONFIG_FILES="$CONFIG_FILES libmilter0.postrm:./build/debian/libmilter0.postrm.in" ;; + "libmilter0.preinst" ) CONFIG_FILES="$CONFIG_FILES libmilter0.preinst:./build/debian/libmilter0.preinst.in" ;; + "libmilter-dev.dirs" ) CONFIG_FILES="$CONFIG_FILES libmilter-dev.dirs:./build/debian/libmilter-dev.dirs.in" ;; + "libmilter-dev.postrm" ) CONFIG_FILES="$CONFIG_FILES libmilter-dev.postrm:./build/debian/libmilter-dev.postrm.in" ;; + "libmilter-dev.preinst" ) CONFIG_FILES="$CONFIG_FILES libmilter-dev.preinst:./build/debian/libmilter-dev.preinst.in" ;; + "rmail.dirs" ) CONFIG_FILES="$CONFIG_FILES rmail.dirs:./build/debian/rmail.dirs.in" ;; + "rmail.postrm" ) CONFIG_FILES="$CONFIG_FILES rmail.postrm:./build/debian/rmail.postrm.in" ;; + "rmail.preinst" ) CONFIG_FILES="$CONFIG_FILES rmail.preinst:./build/debian/rmail.preinst.in" ;; + "sendmail.dirs" ) CONFIG_FILES="$CONFIG_FILES sendmail.dirs:./build/debian/sendmail.dirs.in" ;; + "sendmail-base.dirs" ) CONFIG_FILES="$CONFIG_FILES sendmail-base.dirs:./build/debian/sendmail-base.dirs.in" ;; + "sendmail-base.postinst" ) CONFIG_FILES="$CONFIG_FILES sendmail-base.postinst:./build/debian/sendmail-base.postinst.in" ;; + "sendmail-base.postrm" ) CONFIG_FILES="$CONFIG_FILES sendmail-base.postrm:./build/debian/sendmail-base.postrm.in" ;; + "sendmail-base.preinst" ) CONFIG_FILES="$CONFIG_FILES sendmail-base.preinst:./build/debian/sendmail-base.preinst.in" ;; + "sendmail-base.prerm" ) CONFIG_FILES="$CONFIG_FILES sendmail-base.prerm:./build/debian/sendmail-base.prerm.in" ;; + "sendmail-doc.dirs" ) CONFIG_FILES="$CONFIG_FILES sendmail-doc.dirs:./build/debian/sendmail-doc.dirs.in" ;; + "sendmail-doc.postrm" ) CONFIG_FILES="$CONFIG_FILES sendmail-doc.postrm:./build/debian/sendmail-doc.postrm.in" ;; + "sendmail-doc.preinst" ) CONFIG_FILES="$CONFIG_FILES sendmail-doc.preinst:./build/debian/sendmail-doc.preinst.in" ;; + "sendmail-cf.dirs" ) CONFIG_FILES="$CONFIG_FILES sendmail-cf.dirs:./build/debian/sendmail-cf.dirs.in" ;; + "sendmail-cf.postrm" ) CONFIG_FILES="$CONFIG_FILES sendmail-cf.postrm:./build/debian/sendmail-cf.postrm.in" ;; + "sendmail-cf.preinst" ) CONFIG_FILES="$CONFIG_FILES sendmail-cf.preinst:./build/debian/sendmail-cf.preinst.in" ;; + "sendmail-bin.conffiles" ) CONFIG_FILES="$CONFIG_FILES sendmail-bin.conffiles:./build/debian/sendmail-bin.conffiles.in" ;; + "sendmail.cron.daily" ) CONFIG_FILES="$CONFIG_FILES sendmail.cron.daily:./build/debian/sendmail.cron.daily.in" ;; + "sendmail-bin.dirs" ) CONFIG_FILES="$CONFIG_FILES sendmail-bin.dirs:./build/debian/sendmail-bin.dirs.in" ;; + "sendmail.init.d" ) CONFIG_FILES="$CONFIG_FILES sendmail.init.d:./build/debian/sendmail.init.d.in:./local/sendmail.in" ;; + "sendmail-bin.postinst" ) CONFIG_FILES="$CONFIG_FILES sendmail-bin.postinst:./build/debian/sendmail-bin.postinst.in" ;; + "sendmail-bin.postrm" ) CONFIG_FILES="$CONFIG_FILES sendmail-bin.postrm:./build/debian/sendmail-bin.postrm.in" ;; + "sendmail-bin.preinst" ) CONFIG_FILES="$CONFIG_FILES sendmail-bin.preinst:./build/debian/sendmail-bin.preinst.in" ;; + "sendmail-bin.prerm" ) CONFIG_FILES="$CONFIG_FILES sendmail-bin.prerm:./build/debian/sendmail-bin.prerm.in" ;; + "sendmail-bin.suid" ) CONFIG_FILES="$CONFIG_FILES sendmail-bin.suid:./build/debian/sendmail-bin.suid.in" ;; + "sensible-mda.dirs" ) CONFIG_FILES="$CONFIG_FILES sensible-mda.dirs:./build/debian/sensible-mda.dirs.in" ;; + "sensible-mda.postrm" ) CONFIG_FILES="$CONFIG_FILES sensible-mda.postrm:./build/debian/sensible-mda.postrm.in" ;; + "sensible-mda.preinst" ) CONFIG_FILES="$CONFIG_FILES sensible-mda.preinst:./build/debian/sensible-mda.preinst.in" ;; + "cf/Makefile" ) CONFIG_FILES="$CONFIG_FILES cf/Makefile" ;; + "cf/debian/autoconf.m4" ) CONFIG_FILES="$CONFIG_FILES cf/debian/autoconf.m4" ;; + "cf/debian/sendmail.mc" ) CONFIG_FILES="$CONFIG_FILES cf/debian/sendmail.mc" ;; + "cf/debian/submit.mc" ) CONFIG_FILES="$CONFIG_FILES cf/debian/submit.mc" ;; + "cf/domain/debian-msp.m4" ) CONFIG_FILES="$CONFIG_FILES cf/domain/debian-msp.m4" ;; + "cf/domain/debian-mta.m4" ) CONFIG_FILES="$CONFIG_FILES cf/domain/debian-mta.m4" ;; + "cf/hack/debian_auth.m4" ) CONFIG_FILES="$CONFIG_FILES cf/hack/debian_auth.m4" ;; + "cf/hack/virthost_by_ip.m4" ) CONFIG_FILES="$CONFIG_FILES cf/hack/virthost_by_ip.m4" ;; + "cf/ostype/debian.m4" ) CONFIG_FILES="$CONFIG_FILES cf/ostype/debian.m4" ;; + "examples/Makefile" ) CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; + "examples/dhcp3/dhclient-exit-hooks.d/sendmail" ) CONFIG_FILES="$CONFIG_FILES examples/dhcp3/dhclient-exit-hooks.d/sendmail" ;; + "examples/network/if-down.d/sendmail" ) CONFIG_FILES="$CONFIG_FILES examples/network/if-down.d/sendmail" ;; + "examples/network/if-up.d/sendmail" ) CONFIG_FILES="$CONFIG_FILES examples/network/if-up.d/sendmail" ;; + "examples/ppp/ip-down.d/sendmail" ) CONFIG_FILES="$CONFIG_FILES examples/ppp/ip-down.d/sendmail" ;; + "examples/ppp/ip-up.d/sendmail" ) CONFIG_FILES="$CONFIG_FILES examples/ppp/ip-up.d/sendmail" ;; + "examples/resolvconf/update-libc.d/sendmail" ) CONFIG_FILES="$CONFIG_FILES examples/resolvconf/update-libc.d/sendmail" ;; + "examples/sasl/sasl.m4" ) CONFIG_FILES="$CONFIG_FILES examples/sasl/sasl.m4" ;; + "examples/tls/starttls.m4" ) CONFIG_FILES="$CONFIG_FILES examples/tls/starttls.m4" ;; + "local/Makefile" ) CONFIG_FILES="$CONFIG_FILES local/Makefile" ;; + "local/Parse_conf.pm" ) CONFIG_FILES="$CONFIG_FILES local/Parse_conf.pm" ;; + "local/Parse_mc.pm" ) CONFIG_FILES="$CONFIG_FILES local/Parse_mc.pm" ;; + "local/dynamic" ) CONFIG_FILES="$CONFIG_FILES local/dynamic" ;; + "local/parse_mc" ) CONFIG_FILES="$CONFIG_FILES local/parse_mc" ;; + "local/sendmailconfig" ) CONFIG_FILES="$CONFIG_FILES local/sendmailconfig" ;; + "local/sendmail" ) CONFIG_FILES="$CONFIG_FILES local/sendmail" ;; + "local/update_auth" ) CONFIG_FILES="$CONFIG_FILES local/update_auth" ;; + "local/update_authm4" ) CONFIG_FILES="$CONFIG_FILES local/update_authm4" ;; + "local/update_conf" ) CONFIG_FILES="$CONFIG_FILES local/update_conf" ;; + "local/update_db" ) CONFIG_FILES="$CONFIG_FILES local/update_db" ;; + "local/update_ldap" ) CONFIG_FILES="$CONFIG_FILES local/update_ldap" ;; + "local/update_mc" ) CONFIG_FILES="$CONFIG_FILES local/update_mc" ;; + "local/update_mk" ) CONFIG_FILES="$CONFIG_FILES local/update_mk" ;; + "local/update_smrsh" ) CONFIG_FILES="$CONFIG_FILES local/update_smrsh" ;; + "local/update_sys" ) CONFIG_FILES="$CONFIG_FILES local/update_sys" ;; + "local/update_tls" ) CONFIG_FILES="$CONFIG_FILES local/update_tls" ;; + "local/update_tlsm4" ) CONFIG_FILES="$CONFIG_FILES local/update_tlsm4" ;; + "local/bug/sendmail/script" ) CONFIG_FILES="$CONFIG_FILES local/bug/sendmail/script" ;; + "sensible_mda/Makefile" ) CONFIG_FILES="$CONFIG_FILES sensible_mda/Makefile" ;; + "sensible_mda/sensible-mda.c" ) CONFIG_FILES="$CONFIG_FILES sensible_mda/sensible-mda.c" ;; + "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; @@ -8157,6 +10397,9 @@ if $ac_need_defaults; then test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason to put it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. # Create a temporary directory, and hook for its removal unless debugging. $debug || { @@ -8165,17 +10408,17 @@ $debug || } # Create a (secure) tmp directory for tmp files. -: ${TMPDIR=/tmp} + { - tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` && + tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { - tmp=$TMPDIR/cs$$-$RANDOM + tmp=./confstat$$-$RANDOM (umask 077 && mkdir $tmp) } || { - echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } @@ -8223,6 +10466,45 @@ s,@ECHO_C@,$ECHO_C,;t t s,@ECHO_N@,$ECHO_N,;t t s,@ECHO_T@,$ECHO_T,;t t s,@LIBS@,$LIBS,;t t +s,@build@,$build,;t t +s,@build_cpu@,$build_cpu,;t t +s,@build_vendor@,$build_vendor,;t t +s,@build_os@,$build_os,;t t +s,@host@,$host,;t t +s,@host_cpu@,$host_cpu,;t t +s,@host_vendor@,$host_vendor,;t t +s,@host_os@,$host_os,;t t +s,@target@,$target,;t t +s,@target_cpu@,$target_cpu,;t t +s,@target_vendor@,$target_vendor,;t t +s,@target_os@,$target_os,;t t +s,@SET_MAKE@,$SET_MAKE,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@CYGPATH_W@,$CYGPATH_W,;t t +s,@PACKAGE@,$PACKAGE,;t t +s,@VERSION@,$VERSION,;t t +s,@ACLOCAL@,$ACLOCAL,;t t +s,@AUTOCONF@,$AUTOCONF,;t t +s,@AUTOMAKE@,$AUTOMAKE,;t t +s,@AUTOHEADER@,$AUTOHEADER,;t t +s,@MAKEINFO@,$MAKEINFO,;t t +s,@install_sh@,$install_sh,;t t +s,@STRIP@,$STRIP,;t t +s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t +s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t +s,@mkdir_p@,$mkdir_p,;t t +s,@AWK@,$AWK,;t t +s,@am__leading_dot@,$am__leading_dot,;t t +s,@AMTAR@,$AMTAR,;t t +s,@am__tar@,$am__tar,;t t +s,@am__untar@,$am__untar,;t t +s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t +s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t +s,@MAINT@,$MAINT,;t t +s,@ac_version@,$ac_version,;t t +s,@am_version@,$am_version,;t t s,@SM_VERS@,$SM_VERS,;t t s,@SM_DATE@,$SM_DATE,;t t s,@SM_MINVERS@,$SM_MINVERS,;t t @@ -8239,6 +10521,7 @@ s,@sm_version_minor@,$sm_version_minor,;t t s,@sm_version_beta@,$sm_version_beta,;t t s,@sm_version_math@,$sm_version_math,;t t s,@sm_revision@,$sm_revision,;t t +s,@sm_custom@,$sm_custom,;t t s,@buildtree@,$buildtree,;t t s,@docdir@,$docdir,;t t s,@sm_dist_name@,$sm_dist_name,;t t @@ -8262,10 +10545,18 @@ s,@CPPFLAGS@,$CPPFLAGS,;t t s,@ac_ct_CC@,$ac_ct_CC,;t t s,@EXEEXT@,$EXEEXT,;t t s,@OBJEXT@,$OBJEXT,;t t +s,@DEPDIR@,$DEPDIR,;t t +s,@am__include@,$am__include,;t t +s,@am__quote@,$am__quote,;t t +s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t +s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t +s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t +s,@CCDEPMODE@,$CCDEPMODE,;t t +s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t +s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t s,@CPP@,$CPP,;t t -s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t -s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t -s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@LN_S@,$LN_S,;t t +s,@EGREP@,$EGREP,;t t s,@sm_incdirs@,$sm_incdirs,;t t s,@sm_mapdef@,$sm_mapdef,;t t s,@sm_envdef@,$sm_envdef,;t t @@ -8317,6 +10608,8 @@ s,@sm_enable_newdb@,$sm_enable_newdb,;t t s,@sm_enable_nis@,$sm_enable_nis,;t t s,@sm_enable_nisplus@,$sm_enable_nisplus,;t t s,@sm_enable_ldap@,$sm_enable_ldap,;t t +s,@SM_ENABLE_LDAP_TRUE@,$SM_ENABLE_LDAP_TRUE,;t t +s,@SM_ENABLE_LDAP_FALSE@,$SM_ENABLE_LDAP_FALSE,;t t s,@sm_enable_bind@,$sm_enable_bind,;t t s,@sm_enable_hesiod@,$sm_enable_hesiod,;t t s,@sm_enable_tcpd@,$sm_enable_tcpd,;t t @@ -8325,7 +10618,13 @@ s,@sm_enable_maillock@,$sm_enable_maillock,;t t s,@sm_enable_sfio@,$sm_enable_sfio,;t t s,@sm_enable_auth@,$sm_enable_auth,;t t s,@sm_auth_lib@,$sm_auth_lib,;t t +s,@SM_ENABLE_AUTH_TRUE@,$SM_ENABLE_AUTH_TRUE,;t t +s,@SM_ENABLE_AUTH_FALSE@,$SM_ENABLE_AUTH_FALSE,;t t s,@sm_enable_tls@,$sm_enable_tls,;t t +s,@SM_ENABLE_TLS_TRUE@,$SM_ENABLE_TLS_TRUE,;t t +s,@SM_ENABLE_TLS_FALSE@,$SM_ENABLE_TLS_FALSE,;t t +s,@LIBOBJS@,$LIBOBJS,;t t +s,@LTLIBOBJS@,$LTLIBOBJS,;t t CEOF _ACEOF @@ -8355,9 +10654,9 @@ _ACEOF (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else - ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end @@ -8375,46 +10674,51 @@ for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` - { case "$ac_dir" in - [\\/]* | ?:[\\/]* ) as_incr_dir=;; - *) as_incr_dir=.;; -esac -as_dummy="$ac_dir" -for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do - case $as_mkdir_dir in - # Skip DOS drivespec - ?:) as_incr_dir=$as_mkdir_dir ;; - *) - as_incr_dir=$as_incr_dir/$as_mkdir_dir - test -d "$as_incr_dir" || - mkdir "$as_incr_dir" || - { { echo "$as_me:$LINENO: error: cannot create \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create \"$ac_dir\"" >&2;} - { (exit 1); exit 1; }; } - ;; - esac -done; } + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } ac_builddir=. @@ -8441,12 +10745,45 @@ case $srcdir in ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac -# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be -# absolute. -ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` -ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd` -ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` -ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac case $INSTALL in @@ -8454,11 +10791,6 @@ ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` *) ac_INSTALL=$ac_top_builddir$INSTALL ;; esac - if test x"$ac_file" != x-; then - { echo "$as_me:$LINENO: creating $ac_file" >&5 -echo "$as_me: creating $ac_file" >&6;} - rm -f "$ac_file" - fi # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ @@ -8468,7 +10800,7 @@ echo "$as_me: creating $ac_file" >&6;} configure_input="$ac_file. " fi configure_input=$configure_input"Generated from `echo $ac_file_in | - sed 's,.*/,,'` by configure." + sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. @@ -8477,26 +10809,32 @@ echo "$as_me: creating $ac_file" >&6;} case $f in -) echo $tmp/stdin ;; [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } - echo $f;; + echo "$f";; *) # Relative - if test -f "$f"; then - # Build tree - echo $f - elif test -f "$srcdir/$f"; then - # Source tree - echo $srcdir/$f - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } - fi;; + fi;; esac done` || { (exit 1); exit 1; } + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub @@ -8524,6 +10862,74 @@ s,@INSTALL@,$ac_INSTALL,;t t rm -f $tmp/out fi + # Run the commands associated with the file. + case $ac_file in + Makefile ) chmod a+x ./Makefile ;; + build/debian/changelog.sh ) + echo 'creating ./build/debian/changelog.in'; + chmod ug+x ./build/debian/changelog.sh; + ./build/debian/changelog.sh; ;; + build/debian/changelog ) + cp build/debian/changelog ./; ;; + build/update_chaos ) + echo 'Updating Build setup'; + chmod ug+x ./build/update_chaos; + (cd ../ && ./debian/build/update_chaos); ;; + build/debian/control.m4 ) + echo 'creating ./control'; + m4 ./build/debian/control.m4 > ./build/debian/control; + cp ./build/debian/control ./; ;; + libmilter0.postrm ) chmod a+x ./libmilter0.postrm ;; + libmilter0.preinst ) chmod a+x ./libmilter0.preinst ;; + libmilter-dev.postrm ) chmod a+x ./libmilter-dev.postrm ;; + libmilter-dev.preinst ) chmod a+x ./libmilter-dev.preinst ;; + rmail.postrm ) chmod a+x ./rmail.postrm ;; + rmail.preinst ) chmod a+x ./rmail.preinst ;; + sendmail-base.postinst ) chmod a+x ./sendmail-base.postinst ;; + sendmail-base.postrm ) chmod a+x ./sendmail-base.postrm ;; + sendmail-base.preinst ) chmod a+x ./sendmail-base.preinst ;; + sendmail-base.prerm ) chmod a+x ./sendmail-base.prerm ;; + sendmail-doc.postrm ) chmod a+x ./sendmail-doc.postrm ;; + sendmail-doc.preinst ) chmod a+x ./sendmail-doc.preinst ;; + sendmail-cf.postrm ) chmod a+x ./sendmail-cf.postrm ;; + sendmail-cf.preinst ) chmod a+x ./sendmail-cf.preinst ;; + sendmail.cron.daily ) chmod a+x ./sendmail.cron.daily ;; + sendmail.init.d ) chmod a+x ./sendmail.init.d ;; + sendmail-bin.postinst ) chmod a+x ./sendmail-bin.postinst ;; + sendmail-bin.postrm ) chmod a+x ./sendmail-bin.postrm ;; + sendmail-bin.preinst ) chmod a+x ./sendmail-bin.preinst ;; + sendmail-bin.prerm ) chmod a+x ./sendmail-bin.prerm ;; + sensible-mda.postrm ) chmod a+x ./sensible-mda.postrm ;; + sensible-mda.preinst ) chmod a+x ./sensible-mda.preinst ;; + cf/Makefile ) chmod a+x ./cf/Makefile ;; + examples/Makefile ) chmod a+x ./examples/Makefile ;; + examples/dhcp3/dhclient-exit-hooks.d/sendmail ) chmod a+x ./examples/dhcp3/dhclient-exit-hooks.d/sendmail ;; + examples/network/if-down.d/sendmail ) chmod a+x ./examples/network/if-down.d/sendmail ;; + examples/network/if-up.d/sendmail ) chmod a+x ./examples/network/if-up.d/sendmail ;; + examples/ppp/ip-down.d/sendmail ) chmod a+x ./examples/ppp/ip-down.d/sendmail ;; + examples/ppp/ip-up.d/sendmail ) chmod a+x ./examples/ppp/ip-up.d/sendmail ;; + examples/resolvconf/update-libc.d/sendmail ) chmod a+x ./examples/resolvconf/update-libc.d/sendmail ;; + local/Makefile ) chmod a+x ./local/Makefile ;; + local/Parse_conf.pm ) chmod a+x ./local/Parse_conf.pm ;; + local/Parse_mc.pm ) chmod a+x ./local/Parse_mc.pm ;; + local/dynamic ) chmod a+x ./local/dynamic ;; + local/parse_mc ) chmod a+x ./local/parse_mc ;; + local/sendmailconfig ) chmod a+x ./local/sendmailconfig ;; + local/sendmail ) chmod a+x ./local/sendmail ;; + local/update_auth ) chmod a+x ./local/update_auth ;; + local/update_authm4 ) chmod a+x ./local/update_authm4 ;; + local/update_conf ) chmod a+x ./local/update_conf ;; + local/update_db ) chmod a+x ./local/update_db ;; + local/update_ldap ) chmod a+x ./local/update_ldap ;; + local/update_mc ) chmod a+x ./local/update_mc ;; + local/update_mk ) chmod a+x ./local/update_mk ;; + local/update_smrsh ) chmod a+x ./local/update_smrsh ;; + local/update_sys ) chmod a+x ./local/update_sys ;; + local/update_tls ) chmod a+x ./local/update_tls ;; + local/update_tlsm4 ) chmod a+x ./local/update_tlsm4 ;; + local/bug/sendmail/script ) chmod a+x ./local/bug/sendmail/script ;; + sensible_mda/Makefile ) chmod a+x ./sensible_mda/Makefile ;; + esac done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF @@ -8536,16 +10942,41 @@ for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_dir=`(dirname "$ac_dest") 2>/dev/null || $as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_dest" : 'X\(//\)[^/]' \| \ - X"$ac_dest" : 'X\(//\)$' \| \ - X"$ac_dest" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || + X"$ac_dest" : 'X\(//\)[^/]' \| \ + X"$ac_dest" : 'X\(//\)$' \| \ + X"$ac_dest" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || echo X"$ac_dest" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + ac_builddir=. if test "$ac_dir" != .; then @@ -8571,60 +11002,134 @@ case $srcdir in ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac -# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be -# absolute. -ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` -ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd` -ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` -ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 echo "$as_me: executing $ac_dest commands" >&6;} case $ac_dest in - default ) -# -# Update the files just created -echo 'creating ./changelog'; -chmod ug+x ./build/changelog.sh; -./build/changelog.sh; -echo 'creating ./control'; -m4 ./build/control.m4 > ./control; -echo 'Updating Build setup'; -chmod ug+x ./build/update_chaos; -(cd ../ && ./debian/build/update_chaos); -# -# Make *.{pre,post}{rm,inst} executable -chmod ug+x ./libmilter-dev.postrm; -chmod ug+x ./libmilter-dev.preinst; -chmod ug+x ./sendmail-doc.postrm; -chmod ug+x ./sendmail-doc.preinst; -chmod ug+x ./sendmail.cron.daily; -chmod ug+x ./sendmail.init.d; -chmod ug+x ./sendmail.postinst; -chmod ug+x ./sendmail.postrm; -chmod ug+x ./sendmail.preinst; -chmod ug+x ./sendmail.prerm; -# -# Make rules, */Makefile executable -chmod ug+x ./rules; -chmod ug+x ./local/Makefile; -chmod ug+x ./sensible_mda/Makefile; -# -# Make other, misc files executable -chmod ug+x ./local/Parse_mc.pm; -chmod ug+x ./local/parse_mc; -chmod ug+x ./local/sendmailconfig; -chmod ug+x ./local/sendmail; -chmod ug+x ./local/update_auth; -chmod ug+x ./local/update_conf; -chmod ug+x ./local/update_db; -chmod ug+x ./local/update_ldap; -chmod ug+x ./local/update_mc; -chmod ug+x ./local/update_mk; -chmod ug+x ./local/update_smrsh; -chmod ug+x ./local/update_sys; -chmod ug+x ./local/update_tls; + depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`(dirname "$mf") 2>/dev/null || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`(dirname "$file") 2>/dev/null || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p $dirpart/$fdir + else + as_dir=$dirpart/$fdir + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 +echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} + { (exit 1); exit 1; }; }; } + + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done ;; esac done @@ -8648,8 +11153,11 @@ ac_clean_files=$ac_clean_files_save # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null - $SHELL $CONFIG_STATUS || ac_cs_success=false + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. diff --git a/debian/configure.ac b/debian/configure.ac index 4bd0a41..54c64d2 100644 --- a/debian/configure.ac +++ b/debian/configure.ac @@ -1 +1,1724 @@ -Mon Mar 3 22:36:13 UTC 2003 +#------------------------------------------------------------------------------ +# +# $Sendmail: ./configure.ac,v 8.12.4 2002/06/03 12:45:00 cowboy Exp $ +# +# Copyright (c) 1998-2004 Richard Nelson. All Rights Reserved. +# +# Debian configure file for building Sendmail +# Note: this file supports Sendmail 8.7.6 - 8.12.8 +# and has been tested on autoconf 2.12, 2.13, 2.50, 2.52, 2.53 +# +# Note: Most of this file is vanilla 2.12, but the copyright and +# ac_init portion are dual-pathed to better support 2.50+ +# +#------------------------------------------------------------------------------ +define([_SM_CPYRT], [2005])dnl +define([_SM_VERS], [8.13.3])dnl +define([_SM_DATE], [2005-02-21 21:00:00])dnl +define([_SM_MAXVERS],[9.0.0])dnl +define([_SM_MINVERS],[8.7.6])dnl + +dnl #------------------------------------------------------------------- +dnl # Obtain version of GNU Autoconf and automake (don't look) +dnl #------------------------------------------------------------------- +ifdef([AC_COPYRIGHT], +[define([_ac_version], m4_PACKAGE_VERSION)] +,[define([_ac_version], AC_ACVERSION)]) +m4_ifdef([AM_AUTOMAKE_VERSION],[dnl +m4_define([_TMP_], m4_defn([AM_AUTOMAKE_VERSION]))dnl +dnl delete a char $2 from a string $1 if it is there +m4_define([_DELCHAR_],[m4_define([_IDX_],[m4_index([$1],[$2])])[]m4_define([_I_],[m4_eval(_IDX_ >= 0)])[]m4_if(_I_,[1],[m4_substr([$1],0,_IDX_)[]m4_substr([$1],m4_eval(_IDX_+1))],[$1])])dnl +dnl delete a char $2 (and everything before it from a string $1 if it is there +m4_define([_DELPFX_],[m4_define([_IDX_],[m4_index([$1],[$2])])[]m4_define([_I_],[m4_eval(_IDX_ >= 0)])[]m4_if(_I_,[1],[m4_substr([$1],m4_eval(_IDX_+1))],[$1])])dnl +m4_define([_am_version], [_DELCHAR_(_DELPFX_(_TMP_,["]),["])])dnl +],[dnl +define([_am_version],[<=1.5]) +])dnl + +dnl #------------------------------------------------------------------- +dnl # Redefine AC_{COPYRIGHT,INIT_BINSH} to provide RCS IDs and copyright +dnl # notice at top of generated configure script. Prints simple copyright. +dnl #------------------------------------------------------------------- +ifdef([AC_COPYRIGHT], +[AC_COPYRIGHT( +[[# +# $]Sendmail[$ +# from] translit([$Sendmail: ./configure.ac,v] _SM_VERS _SM_DATE [$], $")] [ +# +cat <<EOF + + Copyright (c) 1998-_SM_CPYRT Richard Nelson. All Rights Reserved. + + Sendmail _SM_VERS + Generated by Autoconf _ac_version, Automake _am_version + + Debian configure script for building Sendmail + Note: this file supports Sendmail _SM_MINVERS - _SM_MAXVERS + and has been tested on autoconf 2.12, 2.13, 2.50, 2.52, 2.53 + + +EOF +])], +[define([AC_INIT_BINSH], +[[#! /bin/sh +# $]Sendmail[$ +# from] translit([$Sendmail: ./configure.ac,v] _SM_VERS _SM_DATE [$], $")] [ +# +cat <<EOF + + Copyright (c) 1998-_SM_CPYRT Richard Nelson. All Rights Reserved. + + Sendmail _SM_VERS + Generated by Autoconf _ac_version, Automake _am_version + + Debian configure script for building Sendmail + Note: this file supports Sendmail _SM_MINVERS - _SM_MAXVERS + and has been tested on autoconf 2.12, 2.13, 2.50, 2.52, 2.53 + +EOF +])dnl]) + +#------------------------------------------------------------------- +# Configure.in for Sendmail +#------------------------------------------------------------------- +AC_REVISION([$Revision: ]_SM_VERS[ $]) +define([AC_INIT_BINSH],)dnl +ifdef([AC_COPYRIGHT],[ +AC_INIT([Sendmail],_SM_VERS,[bug/reportbug or sendmail@packages.debian.org]) +AC_CONFIG_SRCDIR([./build/site.config.m4.in])dnl +],[ +AC_INIT(./build/site.config.m4.in) +[PACKAGE='Sendmail';] # For earlier automake versions +[PACKAGE_NAME='Sendmail';] +AC_SUBST(PACKAGE_NAME) AC_SUBST(PACKAGE_STRING) +])dnl +AC_CONFIG_AUX_DIR([./build])dnl +AC_CANONICAL_SYSTEM +AC_ARG_PROGRAM +AC_PROG_MAKE_SET +AM_INIT_AUTOMAKE +AM_MAINTAINER_MODE +ac_version="_ac_version"; +am_version="_am_version"; +AC_SUBST(ac_version) AC_SUBST(am_version) +ifdef([AM_AUTOMAKE_VERSION],[ +[am_version="$am__api_version";] +],[ +[am_version='<=1.5';] +])dnl + + +dnl #------------------------------------------------------------------- +dnl # Set current, min, max versions supported +dnl #------------------------------------------------------------------- +SM_VERS='_SM_VERS'; +SM_DATE='_SM_DATE'; +SM_MINVERS='_SM_MINVERS'; +SM_MAXVERS='_SM_MAXVERS'; +SM_CPYRT='_SM_CPYRT'; +AC_SUBST([SM_VERS]) AC_SUBST([SM_DATE]) +AC_SUBST([SM_MINVERS]) AC_SUBST([SM_MAXVERS]) +AC_SUBST([SM_CPYRT]) + +dnl #------------------------------------------------------------------- +dnl # Set default prefix to the FHS standard location: /usr/ +dnl #------------------------------------------------------------------- +AC_PREFIX_DEFAULT([/usr]) + +#------------------------------------------------------------------- +# Determine date/time of build +#------------------------------------------------------------------- +#sm_date=[`date --iso-8601=seconds`]; # <== Not valid on older systems !!! +sm_date=[`date +%Y-%m-%dT%H:%M:%S%z`]; +sm_utc=[$(expr "$sm_date" : '.*T.*\([+-].*\)');] +sm_time=[$(expr "$sm_date" : '.*T\(.*\)[+-]');] +sm_date=[$(expr "$sm_date" : '\(.*\)T');] +AC_SUBST(sm_date) AC_SUBST(sm_time) AC_SUBST(sm_utc) + +#------------------------------------------------------------------- +# Determine sendmail version +#------------------------------------------------------------------- +if test -f ../build-tree/*/sendmail/version.c; then + version_file='../build-tree/*/sendmail/version.c'; + sm_version=[`sed -ne "s/char[[:space:]]*Version\[\] = \"\([^\"]*\)\";/\1/p"] $version_file`; +else + curr_dir=[$(echo `pwd` | sed -e 's/\/debian$//' -);] + version=[$(expr "${curr_dir}" : '.*-\([0-9.].*\)');] + beta_version=[$(expr "${curr_dir}" : '.*+\([0-9.].*\)');] + if test -z "$beta_version"; then + sm_version="$version"; + else + sm_version="$beta_version"; + fi; + fi; +if test -z "$sm_version"; then + version_file='./build/version.c'; + if test -f $version_file; then + sm_version=[`sed -ne "s/char[[:space:]]*Version\[\] = \"\([^\"]*\)\";/\1/p" $version_file`;] + fi; + fi; + +if test -z "$sm_version"; then + AC_MSG_ERROR([could not determine Sendmail version]) + fi; +[PACKAGE_VERSION="${sm_version}"; +PACKAGE_STRING="${PACKAGE_NAME} ${PACKAGE_VERSION}";] + +# +# break the version into pieces for easier comparisons +# v,r = separate components (8.12.0.Beta7 = 8 12) +# major = 1st two components (8.9.3 -> 8.9) +# minor = last component (8.9.3 -> 3) +# beta = suffix for beta version (8.12.0.Beta7 -> 7) +# math = for numeric (<, >=, etc.) comparisons +# 9.0.0 = 589824 (9.0 = 589824) +# 8.13.1 = 527617 (8.13 = 527616) +# 8.12.11 = 527371 (8.12 = 527360) +# 8.11.7 = 527111 (8.11 = 527104) +# 8.10.2 = 526850 (8.10 = 526848) +# 8.9.3 = 526595 (8.9 = 526592) +# 8.8.8 = 526344 (8.8 = 526336) +# 8.7.6 = 526086 (8.7 = 526080) +v2i () {[ + sm_version_test=`expr 65536 \* $(expr "$1" : '\([0-9]*\)') + \ + 256 \* $(expr "$1" : '[0-9]*\.\([0-9]*\)') + \ + $(expr "$1" : '[0-9]*\.[0-9]*\.\([0-9]*\)')`; + #echo "v2i($1)=$sm_version_test"; + ]}; +i2v () {[ + val=$1; + major=`expr $val / 65536`; + val=`expr $val % 65536`; + minor=`expr $val / 256`; + val=`expr $val % 256`; + result="$major.$minor.$val"; + #echo "i2v($1)=$result"; + #return $result; + ]}; +sm_version_v=[`expr $sm_version : '\([0-9]*\)'`]; +sm_version_r=[`expr $sm_version : '[0-9]*\.\([0-9]*\)'`]; +sm_version_major=["$sm_version_v.$sm_version_r"]; +sm_version_minor=[`expr $sm_version : '[0-9]*\.[0-9]*\.\([0-9]*\)'`]; +sm_version_beta=[`expr $sm_version : '[0-9]*\.[0-9]*\.[0-9]*\.Beta\([0-9]*\)'`]; +sm_version_math=[`expr 65536 \* $sm_version_v \ + + 256 \* $sm_version_r \ + + $sm_version_minor`]; +AC_SUBST(sm_version) AC_SUBST(sm_version_v) AC_SUBST(sm_version_r) +AC_SUBST(sm_version_major) AC_SUBST(sm_version_minor) +AC_SUBST(sm_version_beta) AC_SUBST(sm_version_math) + +#------------------------------------------------------------------- +# Configuration for Sendmail +#------------------------------------------------------------------- +#checks for programs +#checks for libraries +#checks for header files +#checks for typedefs +#checks for structures +#checks for compiler characteristics +#checks for library functions +#checks for system services + +#------------------------------------------------------------------- +# Initialize variables +#------------------------------------------------------------------- +# +# Initialize variables - value is one of: +# no: don't even try to include support for +# yes: require support for +# auto: support if present, warn if not +# +#------------------------------------------------------------------- +AC_ARG_WITH(buildtree, [[ --with-buildtree=.......Build directory [.]]], + [buildtree="$withval"], [docdir='.']) +AC_ARG_WITH(docdir, [[ --with-docdir=..........Document directory [PREFIX/doc]]], + [docdir="$withval"], [docdir='${prefix}/doc']) +AC_ARG_WITH(revision, [[ --with-revision=........Package revision ['']]], + [sm_revision="$withval"], [sm_revision='']) +AC_ARG_WITH(custom, [[ --with-custom=..........Custom package name ['']]], + [sm_custom="$withval"], [sm_custom='']) +AC_ARG_ENABLE(regex, [[ --enable-regex=.........Allow REGEX maps [auto]]], + [sm_enable_regex="$enableval"], [sm_enable_regex=auto]) +AC_ARG_ENABLE(ndbm, [[ --enable-ndbm=..........Allow NDBM maps [auto]]], + [sm_enable_ndbm="$enableval"], [sm_enable_ndbm=auto]) +AC_ARG_ENABLE(newdb, [[ --enable-newdb=.........Allow NEWDB maps [auto]]], + [sm_enable_newdb="$enableval"], [sm_enable_newdb=auto]) +AC_ARG_ENABLE(nis, [[ --enable-nis=...........Allow NIS maps [auto]]], + [sm_enable_nis="$enableval"], [sm_enable_nis=auto]) +AC_ARG_ENABLE(nisplus, [[ --enable-nisplus=.......Allow NISPLUS maps [auto]]], + [sm_enable_nisplus="$enableval"], [sm_enable_nisplus=auto]) +AC_ARG_ENABLE(ldap, [[ --enable-ldap=..........Allow LDAP maps [auto]]], + [sm_enable_ldap="$enableval"], [sm_enable_ldap=auto]) +AC_ARG_ENABLE(hesiod, [[ --enable-hesiod=........Allow HESIOD maps [auto]]], + [sm_enable_hesiod="$enableval"], [sm_enable_hesiod=auto]) +AC_ARG_ENABLE(tcpd, [[ --enable-tcpd=..........Allow TCP wrappers [auto]]], + [sm_enable_tcpd="$enableval"], [sm_enable_tcpd=auto]) +AC_ARG_ENABLE(bind, [[ --enable-bind=..........Allow BIND usage [auto]]], + [sm_enable_bind="$enableval"], [sm_enable_bind=auto]) +AC_ARG_ENABLE(ipv6, [[ --enable-ipv6=..........Allow IPv6 usage [auto]]], + [sm_enable_ipv6="$enableval"], [sm_enable_ipv6=auto]) +AC_ARG_ENABLE(maillock,[[ --enable-maillock=......Allow maillock [auto]]], + [sm_enable_maillock="$enableval"], [sm_enable_maillock=auto]) +AC_ARG_ENABLE(milter, [[ --enable-milter=........Allow milter [auto]]], + [sm_enable_milter="$enableval"], [sm_enable_milter=auto]) +AC_ARG_ENABLE(sfio, [[ --enable-sfio=..........Allow SFIO usage [auto]]], + [sm_enable_sfio="$enableval"], [sm_enable_sfio=auto]) +AC_ARG_ENABLE(auth, [[ --enable-auth=..........Allow SMTP auth [auto]]], + [sm_enable_auth="$enableval"], [sm_enable_auth=auto]) +AC_ARG_ENABLE(tls, [[ --enable-tls=...........Allow TLS/SSL [auto]]], + [sm_enable_tls="$enableval"], [sm_enable_tls=auto]) +AC_ARG_ENABLE(shm, [[ --enable-shm=...........Allow shared memory [auto]]], + [sm_enable_shm="$enableval"], [sm_enable_shm=auto]) +AC_ARG_ENABLE(doc, [[ --enable-doc=...........Build sendmail-doc pkg]], + [sm_enable_doc="$enableval"], [sm_enable_doc=auto]) +AC_ARG_ENABLE(dev, [[ --enable-dev=...........Build libmilter-dev pkg]], + [sm_enable_dev="$enableval"], [sm_enable_dev=auto]) + +#------------------------------------------------------------------- +# Resolve variables for sendmail Makefiles and .m4 where +# exec_prefix=${prefix} will not work... +#------------------------------------------------------------------- +#eval PACKAGE_VERSION="${PACKAGE_VERSION}" +#eval PACKAGE_STRING="${PACKAGE_STRING}" +test "x$prefix" = xNONE && prefix=$ac_default_prefix +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' +eval prefix="${prefix}"; +eval exec_prefix="${exec_prefix}"; +eval bindir="${bindir}"; +eval sbindir="${sbindir}"; +eval libexecdir="${libexecdir}"; +eval datadir="${datadir}"; +eval sysconfdir="${sysconfdir}"; +eval sharedstatedir="${sharedstatedir}"; +eval localstatedir="${localstatedir}"; +eval libdir="${libdir}"; +eval includedir="${includedir}"; +eval oldincludedir="${oldincludedir}"; +eval infodir="${infodir}"; +eval mandir="${mandir}"; +eval srcdir="${srcdir}"; + +AC_SUBST(sm_revision) +test -n "$sm_custom" && sm_custom="${sm_custom}."; +AC_SUBST(sm_custom) +eval buildtree="${buildtree}"; AC_SUBST(buildtree) +eval docdir="${docdir}"; AC_SUBST(docdir) + +#------------------------------------------------------------------- +# Determine Distribution and version to build for +#------------------------------------------------------------------- +sm_dist_name=''; AC_SUBST(sm_dist_name) +sm_dist_vers=''; AC_SUBST(sm_dist_vers) +DEBIAN=''; AC_SUBST(DEBIAN) +DEBIAN_DH=''; AC_SUBST(DEBIAN_DH) +AC_MSG_CHECKING(for Debian) +if test ! -f /etc/debian_version ; then + DEBIAN='no'; + AC_MSG_RESULT(["$DEBIAN"]) +else + DEBIAN='yes'; + sm_dist_name='Debian'; + sm_dist_vers=`cat /etc/debian_version`; + # Determine which level of debhelper we're building with + DEBIAN_DH='1'; + if test -x /usr/bin/dh_testversion; then + # Must run this test above the debian directory + if (cd .. && dh_testversion 4.1.0 2>/dev/null); then + DEBIAN_DH='4.1'; + elif (cd .. && dh_testversion 4.0.0 2>/dev/null); then + DEBIAN_DH='4'; + elif (cd .. && dh_testversion 3.0.0 2>/dev/null); then + DEBIAN_DH='3'; + elif (cd .. && dh_testversion 2.0.40 2>/dev/null); then + DEBIAN_DH='2'; + else + DEBIAN_DH='1'; + fi; + fi; + if test -x /usr/bin/dpkg-architecture; then + eval `dpkg-architecture -s`; + fi; + sm_build_arch="$DEB_BUILD_ARCH" + sm_host_arch="$DEB_HOST_ARCH" + AC_SUBST(DEB_BUILD_ARCH) AC_SUBST(DEB_BUILD_GNU_CPU) + AC_SUBST(DEB_BUILD_GNU_SYSTEM) AC_SUBST(DEB_BUILD_GNU_TYPE) + AC_SUBST(DEB_HOST_ARCH) AC_SUBST(DEB_HOST_GNU_CPU) + AC_SUBST(DEB_HOST_GNU_SYSTEM) AC_SUBST(DEB_HOST_GNU_TYPE) + AC_MSG_RESULT([$DEBIAN, using debhelper v$DEBIAN_DH]) + fi; + +#------------------------------------------------------------------- +# Announce our presence... +#------------------------------------------------------------------- +AC_SUBST(sm_build_arch) AC_SUBST(sm_host_arch) +echo "" +echo "Sendmail ${sm_custom}${sm_version}${sm_revision} \ +on ${sm_dist_name} ${sm_dist_vers} ${sm_build_arch}/${sm_host_arch}."; +echo "Generated by Autoconf ${ac_version}, Automake ${am_version}."; +echo ""; + +#------------------------------------------------------------------- +# Required programs +# cc, cpp +# install +# egrep +# std includes +#------------------------------------------------------------------- +dnl AC_CANONICAL_HOST +AC_PROG_CC +AC_PROG_CPP +AC_PROG_INSTALL +AC_PROG_LN_S +ifdef([AC_PROG_EGREP], +[AC_PROG_EGREP] +) +AC_HEADER_STDC + +#------------------------------------------------------------------- +# Variables used in site.config.m4.in to set corresponding Build vars +#------------------------------------------------------------------- +# Global +sm_incdirs=''; AC_SUBST(sm_incdirs) +sm_mapdef=''; AC_SUBST(sm_mapdef) +sm_envdef=''; AC_SUBST(sm_envdef) +sm_libs=''; AC_SUBST(sm_libs) +# editmap +sm_editmap_envdef=''; AC_SUBST(sm_editmap_envdef) +sm_editmap_libs=''; AC_SUBST(sm_editmap_libs) +# libmilter +sm_libmilter_envdef='-fPIC'; AC_SUBST(sm_libmilter_envdef) +sm_libmilter_libs=''; AC_SUBST(sm_libmilter_libs) +# libsm +sm_libsm_envdef='-fPIC'; AC_SUBST(sm_libsm_envdef) +sm_libsm_libs=''; AC_SUBST(sm_libsm_libs) +# libsmdb +sm_libsmdb_envdef=''; AC_SUBST(sm_libsmdb_envdef) +sm_libsmdb_libs=''; AC_SUBST(sm_libsmdb_libs) +# libsmutil +sm_libsmutil_envdef='-fPIC'; AC_SUBST(sm_libsmutil_envdef) +sm_libsmutil_libs=''; AC_SUBST(sm_libsmutil_libs) +# mail.local +sm_mail_local_envdef=''; AC_SUBST(sm_mail_local_envdef) +sm_mail_local_libs=''; AC_SUBST(sm_mail_local_libs) +# mailstats +sm_mailstats_envdef=''; AC_SUBST(sm_mailstats_envdef) +sm_mailstats_libs=''; AC_SUBST(sm_mailstats_libs) +# makemap +sm_makemap_envdef=''; AC_SUBST(sm_makemap_envdef) +sm_makemap_libs=''; AC_SUBST(sm_makemap_libs) +# praliases +sm_praliases_envdef=''; AC_SUBST(sm_praliases_envdef) +sm_praliases_libs=''; AC_SUBST(sm_praliases_libs) +# rmail +sm_rmail_envdef=''; AC_SUBST(sm_rmail_envdef) +sm_rmail_libs=''; AC_SUBST(sm_rmail_libs) +# sendmail +sm_sendmail_envdef=''; AC_SUBST(sm_sendmail_envdef) +sm_sendmail_libs=''; AC_SUBST(sm_sendmail_libs) +# smrsh +sm_smrsh_envdef=''; AC_SUBST(sm_smrsh_envdef) +sm_smrsh_libs=''; AC_SUBST(sm_smrsh_libs) +# vacation +sm_vacation_envdef=''; AC_SUBST(sm_vacation_envdef) +sm_vacation_libs=''; AC_SUBST(sm_vacation_libs) + +#------------------------------------------------------------------- +# Auxilliary variables +#------------------------------------------------------------------- +sm_databases=''; AC_SUBST(sm_databases) +sm_features=''; AC_SUBST(sm_features) +sm_badepends=''; AC_SUBST(sm_badepends) +sm_depends=''; AC_SUBST(sm_depends) +sm_recommends=''; AC_SUBST(sm_recommends) +sm_suggests=''; AC_SUBST(sm_suggests) +sm_newdb_lib=''; AC_SUBST(sm_newdb_lib) +sm_ldap_lib=''; AC_SUBST(sm_ldap_lib) +sm_hesiod_parms=''; AC_SUBST(sm_hesiod_parms) +sm_ffr=''; AC_SUBST(sm_ffr) +sm_m4_ffr=''; AC_SUBST(sm_m4_ffr) +AC_SUBST(sm_enable_doc) AC_SUBST(sm_enable_dev) + +#------------------------------------------------------------------- +# Override default/specified values +#------------------------------------------------------------------- +# Change pid from /var/run to /var/run/sendmail/mta to alleviate clutter +sm_sendmail_envdef="$sm_sendmail_envdef \ +-D_PATH_SENDMAILPID=\\\"${localstatedir}/run/sendmail/mta/sendmail.pid\\\""; +# Set paths for smrsh +sm_smrsh_envdef="$sm_smrsh_envdef \ +-DCMDDIR=\\\"${sysconfdir}/mail/smrsh\\\""; +sm_smrsh_envdef="$sm_smrsh_envdef -DPATH=\\\"/usr/bin:/bin\\\""; +# +# Everything we'll build on has strerror(3) +# sm_envdef="$sm_envdef -DHASSTRERROR=1"; +# +# The next two require a patch to {include/sm,sendmail,src}/conf.h +# and would give duplicate definition warnings if left herein +#sm_envdef="$sm_envdef -DUSESETEUID=1 -DHASGETUSERSHELL=1"; +sm_envdef="$sm_envdef -DHASFCHMOD=1 -DHASSETRLIMIT=1"; +# +# Back by request... +#sm_envdef="$sm_envdef -DPICKY_HELO_CHECK"; +# +# flock() doens't work over NFS and there's a rumour of b0rkedness in +# Linux 2.4.x kernels ;( +sm_envdef="$sm_envdef -DHASFLOCK=0"; +sm_libsm_envdef="$sm_libsm_envdef -DHAVE_NANOSLEEP=1"; +sm_ffr="$sm_ffr -D_FFR_QUEUE_SCHED_DBG"; # %%%%%% TESTING %%%%%%%% +# +# version specific setup +if test "$sm_version_major" = "8.13"; then + sm_ffr="$sm_ffr -D_FFR_SKIP_DOMAINS"; + sm_mapdef="$sm_mapdef -DSOCKETMAP"; + sm_ffr="$sm_ffr -D_FFR_BLOCK_PROXIES"; + sm_envdef="$sm_envdef -DUSESETEUID=1 -DHASGETUSERSHELL=1"; + sm_ffr="$sm_ffr -D_FFR_GROUPREADABLEAUTHINFOFILE"; + sm_ffr="$sm_ffr -D_FFR_CONTROL_MSTAT"; + sm_ffr="$sm_ffr -D_FFR_DAEMON_NETUNIX"; + sm_ffr="$sm_ffr -D_FFR_NO_PIPE"; + sm_ffr="$sm_ffr -D_FFR_SHM_STATUS"; + sm_ffr="$sm_ffr -D_FFR_RHS"; + sm_ffr="$sm_ffr -D_FFR_MAIL_MACRO"; + sm_ffr="$sm_ffr -D_FFR_HELONAME"; + sm_m4_ffr="$sm_m4_ffr [define(\`_FFR_MAIL_MACRO')]"; +elif test "$sm_version_major" = "8.12"; then + sm_envdef="$sm_envdef -DUSESETEUID=1 -DHASGETUSERSHELL=1"; + # + # Note: There is a problem with both <=2.2.19 and <=2.4.2-acx in + # that setitimer() sometimes looses events, this is mentioned + # in the man page, but seems to hit even in non-pathologically + # heavy loading. So, we revert back to alarm() - which, thusfar + # has proven stable. + # Note: This actually seems to have been a sendmail issue fixed in 8.12.3 + sm_envdef="$sm_envdef -DSM_CONF_SETITIMER=0"; + # + sm_ffr="$sm_ffr -D_FFR_MAX_FORWARD_ENTRIES=1"; + sm_ffr="$sm_ffr -D_FFR_QUEUEDELAY=1"; + sm_ffr="$sm_ffr -D_FFR_CONTROL_MSTAT"; + sm_ffr="$sm_ffr -D_FFR_GROUPREADABLEAUTHINFOFILE"; + sm_ffr="$sm_ffr -D_FFR_DAEMON_NETUNIX"; + sm_ffr="$sm_ffr -D_FFR_SHM_STATUS"; + sm_ffr="$sm_ffr -D_FFR_RHS"; + sm_ffr="$sm_ffr -D_FFR_MAIL_MACRO"; + sm_m4_ffr="$sm_m4_ffr [define(\`_FFR_MAIL_MACRO')]"; + sm_ffr="$sm_ffr -D_FFR_NO_PIPE"; + sm_ffr="$sm_ffr -D_FFR_QUARANTINE"; + sm_ffr="$sm_ffr -D_FFR_DEAL_WITH_ERROR_SSL"; + sm_mailstats_envdef="$sm_mailstats_envdef -D_FFR_QUARANTINE"; + sm_vacation_envdef="$sm_vaction_envdef -D_FFR_RETURN_ADDR"; +elif test "$sm_version_major" = "8.11"; then + sm_vacation_envdef="$sm_vaction_envdef -D_FFR_DEBUG=1"; + sm_vacation_envdef="$sm_vaction_envdef -D_FFR_LISTDB=1"; + sm_ffr="$sm_ffr -D_FFR_TESTMODE_DROP_PRIVS=1"; + sm_ffr="$sm_ffr -D_FFR_ADDR_TYPE=1"; + sm_ffr="$sm_ffr -D_FFR_ARITH=1"; + sm_ffr="$sm_ffr -D_FFR_QUEUE_FILE_MODE=1"; + sm_ffr="$sm_ffr -D_FFR_MAX_FORWARD_ENTRIES=1"; + sm_ffr="$sm_ffr -D_FFR_QUEUEDELAY=1"; +elif test "$sm_version_major" = "8.10"; then + sm_ffr="$sm_ffr -D_FFR_ADDR_TYPE=1"; + sm_ffr="$sm_ffr -D_FFR_ARITH=1"; + sm_ffr="$sm_ffr -D_FFR_QUEUE_FILE_MODE=1"; + sm_ffr="$sm_ffr -D_FFR_MAX_FORWARD_ENTRIES=1"; + sm_ffr="$sm_ffr -D_FFR_QUEUEDELAY=1"; +elif test "$sm_version_major" = "8.9"; then + sm_ffr="$sm_ffr -D_FFR_MAX_MIME_HEADER_LENGTH=1"; + sm_ffr="$sm_ffr -D_FFR_MAX_HEADERS_LENGTH=1"; + sm_ffr="$sm_ffr -D_FFR_MAXRCPT_OPTION=1"; + sm_ffr="$sm_ffr -D_FFR_DSN_RRT_OPTION=1"; + sm_ffr="$sm_ffr -D_FFR_CONTROL_SOCKET=1"; + sm_ffr="$sm_ffr -D_FFR_TRUSTED_USER=1"; + sm_ffr="$sm_ffr -D_FFR_MAP_SYSLOG=1"; + sm_ffr="$sm_ffr -D_DONT_PROBE_INTERFACES_OPTION=1"; + sm_ffr="$sm_ffr -D_FFR_PIDFILE_OPTION=1"; + sm_ffr="$sm_ffr -D_FFR_DEADLETTERDROP_OPTION=1"; + sm_ffr="$sm_ffr -D_FFR_QUEUE_FILE_MODE=1"; + fi; + +# 8.12.5+ +v2i 8.12.5; +if test $sm_version_math -ge $sm_version_test; then + :; +else + sm_mail_local_envdef="$sm_mail_local_envdef \ +-D_PATH_MAILDIR=\\\"${localstatedir}/mail\\\""; + sm_rmail_envdef="$sm_rmail_envdef \ +-D_PATH_SENDMAIL=\\\"${sbindir}/sendmail\\\""; + sm_vacation_envdef="$sm_vacation_envdef \ +-D_PATH_SENDMAIL=\\\"${sbindir}/sendmail\\\""; + fi; + +# 8.12.0+ +v2i 8.12.0; +if test $sm_version_math -ge $sm_version_test; then + :; +else + :; + fi; + +# 8.11.0+ +v2i 8.11.0; +if test $sm_version_math -ge $sm_version_test; then + :; +else + sm_enable_tls=no; + fi; + +# 8.10.0+ +v2i 8.10.0; +if test $sm_version_math -ge $sm_version_test; then + # SRCROUTE works quite well with glibc 2.1+ (should test for this...) + sm_sendmail_envdef="$sm_sendmail_envdef -DIP_SRCROUTE=1"; + # Allow setting Hostname from $j... + sm_ffr="$sm_ffr -D_FFR_RESET_MACRO_GLOBALS"; + sm_mail_local_envdef="$sm_mail_local_envdef -DCONTENTLENGTH"; + # Note: the next line is commented to *prevent* mode 660 files in /var/mail + #sm_mail_local_envdef="$sm_mail_local_envdef -DMAILGID=8"; +else + sm_enable_milter=no; + sm_enable_auth=no; + sm_enable_ipv6=no; + sm_sendmail_envdef="$sm_sendmail_envdef \ +-D_PATH_VARTMP=\\\"${localstatedir}/lib/sendmail\\\""; + sm_sendmail_envdef="$sm_sendmail_envdef \ +-D_PATH_SENDMAILCF=\\\"${sysconfdir}/mail/sendmail.cf\\\""; + fi; + +# 8.9.0+ +v2i 8.9.0; +if test $sm_version_math -ge $sm_version_test; then + :; +else + :; + fi; + +# 8.8.0+ +v2i 8.8.0; +if test $sm_version_math -ge $sm_version_test; then + :; +else + sm_enable_ldap=no; + sm_enable_tcpd=no; + fi; + +# Shared memory support (on 8.12, but needs a recent kernel) +# Note: there is a race condition where sometimes sendmail can't +# use shared memory because the prior pid didn't delete it +# but we override the linux default for performance reasons +# (or rather we would, if most users weren't on kernels that +# don't properly support it - < 2.2.19 or 2.4.1) +# *ANY* arch still on a 2.2.x; x<19 must *NOT* enable this... +if test "$sm_enable_shm" != "no"; then + v2i 8.12.0; + if test $sm_version_math -lt $sm_version_test; then + sm_enable_shm=no; + fi; + if test "arm" = "${sm_host_arch}"; then + sm_enable_shm=no; + fi; + fi; +if test "$sm_enable_shm" != "no"; then + sm_enable_shm=yes; + fi; +AC_SUBST(sm_enable_shm) + +# Milter (_FFR_ on 8.10, 8.11, native on 8.12+) +if test "$sm_enable_milter" != "no"; then + v2i 8.10.0; + if test $sm_version_math -ge $sm_version_test; then + sm_enable_milter=yes; + v2i 8.12.0; + if test $sm_version_math -ge $sm_version_test; then + sm_libmilter_envdef="$sm_libmilter_envdef -D_FFR_MULTILINE"; + v2i 8.13.0; + if test $sm_version_math -lt $sm_version_test; then + sm_sendmail_envdef="$sm_sendmail_envdef -DMILTER"; + sm_libmilter_envdef="$sm_libmilter_envdef \ +-D_FFR_MILTER_ROOT_UNSAFE"; + fi; + sm_libmilter_libs="$sm_libmilter_libs" + else + sm_libmilter_envdef="$sm_libmilter_envdef -D_FFR_MILTER"; + sm_sendmail_envdef="$sm_sendmail_envdef -D_FFR_MILTER"; + fi; + v2i 8.11.0; + if test $sm_version_math -ge $sm_version_test; then + sm_libmilter_envdef="$sm_libmilter_envdef -D_FFR_SMFI_PROGRESS"; + fi; + fi; + fi; +AC_SUBST(sm_enable_milter) + +# SFIO (required for TLS and security layer of SASL on 8.11) +# We'll let it go through here on any version (to check headers), but +# issue no messages unless needed... +if test "$sm_enable_tls" != "no"; then + if test $sm_enable_sfio != no; then + sm_enable_sfio=auto; + elif test $sm_enable_tls = yes; then + if test "$sm_version_major" = "8.11"; then + AC_MSG_ERROR([SFIO is disabled, but you asked for TLS]) + fi; + elif test $sm_enable_tls = auto; then + if test "$sm_version_major" = "8.11"; then + AC_MSG_WARN([SFIO is disabled, not trying TLS]) + fi; + fi; +elif test $sm_enable_sfio != no; then + if test "$sm_version_major" = "8.11"; then + AC_MSG_WARN([TLS is disabled, no need for SFIO]) + fi; + sm_enable_sfio=no; + fi; + +#------------------------------------------------------------------- +# +# Check for presence of REGEX headers +# +sm_have_regex=no; +if test $sm_enable_regex != no; then + AC_CHECK_HEADERS(regex.h, + [sm_have_regex=yes] + ,[sm_have_regex=no]) + + if test $ac_cv_header_regex_h = yes ; then + AC_CHECK_FUNC(regfree, + : + ,AC_MSG_ERROR([POSIX regex required.]) + ) + fi; + + if test $sm_have_regex = yes; then + sm_databases="$sm_databases, REGEX"; + sm_mapdef="$sm_mapdef -DMAP_REGEX"; + elif test $sm_enable_regex = auto; then + AC_MSG_WARN([Could not locate REGEX package]) + else + AC_MSG_ERROR([Could not locate REGEX package]) + fi; + fi; +sm_enable_regex=$sm_have_regex; AC_SUBST(sm_enable_regex) + +#------------------------------------------------------------------- +# +# Check for presence of NDBM headers +# +sm_have_ndbm=no; +if test $sm_enable_ndbm != no; then + AC_CHECK_HEADERS(ndbm.h db1/ndbm.h, + [sm_have_ndbm=yes] + ,[sm_have_ndbm=no]) + + if test $sm_have_ndbm != no; then + AC_EGREP_CPP(DBM_PAGFNO_NOT_AVAILABLE,[ + #if defined(HAVE_DB1_NDBM_H) + #include <db1/ndbm.h> + #elif defined(HAVE_NDBM_H) + #include <ndbm.h> + #endif + dbm_pagfno(0); + ], [sm_have_ndbm=no]) + + if test $sm_have_ndbm = no; then + AC_MSG_WARN([DB emulation of ndbm not sufficient, -lndbm ignored]) + fi; + fi; + + if test $sm_have_ndbm != no; then + AC_CHECK_LIB(ndbm, main, + [sm_have_ndmb=yes] + ,[sm_have_ndmb=no]) + + if test $sm_have_ndbm = no; then + AC_MSG_WARN([Could not find -lndbm]) + fi; + fi; + + # only libsmdb and sendmail #include <ndbm.h>, but libsmdb is needed + # by most of the other components + if test $sm_have_ndbm = yes; then + sm_databases="$sm_databases, DBM"; + sm_mapdef="$sm_mapdef -DNDBM"; + sm_editmap_libs="$sm_editmap_libs -lndbm"; + sm_makemap_libs="$sm_makemap_libs -lndbm"; + sm_praliases_libs="$sm_praliases_libs -lndbm"; + sm_sendmail_libs="$sm_sendmail_libs -lndbm"; + sm_vacation_libs="$sm_vacation_libs -lndbm"; + elif test $sm_enable_ndbm = auto; then + AC_MSG_WARN([Could not locate NDBM package]) + else + AC_MSG_ERROR([Could not locate NDBM package]) + fi; + fi; +sm_enable_ndbm=$sm_have_ndbm; AC_SUBST(sm_enable_ndbm) + +#------------------------------------------------------------------- +# +# Check for presence of NEWDB headers (and determine version) +# +sm_have_newdb=no; +sm_use_185=no; +sm_newdb_lib=; +if test $sm_enable_newdb != no; then + AC_CHECK_HEADERS(db4/db.h db3/db.h db2/db.h db1/db.h db.h \ + db4/db_185.h db3/db_185.h db2/db_185.h \ + db1/db_185.h db_185.h) + if [[ $ac_cv_header_db4_db_h = yes ]] \ + || [[ $ac_cv_header_db3_db_h = yes ]] \ + || [[ $ac_cv_header_db2_db_h = yes ]] \ + || [[ $ac_cv_header_db1_db_h = yes ]] \ + || [[ $ac_cv_header_db_h = yes ]]; then + sm_have_newdb=yes; + fi; + + if test $sm_have_newdb = yes; then + AC_MSG_CHECKING([newdb version]) + AC_EGREP_CPP(sm_newdb_lib=4,[ + #if defined(HAVE_DB4_DB_H) + #include <db4/db.h> + #elif defined(HAVE_DB_H) + #include <db.h> + #endif + #if DB_VERSION_MAJOR >= 4 + sm_newdb_lib=4 + #endif + ], [sm_newdb_lib=db-4.2], [ + AC_EGREP_CPP(sm_newdb_lib=3,[ + #if defined(HAVE_DB3_DB_H) + #include <db3/db.h> + #elif defined(HAVE_DB_H) + #include <db.h> + #endif + #if DB_VERSION_MAJOR >= 3 + sm_newdb_lib=3 + #endif + ], [sm_newdb_lib=db3], [ + AC_EGREP_CPP(sm_newdb_lib=2,[ + #if defined(HAVE_DB2_DB_H) + #include <db2/db.h> + #elif defined(HAVE_DB_H) + #include <db.h> + #endif + #if DB_VERSION_MAJOR >= 2 + sm_newdb_lib=2 + #endif + ], [sm_newdb_lib=db2], [ + AC_EGREP_CPP(sm_newdb_lib=1,[ + #if defined(HAVE_DB1_DB_H) + #include <db1/db.h> + #elif defined(HAVE_DB_H) + #include <db.h> + #endif + #ifndef DB_VERSION_MAJOR + #define DB_VERSION_MAJOR 1 + #endif + #if DB_VERSION_MAJOR >= 1 + sm_newdb_lib=1 + #endif + ], [sm_newdb_lib=db1]) + ]) + ]) + ]) + # < 8.10.x can't handle db3+ + v2i 8.10.0; + if test $sm_version_math -lt $sm_version_test; then + #if t[ $ac_cv_header_db3_db_185_h = yes ] \ + #|| [ $ac_cv_header_db_185_h = yes ]; then + # sm_use_185=yes; + #else + ac_cv_header_db4_db_h=no; + ac_cv_header_db3_db_h=no; + if [[ $sm_newdb_lib = db-4.2 ]] \ + || [[ $sm_newdb_lib = db3 ]]; then + if test $ac_cv_header_db2_db_h = yes; then + AC_MSG_WARN([<8.10.0 & $sm_newdb_lib: trying db2]) + sm_newdb_lib=db2; + else + AC_MSG_WARN([<8.10.0 & $sm_newdb_lib: trying db1]) + sm_newdb_lib=db1; + fi; + fi; + # fi; + fi; + # < 8.9.0 can't handle db2+ ???? + v2i 8.9.0; + if test $sm_version_math -lt $sm_version_test; then + ac_cv_header_db4_db_h=no; + ac_cv_header_db3_db_h=no; + ac_cv_header_db2_db_h=no; + if test $sm_newdb_lib = db2; then + AC_MSG_WARN([<8.9.0 & $sm_newdb_lib: trying db1]) + sm_newdb_lib=db1; + fi; + fi; + AC_MSG_RESULT([$sm_newdb_lib]) + if test "X$sm_newdb_lib" = "X"; then + AC_MSG_WARN([NEWDB version unknown, omitting support!]) + sm_have_newdb=no; + fi; + fi; + + # Check first for a library matching the db version (-ldb4, etc) + # then check to see if -ldb will work + if test $sm_have_newdb != no; then + sm_old_libs="$LIBS"; + if test $sm_newdb_lib = db-4.2; then + AC_CHECK_LIB($sm_newdb_lib, db_create_4002, [:], [ + AC_CHECK_LIB(db, db_create_4002, + [sm_newdb_lib='db'], [sm_have_newdb=no])dnl + ])dnl + elif test $sm_newdb_lib = db3; then + AC_CHECK_LIB($sm_newdb_lib, db_create, [:], [ + AC_CHECK_LIB(db, db_create, + [sm_newdb_lib='db'], [sm_have_newdb=no])dnl + ])dnl + elif test $sm_newdb_lib = db2; then + AC_CHECK_LIB($sm_newdb_lib, db_open, [:], [ + AC_CHECK_LIB(db, db_open, + [sm_newdb_lib='db'], [sm_have_newdb=no])dnl + ])dnl + else + AC_CHECK_LIB($sm_newdb_lib, dbopen, [:], [ + AC_CHECK_LIB(db, dbopen, + [sm_newdb_lib='db'], [sm_have_newdb=no])dnl + ])dnl + fi; + if test $sm_newdb_lib = db; then + AC_CHECK_LIB($sm_newdb_lib, dbopen, [:], [ + AC_CHECK_LIB(db, dbopen, + [sm_newdb_lib='db'], [sm_have_newdb=no])dnl + ])dnl + fi; + LIBS="$sm_old_libs"; + + if test $sm_have_newdb != yes; then + AC_MSG_WARN([Could not find -l$sm_newdb_lib (or -ldb)]) + fi; + fi; + + # only libsmdb and sendmail #include <db.h>, but libsmdb is needed + # by most of the other components + if test $sm_have_newdb = yes; then + if test \( $ac_cv_header_db4_db_h = yes -a $sm_newdb_lib = db-4.1 \) \ + -o \( $ac_cv_header_db3_db_h = yes -a $sm_newdb_lib = db3 \) \ + -o \( $ac_cv_header_db2_db_h = yes -a $sm_newdb_lib = db2 \) \ + -o \( $ac_cv_header_db1_db_h = yes -a $sm_newdb_lib = db1 \); then + sm_libsmdb_envdef="$sm_libsmdb_envdef -I/usr/include/$sm_newdb_lib"; + sm_sendmail_envdef="$sm_sendmail_envdef -I/usr/include/$sm_newdb_lib"; + fi; + if test $sm_use_185 = yes; then + : + #sm_libsmdb_envdef="$sm_libsmdb_envdef -Ddb.h db_185.h"; + #sm_sendmail_envdef="$sm_sendmail_envdef -Ddb.h db_185.h"; + fi; + junk=$(echo "${sm_newdb_lib}" | sed -e 's/^db\(-\)\?//'); + sm_databases="$sm_databases, DB"; + if test $junk != 1; then + sm_badepends="$sm_badepends, libdb${junk}-dev"; + fi; + sm_mapdef="$sm_mapdef -DNEWDB"; + junk=$(echo "${sm_newdb_lib}" | sed -e 's/^db//'); + sm_newdb_lib="-ldb${junk}"; + sm_editmap_libs="$sm_editmap_libs $sm_newdb_lib"; + sm_makemap_libs="$sm_makemap_libs $sm_newdb_lib"; + sm_praliases_libs="$sm_praliases_libs $sm_newdb_lib"; + sm_sendmail_libs="$sm_sendmail_libs $sm_newdb_lib"; + sm_vacation_libs="$sm_vacation_libs $sm_newdb_lib"; + elif test $sm_enable_newdb = auto; then + AC_MSG_WARN([Could not locate NEWDB (libdb{4,3,2,1,}-dev) package]) + else + AC_MSG_ERROR([Could not locate NEWDB (libdb{4,3,2,1,}-dev) package]) + fi; + fi; +sm_enable_newdb=$sm_have_newdb; AC_SUBST(sm_enable_newdb) +AC_SUBST(sm_newdb_lib) + +#------------------------------------------------------------------- +# +# Check for presence of NIS headers +# +sm_have_nis=no; +if test $sm_enable_nis != no; then + AC_CHECK_HEADERS(rpcsvc/ypclnt.h, + [sm_have_nis=yes] + ,[sm_have_nis=no]) + + if test $sm_have_nis = yes; then + AC_CHECK_LIB(nsl, main, + [sm_have_nis=yes] + ,[sm_have_nis=no]) + + if test $sm_have_nis != yes; then + AC_MSG_WARN([Could not find -lnsl]) + fi; + fi; + + if test $sm_have_nis = yes; then + sm_databases="$sm_databases, NIS"; + sm_mapdef="$sm_mapdef -DNIS"; + sm_sendmail_libs="$sm_sendmail_libs -lnsl"; + elif test $sm_enable_nis = auto; then + AC_MSG_WARN([Could not locate NIS package]) + else + AC_MSG_ERROR([Could not locate NIS package]) + fi; + fi; +sm_enable_nis=$sm_have_nis; AC_SUBST(sm_enable_nis) + +#------------------------------------------------------------------- +# +# Check for presence of NISPLUS headers +# +sm_have_nisplus=no; +if test $sm_enable_nisplus != no; then + AC_CHECK_HEADERS(rpcsvc/nis.h, + [sm_have_nisplus=yes] + ,[sm_have_nisplus=no]) + + if [[ $sm_have_nisplus = yes ]] \ + && [[ $sm_have_nis = no ]]; then + AC_CHECK_LIB(nsl, main, + [sm_have_nis=yes] + ,[sm_have_nis=no]) + + if test $sm_have_nis != yes; then + AC_MSG_WARN([Could not find -lnsl]) + fi; + fi; + + if test $sm_have_nisplus = yes; then + sm_databases="$sm_databases, NIS+"; + sm_mapdef="$sm_mapdef -DNISPLUS"; + if test $sm_have_nis != yes; then + sm_sendmail_libs="$sm_sendmail_libs -lnsl"; + fi; + elif test $sm_enable_nisplus = auto; then + AC_MSG_WARN([Could not locate NISPLUS package]) + else + AC_MSG_ERROR([Could not locate NISPLUS package]) + fi; + fi; +sm_enable_nisplus=$sm_have_nisplus; AC_SUBST(sm_enable_nisplus) + +#------------------------------------------------------------------- +# +# Check for presence of LDAP headers (support OpenLDAP v2/v1, Umich) +# +sm_have_ldap=no; +sm_have_ldap_init=no; +sm_have_ldap_memfree=no; +sm_ldap_inc=; +sm_ldap_lib=; +sm_ldap_pkg=; +if test $sm_enable_ldap != no; then + AC_CHECK_HEADERS(ldap.h umich-ldap/ldap.h) + + if test $ac_cv_header_ldap_h = yes; then + AC_CHECK_LIB(ldap, main, + [sm_have_ldap=yes] + ,[sm_have_ldap=no] + ,[-llber]) + AC_CHECK_LIB(ldap, ldap_init, + [sm_have_ldap_init=yes] + ,[sm_have_ldap_init=no] + ,[-llber]) + AC_CHECK_LIB(ldap, ldap_memfree, + [sm_have_ldap_memfree=yes] + ,[sm_have_ldap_memfree=no] + ,[-llber]) + + if test $sm_have_ldap = yes; then + AC_CHECK_LIB(lber, main, + [sm_have_ldap=yes] + ,[sm_have_ldap=no]) + fi; + + if test $sm_have_ldap = yes; then + AC_MSG_CHECKING([for openldap package]) + AC_EGREP_CPP([sm_ldap_version=3], [ + #if defined(HAVE_LDAP_H) + #include <ldap.h> + #if defined(LDAP_VERSION3) + sm_ldap_version=3 + #else + sm_ldap_version=2 + #endif + #endif + ], sm_ldap_pkg="libldap2-dev" + , sm_ldap_pkg="libopenldap-dev") + AC_MSG_RESULT([$sm_ldap_pkg]) + fi; + + if test $sm_have_ldap = yes; then + sm_badepends="$sm_badepends, $sm_ldap_pkg" + sm_ldap_lib="-lldap -llber"; + else + AC_MSG_WARN([Could not find OpenLDAP -lldap or -llber]) + fi; + fi; + + if [[ "X$ac_cv_header_umich_ldap_ldap_h" = Xyes ]] \ + && [[ $sm_have_ldap != yes ]]; then + AC_CHECK_LIB(umich_ldap, main, + [sm_have_ldap=yes] + ,[sm_have_ldap=no] + ,[-lumich_lber]) + + if test $sm_have_ldap = yes; then + AC_CHECK_LIB(umich_lber, main, + [sm_have_ldap=yes] + ,[sm_have_ldap=no]) + fi; + + if test $sm_have_ldap = yes; then + sm_badepends="$sm_badepends, umich-libldap-dev"; + sm_ldap_inc="-I/usr/include/umich-ldap"; + sm_ldap_lib="-lumich_ldap -lumich_lber"; + else + AC_MSG_WARN([Could not find UMich -lldap or -llber]) + fi; + fi; + + if test $sm_have_ldap = yes; then + # + # sendmail/conf.h includes LDAP, so everything does... + sm_databases="$sm_databases, LDAP"; + sm_mapdef="$sm_mapdef -DLDAPMAP"; + sm_incdirs="$sm_incdirs $sm_ldap_inc"; + #sm_libs="$sm_libs $sm_ldap_lib"; + sm_editmap_libs="$sm_editmap_libs $sm_ldap_lib"; + sm_libsm_libs="$sm_libsm_libs $sm_ldap_lib"; + sm_mail_local_libs="$sm_mail_local_libs $sm_ldap_lib"; + sm_mailstats_libs="$sm_mailstats_libs $sm_ldap_lib"; + sm_makemap_libs="$sm_makemap_libs $sm_ldap_lib"; + sm_praliases_libs="$sm_praliases_libs $sm_ldap_lib"; + sm_rmail_libs="$sm_rmail_libs $sm_ldap_lib"; + sm_sendmail_libs="$sm_sendmail_libs $sm_ldap_lib"; + sm_smrsh_libs="$sm_smrsh_libs $sm_ldap_lib"; + sm_vacation_libs="$sm_vacation_libs $sm_ldap_lib"; + sm_libsm_envdef="$sm_libsm_envdef -D_LDAP_EXAMPLE_"; + if test $sm_have_ldap_init = yes; then + sm_libsm_envdef="$sm_libsm_envdef -DLDAP_REFERRALS"; + sm_sendmail_envdef="$sm_sendmail_envdef -DLDAP_REFERRALS"; + sm_libsm_envdef="$sm_libsm_envdef -D_FFR_LDAP_URI"; + sm_sendmail_envdef="$sm_sendmail_envdef -D_FFR_LDAP_URI"; + sm_libsm_envdef="$sm_libsm_envdef -D_FFR_LDAP_SETVERSION"; + sm_sendmail_envdef="$sm_sendmail_envdef -D_FFR_LDAP_SETVERSION"; + fi; + if test $sm_have_ldap_memfree = yes; then + sm_libsm_envdef="$sm_libsm_envdef -DSM_CONF_LDAP_MEMFREE"; + fi; + elif test $sm_enable_ldap = auto; then + AC_MSG_WARN([Could not locate LDAP (libldap2-dev) package]) + else + AC_MSG_ERROR([Could not locate LDAP (libldap2-dev) package]) + fi; + fi; +sm_enable_ldap=$sm_have_ldap; AC_SUBST(sm_enable_ldap) +AM_CONDITIONAL(SM_ENABLE_LDAP, test x$sm_enable_ldap = xyes) + +#------------------------------------------------------------------- +# +# Check for presence of resolve(and/or bind) headers +# if found, enable other maps dependant upon resolver libraries +# +# Since GLIBC 2.2.1 has mucked with resolv.h, we must build w/bind 8.2.2p7 +# Unfortunately, this will fsck up HESIOD (bind 8.2 only has partial support) +# It also messed with openLDAP - making it not work ;( +# +# We're now using resolv.h - as it seems to be working (w/sendmail changes) +# +sm_have_resolve=no; +sm_have_bind=no; +resolve_lib=''; +resolve_inc=''; +#if test $sm_enable_resolv != no; then + AC_CHECK_HEADERS(resolv.h bind/resolv.h) + if test $ac_cv_header_resolv_h = yes; then + sm_have_resolve=yes; + fi; + if test $ac_cv_header_bind_resolv_h = yes; then + sm_have_bind=yes; + fi; + + if test $ac_cv_header_resolv_h = yes; then + AC_CHECK_LIB(resolv, __res_query, + [sm_have_resolve=yes] + , [AC_CHECK_LIB(resolv, res_query, + [sm_have_resolve=yes] + ,[sm_have_resolve=no])] + ) + + if test $sm_have_resolve = yes; then + resolve_inc=''; + resolve_lib='-lresolv'; + else + AC_MSG_WARN([Could not find -lresolv]) + fi; + fi; + + if test $ac_cv_header_bind_resolv_h = yes; then + AC_CHECK_LIB(bind, __res_query, + [sm_have_bind=yes] + ,[sm_have_bind=no]) + + if test $sm_have_bind = yes; then + if test $sm_enable_bind = yes; then + sm_badepends="$sm_badepends, bind-dev"; + resolve_inc='-I/usr/include/bind'; + resolve_lib='-lbind -lresolv'; + else + sm_have_bind=no; + fi; + else + AC_MSG_WARN([Could not find -lbind (bind-dev)]) + fi; + fi; + + if test $sm_have_resolve = yes; then + v2i 8.12.0; + if test $sm_version_math -ge $sm_version_test; then + sm_databases="$sm_databases, DNS"; + fi; + #sm_incdirs="$sm_incdirs $resolve_inc"; + #sm_libs="$sm_libs "$resolve_lib"; + sm_sendmail_envdef="$sm_sendmail_envdef $resolve_inc"; + sm_sendmail_libs="$sm_sendmail_libs $resolve_lib"; + else + AC_MSG_ERROR([Could not locate RESOLV package]) + fi; +# fi; +sm_enable_bind=$sm_have_bind; AC_SUBST(sm_enable_bind) + +#------------------------------------------------------------------- +# +# Check for presence of HESIOD headers +# Note: if using libhesiod, we should have HES_GETMAILHOST +# if using libbind, it doesn't have HES_GETMAILHOST ;-{ +# +sm_have_hesiod=no; +sm_hesiod_parms=''; +if test $sm_enable_hesiod != no; then + AC_CHECK_HEADERS(hesiod.h bind/hesiod.h) + if test $ac_cv_header_hesiod_h = yes; then + sm_have_hesiod=yes; + elif [[ $ac_cv_header_bind_hesiod_h = yes ]] \ + && [[ $sm_have_bind = yes ]]; then + sm_have_hesiod=yes; + fi; + + if test $sm_have_hesiod = yes; then + AC_MSG_CHECKING([for hes_getmailhost]) + CPPFLAGS_SAVE="$CPPFLAGS"; + CPPFLAGS="$resolve_inc"; + AC_EGREP_CPP([hes_getmailhost\(], [ + #include <hesiod.h> + ], sm_hesiod_parms="-DHES_GETMAILHOST") + CPPFLAGS="$CPPFLAGS_SAVE"; + if test -z "$sm_hesiod_parms"; then + AC_MSG_RESULT([no]) + else + AC_MSG_RESULT([yes]) + fi; + fi; + + if test $sm_have_hesiod = yes; then + sm_databases="$sm_databases, HESIOD"; + sm_badepends="$sm_badepends, libhesiod-dev"; + sm_mapdef="$sm_mapdef -DHESIOD"; + sm_libsmutil_envdef="$sm_libsmutil_envdef $resolve_inc"; + sm_sendmail_envdef="$sm_sendmail_envdef $sm_hesiod_parms"; + # Need following if not using bind headers + if test -z "$resolve_inc"; then + sm_sendmail_libs="$sm_sendmail_libs -lhesiod"; + fi; + elif test $sm_enable_hesiod = auto; then + AC_MSG_WARN([Could not locate HESIOD (libhesiod-dev) package]) + else + AC_MSG_ERROR([Could not locate HESIOD (libhesiod-dev) package]) + fi; + fi; +sm_enable_hesiod=$sm_have_hesiod; AC_SUBST(sm_enable_hesiod) + +#------------------------------------------------------------------- +# +# Check for presence of TCP Wrapper headers +# +sm_have_tcpd=no; +if test $sm_enable_tcpd != no; then + AC_CHECK_HEADERS(tcpd.h, + [sm_have_tcpd=yes] + ,[sm_have_tcpd=no]) + + if test $ac_cv_header_tcpd_h = yes ; then + AC_TRY_COMPILE([ + int allow_severity = 0; + int deny_severity = 0; + ] + ,[hosts_access()] + ,[sm_have_tcpd=yes] + ,[sm_have_tcpd=no]) + fi; + + if test $sm_have_tcpd = yes; then + AC_CHECK_LIB(wrap, main, + [sm_have_tcpd=yes] + ,[sm_have_tcpd=no]) + + if test $sm_have_tcpd != yes; then + AC_MSG_WARN([Could not find -lwrap (libwrap0-dev)]) + fi; + fi; + + if test $sm_have_tcpd = yes; then + sm_features="$sm_features, TCPWrappers"; + sm_badepends="$sm_badepends, libwrap0-dev"; + sm_sendmail_envdef="$sm_sendmail_envdef -DTCPWRAPPERS"; + sm_sendmail_libs="$sm_sendmail_libs -lwrap"; + elif test $sm_enable_tcpd = auto; then + AC_MSG_WARN([TCPD(libwrap0-dev) protection not supported!]) + else + AC_MSG_ERROR([TCPD(libwrap0-dev) protection not supported!]) + fi; + fi; +sm_enable_tcpd=$sm_have_tcpd; AC_SUBST(sm_enable_tcpd) + +#------------------------------------------------------------------- +# +# Check for presence of IPV6 headers +# +sm_have_ipv6=no; +if test $sm_enable_ipv6 != no; then + AC_CHECK_HEADERS(netinet/ip6.h, + [sm_have_ipv6=yes] + ,[sm_have_ipv6=no]) + + if test $ac_cv_header_netinet_ip6_h = yes ; then + AC_EGREP_CPP(sm_have_ipv6=yes, [ + #include <netdb.h> + #if defined(AI_DEFAULT) + sm_have_ipv6=yes + #endif + ], sm_have_ipv6=yes, [ + AC_EGREP_CPP(sm_have_ipv6=yes, [ + #include <bind/netdb.h> + #if defined(AI_DEFAULT) + sm_have_ipv6=yes + #endif + ], sm_have_ipv6=yes, + ,[sm_have_ipv6=no]) + ]) + if test $sm_have_ipv6 = no; then + AC_MSG_ERROR([Your level of netdb precludes IPv6 support]) + fi; + fi; + + if test $sm_have_ipv6 = yes; then + AC_CHECK_FUNCS(getaddrinfo, + [sm_have_ipv6=yes] + ,[sm_have_ipv6=no]) + if test $sm_have_ipv6 = no; then + AC_MSG_ERROR([IPv6 support requires getaddrinfo]) + fi; + fi; + + if test $sm_have_ipv6 = yes; then + v2i 8.10.0; + if test $sm_version_math -ge $sm_version_test; then + sm_features="$sm_features, IPv6"; + # Needed by sendmail, libmilter, maybe others + sm_envdef="$sm_envdef -DNETINET6"; + # Need following if using bind headers + if test ! -z "$resolve_inc"; then + sm_envdef="$sm_envdef -DNEEDSGETIPNODE=0"; + fi; + fi; + elif test $sm_enable_ipv6 = auto; then + AC_MSG_WARN([Could not locate IPv6 package]) + else + AC_MSG_ERROR([Could not locate IPv6 package]) + fi; + fi; +sm_enable_ipv6=$sm_have_ipv6; AC_SUBST(sm_enable_ipv6) + +#------------------------------------------------------------------- +# +# Check for presence of maillock headers +# +sm_have_maillock=no; +if test $sm_enable_maillock != no; then + AC_CHECK_HEADERS(maillock.h, + [sm_have_maillock=yes] + ,[sm_have_maillock=no]) + + if test $ac_cv_header_maillock_h = yes ; then + AC_CHECK_LIB(lockfile, main, + [sm__have_maillock=yes] + ,[sm_have_maillock=no]) + + if test $sm_have_maillock != yes; then + AC_MSG_WARN([Could not find -llockfile (liblockfile-dev)]) + fi; + fi; + + if test $sm_have_maillock = yes; then + sm_features="$sm_features, LockFile"; + sm_badepends="$sm_badepends, liblockfile-dev"; + sm_mail_local_envdef="$sm_mail_local_envdef -DMAILLOCK"; + sm_mail_local_libs="$sm_mail_local_libs -llockfile"; + elif test $sm_enable_maillock = auto; then + AC_MSG_WARN([Could not locate liblockfile-dev package]) + else + AC_MSG_ERROR([Could not locate liblockfile-dev package]) + fi; + fi; +sm_enable_maillock=$sm_have_maillock; AC_SUBST(sm_enable_maillock) + +#------------------------------------------------------------------- +# +# Check for presence of SFIO headers +# Note: required for TLS and security layer of SASL on 8.11) +# Note: SFIO is *only* used if required, but we allow the checks +# on any version (for header test) - just issue no messages +# unless needed +# +sm_have_sfio=no; +if test $sm_enable_sfio != no; then + CPPFLAGS_SAVE="$CPPFLAGS"; + CPPFLAGS="-I/usr/include/sfio" + AC_CHECK_HEADERS(sfio/stdio.h, + [sm_have_sfio=yes] + ,[sm_have_sfio=no]) + CPPFLAGS="$CPPFLAGS_SAVE"; + + if test $ac_cv_header_sfio_stdio_h = yes ; then + AC_CHECK_LIB(sfio, main, + [sm_have_sfio=yes] + ,[sm_have_sfio=no]) + + if test $sm_have_sfio != yes; then + AC_MSG_WARN([Could not find -lsfio (sfio-dev)]) + fi; + fi; + + # SFIO is only required for TLS/SASL on 8.11, ignore it otherwise + # when using it, however, it hits *everything*, put it in the front! + if test "$sm_version_major" = "8.11"; then + if test $sm_have_sfio = yes; then + sm_badepends="$sm_badepends, sfio-dev"; + sm_incdirs="-I/usr/include/sfio $sm_incdirs"; + sm_envdef="-DSFIO $sm_envdef"; + sm_libs="-lsfio $sm_libs"; + elif test $sm_enable_sfio = auto; then + AC_MSG_WARN([SFIO, and therefore TLS not supported!]) + else + AC_MSG_ERROR([SFIO, and therefore TLS not supported!]) + fi; + else + sm_have_sfio=no; + fi; + fi; +sm_enable_sfio=$sm_have_sfio; AC_SUBST(sm_enable_sfio) + +#------------------------------------------------------------------- +# +# Check for presence of SASL headers (for SMTP auth) +# +sm_have_auth=no; +sm_auth_lib='?'; +if test $sm_enable_auth != no; then + AC_CHECK_HEADERS(sasl/sasl.h sasl.h) + + if test $ac_cv_header_sasl_sasl_h = yes \ + -o $ac_cv_header_sasl_h = yes; then + sm_have_auth=yes; + else + sm_have_auth=no; + fi; + + if test $sm_have_auth = yes; then + AC_MSG_CHECKING([sasl version]) + AC_EGREP_CPP(sm_auth_lib=2,[ + #if defined(HAVE_SASL_SASL_H) + #include <sasl/sasl.h> + #elif defined(HAVE_SASL_H) + #include <sasl.h> + #endif + #if SASL_VERSION_MAJOR >= 2 + sm_auth_lib=2 + #endif + ], [sm_auth_lib=2], [sm_auth_lib=1]) + AC_MSG_RESULT([$sm_auth_lib]) + if test "X$sm_auth_lib" = "X"; then + AC_MSG_WARN([SASL version unknown, omitting support!]) + sm_have_auth=no; + fi; + fi; + + # < 8.12.4 can't handle saslv2+ + v2i 8.12.4; # FIXME: need ldap & saslv2 1st !!! + if test $sm_version_math -lt $sm_version_test; then + if test $sm_auth_lib = 2; then + AC_MSG_WARN([<8.12.4 & saslv$sm_auth_lib: trying saslv1]) + sm_auth_lib=1; + fi; + fi; + + if test $sm_auth_lib = 2; then + junk='sasl2'; + else + junk='sasl'; + fi; + + AC_CHECK_LIB($junk, sasl_client_init, + [sm_have_auth=yes] + ,[sm_have_auth=no]) + + if test $sm_have_auth != yes; then + AC_MSG_WARN([Could not find -l${junk} (lib${junk}-dev)]) + fi; + + if test $sm_have_auth = yes; then + sm_features="$sm_features, SMTP AUTH(SASL)"; + sm_badepends="$sm_badepends, lib${junk}-dev"; + sm_suggests="$sm_suggests, ${junk}-bin"; + sm_suggests="$sm_suggests, lib${junk}-modules"; + sm_suggests="$sm_suggests | lib${junk}-modules-plain"; + sm_suggests="$sm_suggests | lib${junk}-digestmd5-plain"; + sm_suggests="$sm_suggests | lib${junk}-digestmd5-des"; + sm_sendmail_envdef="$sm_sendmail_envdef -DSASL"; + if test $ac_cv_header_sasl_sasl_h = yes; then + sm_sendmail_envdef="$sm_sendmail_envdef -I/usr/include/sasl"; + fi; + if test "$sm_version_major" = "8.12"; then + :; + elif test "$sm_version_major" = "8.11"; then + sm_ffr="$sm_ffr -D_FFR_UNSAFE_SASL=1"; + sm_ffr="$sm_ffr -D_FFR_SASL_OPTS=1"; + sm_ffr="$sm_ffr -D_FFR_DEFAUTHINFO_MECHS=1"; + elif test "$sm_version_major" = "8.10"; then + sm_ffr="$sm_ffr -D_FFR_UNSAFE_SASL=1"; + sm_ffr="$sm_ffr -D_FFR_SASL_OPTS=1"; + sm_ffr="$sm_ffr -D_FFR_DEFAUTHINFO_MECHS=1"; + fi; + sm_sendmail_libs="$sm_sendmail_libs -l${junk}"; + elif test $sm_enable_auth = auto; then + AC_MSG_WARN([SMTP authentication not supported!]) + else + AC_MSG_ERROR([SMTP authentication not supported!]) + fi; + fi; +sm_enable_auth=$sm_have_auth; AC_SUBST(sm_enable_auth) +AC_SUBST(sm_auth_lib) +AM_CONDITIONAL(SM_ENABLE_AUTH, test x$sm_enable_auth = xyes) + +#------------------------------------------------------------------- +# +# Check for presence of SSL headers +# +sm_have_tls=no; +if test $sm_enable_tls != no; then + AC_CHECK_HEADERS(openssl/ssl.h, + [sm_have_tls=yes] + ,[sm_have_tls=no]) + + if test $ac_cv_header_openssl_ssl_h = yes; then + AC_CHECK_LIB(ssl, SSL_library_init, + [sm_have_tls=yes] + ,[sm_have_tls=no] + ,[-lcrypto]) + + if test $sm_have_tls != yes; then + AC_MSG_WARN([Could not find -lssl (libssl-dev)]) + fi; + fi; + + # SFIO is required for TLS/SSL support on 8.11 + if test $sm_have_tls = yes; then + if [[ $sm_have_sfio != yes ]] \ + && [[ "$sm_version_major" = '8.11' ]]; then + AC_MSG_WARN([SFIO is required for SSL privacy protection!]) + sm_have_tls=no; + fi; + fi; + + if test $sm_have_tls = yes; then + v2i 8.11.0; + if test $sm_version_math -ge $sm_version_test; then + sm_features="$sm_features, STARTTLS(SSL)"; + sm_badepends="$sm_badepends, libssl-dev"; + sm_suggests="$sm_suggests, openssl"; + sm_sendmail_envdef="$sm_sendmail_envdef -DSTARTTLS"; + sm_sendmail_libs="$sm_sendmail_libs -lcrypto -lssl"; + sm_ffr="$sm_ffr -D_FFR_TLS_1"; + sm_ffr="$sm_ffr -D_FFR_DEAL_WITH_ERROR_SSL"; + fi; + v2i 8.13.0; + if test $sm_version_math -lt $sm_version_test; then + v2i 8.12.0; + if test $sm_version_math -ge $sm_version_test; then + sm_ffr="$sm_ffr -D_FFR_SMTP_SSL"; + fi; + fi; + elif test $sm_enable_tls = auto; then + AC_MSG_WARN([SSL/TLS privacy protection not supported!]) + else + AC_MSG_ERROR([SSL/TLS privacy protection not supported!]) + fi; + fi; +sm_enable_tls=$sm_have_tls; AC_SUBST(sm_enable_tls) +AM_CONDITIONAL(SM_ENABLE_TLS, test x$sm_enable_tls = xyes) + +#------------------------------------------------------------------- +# Any requisite variable cleanup +#------------------------------------------------------------------- +sm_databases=$(echo "${sm_databases}" | sed -e 's/^, //'); +sm_features=$(echo "${sm_features}" | sed -e 's/^, //'); +sm_recommends=$(echo "${sm_recommends}" | sed -e 's/^, //'); + +#------------------------------------------------------------------- +# Add any FFRs to sendmail_ENVDEF +#------------------------------------------------------------------- +sm_sendmail_envdef="$sm_sendmail_envdef $sm_ffr"; + +#------------------------------------------------------------------- +# Below 8.10.0, there aren't separate variables per component... munge +# hell yeah, the output is butt-ugly (duplicates, ordering), but too bad! +# its not like (sane) people will be looking at these files anyway... +#------------------------------------------------------------------- +v2i 8.10.0; +if test $sm_version_math -lt $sm_version_test; then + sm_envdef="$sm_envdef $sm_sendmail_envdef"; + sm_envdef="$sm_envdef $sm_mail_local_envdef"; + sm_envdef="$sm_envdef $sm_rmail_envdef"; + sm_envdef="$sm_envdef $sm_smrsh_envdef"; + sm_libs="$sm_libs $sm_sendmail_libs"; + sm_libs="$sm_libs $sm_mail_local_libs"; + fi; + + +#------------------------------------------------------------------- +# Fini - define configuration files, and commands upon them +#------------------------------------------------------------------- +AC_CONFIG_FILES([Makefile], [chmod a+x ./Makefile]) +AC_CONFIG_FILES([build/autoconf.mk]) +AC_CONFIG_FILES([build/autoconf.pl]) +AC_CONFIG_FILES([build/autoconf.sh]) +AC_CONFIG_FILES([build/debian/changelog.sh],[ + echo 'creating ./build/debian/changelog.in'; + chmod ug+x ./build/debian/changelog.sh; + ./build/debian/changelog.sh;]) +AC_CONFIG_FILES([build/debian/changelog:build/debian/changelog.in],[ + cp build/debian/changelog ./;]) +AC_CONFIG_FILES([build/update_chaos],[ + echo 'Updating Build setup'; + chmod ug+x ./build/update_chaos; + (cd ../ && ./debian/build/update_chaos);]) +AC_CONFIG_FILES([build/site.config.m4]) +AC_CONFIG_FILES([build/debian/control.m4],[ + echo 'creating ./control'; + m4 ./build/debian/control.m4 > ./build/debian/control; + cp ./build/debian/control ./;]) +dnl AC_CONFIG_FILES([rules:./build/rules.in], [chmod a+x ./rules]) +AC_CONFIG_FILES([libmilter0.dirs:./build/debian/libmilter0.dirs.in]) +AC_CONFIG_FILES([libmilter0.postrm:./build/debian/libmilter0.postrm.in], + [chmod a+x ./libmilter0.postrm]) +AC_CONFIG_FILES([libmilter0.preinst:./build/debian/libmilter0.preinst.in], + [chmod a+x ./libmilter0.preinst]) +AC_CONFIG_FILES([libmilter-dev.dirs:./build/debian/libmilter-dev.dirs.in]) +AC_CONFIG_FILES([libmilter-dev.postrm:./build/debian/libmilter-dev.postrm.in], + [chmod a+x ./libmilter-dev.postrm]) +AC_CONFIG_FILES([libmilter-dev.preinst:./build/debian/libmilter-dev.preinst.in], + [chmod a+x ./libmilter-dev.preinst]) +AC_CONFIG_FILES([rmail.dirs:./build/debian/rmail.dirs.in]) +AC_CONFIG_FILES([rmail.postrm:./build/debian/rmail.postrm.in], + [chmod a+x ./rmail.postrm]) +AC_CONFIG_FILES([rmail.preinst:./build/debian/rmail.preinst.in], + [chmod a+x ./rmail.preinst]) +AC_CONFIG_FILES([sendmail.dirs:./build/debian/sendmail.dirs.in]) +AC_CONFIG_FILES([sendmail-base.dirs:./build/debian/sendmail-base.dirs.in]) +AC_CONFIG_FILES([sendmail-base.postinst:./build/debian/sendmail-base.postinst.in], + [chmod a+x ./sendmail-base.postinst]) +AC_CONFIG_FILES([sendmail-base.postrm:./build/debian/sendmail-base.postrm.in], + [chmod a+x ./sendmail-base.postrm]) +AC_CONFIG_FILES([sendmail-base.preinst:./build/debian/sendmail-base.preinst.in], + [chmod a+x ./sendmail-base.preinst]) +AC_CONFIG_FILES([sendmail-base.prerm:./build/debian/sendmail-base.prerm.in], + [chmod a+x ./sendmail-base.prerm]) +AC_CONFIG_FILES([sendmail-doc.dirs:./build/debian/sendmail-doc.dirs.in]) +AC_CONFIG_FILES([sendmail-doc.postrm:./build/debian/sendmail-doc.postrm.in], + [chmod a+x ./sendmail-doc.postrm]) +AC_CONFIG_FILES([sendmail-doc.preinst:./build/debian/sendmail-doc.preinst.in], + [chmod a+x ./sendmail-doc.preinst]) +AC_CONFIG_FILES([sendmail-cf.dirs:./build/debian/sendmail-cf.dirs.in]) +AC_CONFIG_FILES([sendmail-cf.postrm:./build/debian/sendmail-cf.postrm.in], + [chmod a+x ./sendmail-cf.postrm]) +AC_CONFIG_FILES([sendmail-cf.preinst:./build/debian/sendmail-cf.preinst.in], + [chmod a+x ./sendmail-cf.preinst]) +AC_CONFIG_FILES([sendmail-bin.conffiles:./build/debian/sendmail-bin.conffiles.in]) +AC_CONFIG_FILES([sendmail.cron.daily:./build/debian/sendmail.cron.daily.in], + [chmod a+x ./sendmail.cron.daily]) +AC_CONFIG_FILES([sendmail-bin.dirs:./build/debian/sendmail-bin.dirs.in]) +AC_CONFIG_FILES([sendmail.init.d:./build/debian/sendmail.init.d.in:./local/sendmail.in], + [chmod a+x ./sendmail.init.d]) +AC_CONFIG_FILES([sendmail-bin.postinst:./build/debian/sendmail-bin.postinst.in], + [chmod a+x ./sendmail-bin.postinst]) +AC_CONFIG_FILES([sendmail-bin.postrm:./build/debian/sendmail-bin.postrm.in], + [chmod a+x ./sendmail-bin.postrm]) +AC_CONFIG_FILES([sendmail-bin.preinst:./build/debian/sendmail-bin.preinst.in], + [chmod a+x ./sendmail-bin.preinst]) +AC_CONFIG_FILES([sendmail-bin.prerm:./build/debian/sendmail-bin.prerm.in], + [chmod a+x ./sendmail-bin.prerm]) +AC_CONFIG_FILES([sendmail-bin.suid:./build/debian/sendmail-bin.suid.in]) +AC_CONFIG_FILES([sensible-mda.dirs:./build/debian/sensible-mda.dirs.in]) +AC_CONFIG_FILES([sensible-mda.postrm:./build/debian/sensible-mda.postrm.in], + [chmod a+x ./sensible-mda.postrm]) +AC_CONFIG_FILES([sensible-mda.preinst:./build/debian/sensible-mda.preinst.in], + [chmod a+x ./sensible-mda.preinst]) +AC_CONFIG_FILES([cf/Makefile], [chmod a+x ./cf/Makefile]) +AC_CONFIG_FILES([cf/debian/autoconf.m4]) +AC_CONFIG_FILES([cf/debian/sendmail.mc]) +AC_CONFIG_FILES([cf/debian/submit.mc]) +AC_CONFIG_FILES([cf/domain/debian-msp.m4]) +AC_CONFIG_FILES([cf/domain/debian-mta.m4]) +AC_CONFIG_FILES([cf/hack/debian_auth.m4]) +AC_CONFIG_FILES([cf/hack/virthost_by_ip.m4]) +AC_CONFIG_FILES([cf/ostype/debian.m4]) +AC_CONFIG_FILES([examples/Makefile], [chmod a+x ./examples/Makefile]) +AC_CONFIG_FILES([examples/dhcp3/dhclient-exit-hooks.d/sendmail], + [chmod a+x ./examples/dhcp3/dhclient-exit-hooks.d/sendmail]) +AC_CONFIG_FILES([examples/network/if-down.d/sendmail], + [chmod a+x ./examples/network/if-down.d/sendmail]) +AC_CONFIG_FILES([examples/network/if-up.d/sendmail], + [chmod a+x ./examples/network/if-up.d/sendmail]) +AC_CONFIG_FILES([examples/ppp/ip-down.d/sendmail], + [chmod a+x ./examples/ppp/ip-down.d/sendmail]) +AC_CONFIG_FILES([examples/ppp/ip-up.d/sendmail], + [chmod a+x ./examples/ppp/ip-up.d/sendmail]) +AC_CONFIG_FILES([examples/resolvconf/update-libc.d/sendmail], + [chmod a+x ./examples/resolvconf/update-libc.d/sendmail]) +AC_CONFIG_FILES([examples/sasl/sasl.m4]) +AC_CONFIG_FILES([examples/tls/starttls.m4]) +AC_CONFIG_FILES([local/Makefile], [chmod a+x ./local/Makefile]) +AC_CONFIG_FILES([local/Parse_conf.pm], [chmod a+x ./local/Parse_conf.pm]) +AC_CONFIG_FILES([local/Parse_mc.pm], [chmod a+x ./local/Parse_mc.pm]) +AC_CONFIG_FILES([local/dynamic], [chmod a+x ./local/dynamic]) +AC_CONFIG_FILES([local/parse_mc], [chmod a+x ./local/parse_mc]) +AC_CONFIG_FILES([local/sendmailconfig], [chmod a+x ./local/sendmailconfig]) +AC_CONFIG_FILES([local/sendmail], [chmod a+x ./local/sendmail]) +AC_CONFIG_FILES([local/update_auth], [chmod a+x ./local/update_auth]) +AC_CONFIG_FILES([local/update_authm4], [chmod a+x ./local/update_authm4]) +AC_CONFIG_FILES([local/update_conf], [chmod a+x ./local/update_conf]) +AC_CONFIG_FILES([local/update_db], [chmod a+x ./local/update_db]) +AC_CONFIG_FILES([local/update_ldap], [chmod a+x ./local/update_ldap]) +AC_CONFIG_FILES([local/update_mc], [chmod a+x ./local/update_mc]) +AC_CONFIG_FILES([local/update_mk], [chmod a+x ./local/update_mk]) +AC_CONFIG_FILES([local/update_smrsh], [chmod a+x ./local/update_smrsh]) +AC_CONFIG_FILES([local/update_sys], [chmod a+x ./local/update_sys]) +AC_CONFIG_FILES([local/update_tls], [chmod a+x ./local/update_tls]) +AC_CONFIG_FILES([local/update_tlsm4], [chmod a+x ./local/update_tlsm4]) +AC_CONFIG_FILES([local/bug/sendmail/script], + [chmod a+x ./local/bug/sendmail/script]) +AC_CONFIG_FILES([sensible_mda/Makefile], [chmod a+x ./sensible_mda/Makefile]) +AC_CONFIG_FILES([sensible_mda/sensible-mda.c]) +AC_OUTPUT diff --git a/debian/configure.options b/debian/configure.options new file mode 100644 index 0000000..fa5abe4 --- /dev/null +++ b/debian/configure.options @@ -0,0 +1,138 @@ +# `configure' configures Debian Sendmail to adapt to many kinds of systems. +# +# Usage: ./configure [OPTION]... [VAR=VALUE]... +# +# To assign environment variables (e.g., CC, CFLAGS...), specify them as +# VAR=VALUE. See below for descriptions of some of the useful variables. +# +# Defaults for the options are specified in brackets. +# +# Configuration: +# -h, --help display this help and exit +# --help=short display options specific to this package +# --help=recursive display the short help of all the included packages +# -V, --version display version information and exit +# -q, --quiet, --silent do not print `checking...' messages +# --cache-file=FILE cache test results in FILE [disabled] +# -C, --config-cache alias for `--cache-file=config.cache' +# -n, --no-create do not create output files +# --srcdir=DIR find the sources in DIR [configure dir or `..'] +# +# Installation directories: +# --prefix=PREFIX install architecture-independent files in PREFIX [/usr] +--prefix=/usr +# --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] +# +# By default, `make install' will install all the files in +# `/usr/bin', `/usr/lib' etc. You can specify +# an installation prefix other than `/usr' using `--prefix', +# for instance `--prefix=$HOME'. +# +# For better control, use the options below. +# +# Fine tuning of the installation directories: +# --bindir=DIR user executables [EPREFIX/bin] +# --sbindir=DIR system admin executables [EPREFIX/sbin] +# --libexecdir=DIR program executables [EPREFIX/libexec] +--libexecdir=/usr/lib/sm.bin +# --datadir=DIR read-only architecture-independent data [PREFIX/share] +--datadir=${DATA_DIR} +# --sysconfdir=DIR read-only single-machine data [PREFIX/etc] +--sysconfdir=/etc +# --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] +# --localstatedir=DIR modifiable single-machine data [PREFIX/var] +--localstatedir=/var +# --libdir=DIR object code libraries [EPREFIX/lib] +# --includedir=DIR C header files [PREFIX/include] +# --oldincludedir=DIR C header files for non-gcc [/usr/include] +# --infodir=DIR info documentation [PREFIX/info] +--infodir=${DATA_DIR}/info +# --mandir=DIR man documentation [PREFIX/man] +--mandir=${DATA_DIR}/man +# +# Program names: +# --program-prefix=PREFIX prepend PREFIX to installed program names +# --program-suffix=SUFFIX append SUFFIX to installed program names +# --program-transform-name=PROGRAM run sed PROGRAM on installed program names +# +# System types: +# --build=BUILD configure for building on BUILD [guessed] +--build=${DEB_BUILD_GNU_TYPE} +# --host=HOST cross-compile to build programs to run on HOST [BUILD] +--host=${DEB_HOST_GNU_TYPE} +# --target=TARGET configure for building compilers for TARGET [HOST] +# +# Optional Features: +# --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) +# --enable-FEATURE[=ARG] include FEATURE [ARG=yes] +# --enable-maintainer-mode enable make rules and dependencies not useful +# (and sometimes confusing) to the casual installer +#--enable-maintainer-mode +# --enable-regex=.........Allow REGEX maps [auto] +--enable-regex=auto +# --enable-ndbm=..........Allow NDBM maps [no] +--enable-ndbm=no +# --enable-newdb=.........Allow NEWDB maps [yes] +--enable-newdb=yes +# --enable-nis=...........Allow NIS maps [auto] +--enable-nis=auto +# --enable-nisplus=.......Allow NISPLUS maps [auto] +--enable-nisplus=auto +# --enable-ldap=..........Allow LDAP maps [yes] +--enable-ldap=yes +# --enable-hesiod=........Allow HESIOD maps [no] +--enable-hesiod=no +# --enable-tcpd=..........Allow TCP wrappers [auto] +--enable-tcpd=no +# --enable-bind=..........Allow BIND usage [no] +--enable-bind=no +# --enable-ipv6=..........Allow IPv6 usage [auto] +--enable-ipv6=auto +# --enable-maillock=......Allow maillock [yes] +--enable-maillock=yes +# --enable-milter=........Allow milter [auto] +--enable-milter=auto +# --enable-sfio=..........Allow SFIO usage [no] +--enable-sfio=no +# --enable-auth=..........Allow SMTP auth [auto] +--enable-auth=auto +# --enable-tls=...........Allow TLS/SSL [auto] +--enable-tls=auto +# --enable-shm=...........Allow shared memory [auto] +--enable-shm=auto +# --enable-doc=...........Build sendmail-doc pkg [yes] +--enable-doc=${ENABLE_DOC} +# --enable-dev=...........Build libmilter-dev pkg [yes] +--enable-dev=${ENABLE_DEV} +# --disable-dependency-tracking speeds up one-time build +# --enable-dependency-tracking do not reject slow dependency extractors +# +# Optional Packages: +# --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] +# --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) +# --with-buildtree=.......Build directory [.] +--with-buildtree=${BUILD_TREE} +# --with-docdir=..........Document directory [PREFIX/doc] +--with-docdir=${DATA_DIR}/doc +# --with-revision=........Package revision [''] +--with-revision=${version_debian} +# --with-custom=..........Custom package revision [''] +#--with-custom= +# +# Some influential environment variables: +# CC C compiler command +# CFLAGS C compiler flags +# LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a +# nonstandard directory <lib dir> +# CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have +# headers in a nonstandard directory <include dir> +# CPP C preprocessor +# +# Use these variables to override the choices made by `configure' or to help +# it to find libraries and programs with nonstandard names/locations. +# +# Report bugs to <bug/reportbug or sendmail@packages.debian.org>. +# +# Don't touch these! +--srcdir=${pwd_dir}/debian +${SM_CONF_OPT} diff --git a/debian/control b/debian/control index 98b25d5..e470cd6 100644 --- a/debian/control +++ b/debian/control @@ -2,73 +2,70 @@ Source: sendmail Priority: extra Section: mail Maintainer: Richard A Nelson (Rick) <cowboy@debian.org> -Standards-Version: 3.5.7.0 -Build-Depends-Indep: groff, bsdmainutils -Build-Depends: m4, patch, debhelper (>= 1.1.17), libdb3-dev, libldap2-dev, libwrap0-dev, liblockfile-dev, libsasl-dev, libssl-dev +Standards-Version: 3.6.10.0 +Build-Depends-Indep: groff-base, bsdmainutils +Build-Depends: make (>> 3.79.1-14), m4, patch, debhelper (>= 4.1.68), libdb4.2-dev, libldap2-dev, liblockfile-dev, libsasl2-dev, libssl-dev +Build-Conflicts: libbind-dev, bind-dev -Package: sendmail +Package: sendmail-bin Architecture: any Section: mail -Replaces: mail-transport-agent, sendmail-tls +Replaces: mail-transport-agent Provides: mail-transport-agent -Conflicts: mail-transport-agent -Depends: adduser, m4, ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends}, +Conflicts: mail-transport-agent, sendmail (<< 8.13.1-7) +Depends: sendmail-base, sendmail-cf, ${shlibs:Depends}, ${perl:Depends} Recommends: -Suggests: sendmail-doc (>= ${Source-Version}), mail-reader, procmail | mailagent | maildrop | deliver, make, logcheck, logrotate, sasl-bin, libsasl-modules-plain, libsasl-digestmd5-plain | libsasl-digestmd5-des, openssl -Description: A powerful, efficient, and scalable Mail Transport Agent +Suggests: sendmail-doc, , sasl2-bin, libsasl2-modules | libsasl2-modules-plain | libsasl2-digestmd5-plain | libsasl2-digestmd5-des, openssl +Description: powerful, efficient, and scalable Mail Transport Agent Sendmail is an alternative Mail Transport Agent (MTA) for Debian. It is suitable for handling sophisticated mail configurations, although this means that its configuration can also be complex. - Fortunately, easy thing can be done easily, and complex things + . + Fortunately, simple thing can be done easily, and complex things are possible, even if not easily understood ;) Sendmail is the *ONLY* MTA with a Turing complete language to control *ALL* aspects of delivery! . - Sendmail provides Security and SPAM/UCE/UBE protection via several means: - - STARTTLS(SSL) RFC2487 encryption for mail reception/delivery. - - STARTTLS(SSL) authentication (certificate based) for access/relay control. - - SMTP AUTH (SASL/PAM) authentication for access/relay control. - - ACCESS database (by IP/host) for access/relay control. - - Use of varied Realtime Blackhole Lists (RBL) to prevent access. - - Integration of LOGCHECK rules to fine-tune logging. - - Inboard POSIX Regular Expression processing of *all* headers. - - Ability (via MILTER) to scan/change headers *and* body of *ALL* mail - A site may utilize zero, one, or more MILTERs. - - Reduced SUID exposures by running SGID smmsp/mail where possible. - . - Sendmail provides Performance and Scalability by: - - Allowing multiple queues, with the ability to tune both interval and - queue runners on a queue by queue basis. - - Providing (a Debian exclusive) an easy to configure means of queue-aging - to improve throughput by not continually retrying failed deliveries. - - Allowing most all maps/databases to be obtained via LDAP; reducing the - number of used databases and simplifying the maintenance of Sendmail. - - Reducing the file I/O where possible by buffering files in memory. - . - Sendmail provides site enhanced site configuration/customization by: - - Allowing the listener (usually port 25) to run as a daemon or via INETD. - - Allowing the queue runner (mail delivery) to run as a daemon or via CRON. - - Automagically updating configuration and databases on upgrades. - - Providing a Turing complete language for site customization of mail - handling. - - Providing a means (MILTER) for a site to scan/change all email - both - incoming and outgoing. A site can write their own MILTER, or may use - any of those found on internet. To write your own MILTER, you'll need - to install the optional milter-dev package. - - Providing extensive documentation via the sendmail-doc (optional) package. - - Providing an inboard Mail Delivery Agent (MDA) (mail.local), but supporting - procmail, mailagent, maildrop, or deliver automatically if installed. - Sendmail will also deliver to anythings else (cyrus, etc) if asked to. + Sendmail provides Security and SPAM/UCE/UBE protection via several means. . Sendmail includes *no* Mail User Agents (MUA), you'll have to - pick from the plethora of available MUAs (pine, mutt, vm, etc.) + pick from the plethora of available MUAs (mutt, vm, etc.) . This package supports REGEX, DB, NIS, NIS+, LDAP, DNS maps, - and has enabled TCPWrappers, IPv6, LockFile, SMTP AUTH(SASL), STARTTLS(SSL). + and has enabled IPv6, LockFile, SMTP AUTH(SASL), STARTTLS(SSL). + . + Homepage: http://www.sendmail.org -Package: libmilter-dev +Package: rmail +Architecture: any +Section: mail +Conflicts: sendmail (<< 8.13.1-7), postfix, exim, exim-tls, exim4-daemon-custom, exim4-daemon-heavy, exim4-daemon-light, courier-mta, smail, zmailer +Depends: sendmail-bin | mail-transport-agent, ${shlibs:Depends} +Description: MTA->UUCP remote mail handler + Rmail handles mail received via uucp and passes it to the local + sendmail (or workalike). + . + This version comes from the sendmail source package and the only + change is the call to sendmail (from -obq to -obi). + . + Homepage: http://www.sendmail.org + +Package: sensible-mda +Architecture: any +Section: mail +Conflicts: sendmail (<< 8.13.1-7) +Depends: sendmail-bin | mail-transport-agent, procmail | maildrop | deliver, ${shlibs:Depends} +Description: Mail Delivery Agent wrapper + Sensible-mda is a Debian addition in the sendmail package and has been + split out in hopes that it might be useful for other MTA packages. + . + Sensible-mda is called by the MTA, and will in turn call whichever of + the following MDAs that it finds (in this order): + procmail, maildrop, deliver, mail.local + +Package: libmilter0 Architecture: any -Section: devel -Suggests: sendmail-doc (>= ${Source-Version}) +Section: libs +Depends: ${shlibs:Depends} Description: Sendmail Mail Filter API (Milter) The Sendmail Mail Filter API (Milter) is designed to allow third-party programs access to mail messages as they are being processed in order @@ -76,24 +73,107 @@ Description: Sendmail Mail Filter API (Milter) . The Debian Sendmail package is built to support libmilter. . + This is just the libmilter.so + . + Homepage: http://www.sendmail.org + +Package: libmilter-dev +Architecture: any +Section: libdevel +Depends: libmilter0 (= ${Source-Version}) +Suggests: sendmail-doc +Description: Sendmail Mail Filter API (Milter) + The Sendmail Mail Filter API (Milter) is designed to allow third-party + programs access to mail messages as they are being processed in order + to filter meta-information (headers) and content. + . + The Debian Sendmail package is built to support libmilter. + . This is the libmilter static library and include files for development. . The documentation on building a Milter is in the sendmail-doc package. + . + Homepage: http://www.sendmail.org Package: sendmail-doc Architecture: all Section: doc -Description: A powerful, efficient, and scalable Mail Transport Agent +Description: powerful, efficient, and scalable Mail Transport Agent Sendmail is an alternative Mail Transport Agent (MTA) for Debian. It is suitable for handling sophisticated mail configurations, although this means that its configuration can also be complex. . + Don't try anything fancy in sendmail without using this for guidance. + . Because of the complexity, you may find yourself wanting to peruse the documentation files included herein. The main files are: - 1) cf.README.gz -- A reference for all things in sendmail.{mc,cf} - 2) op.{ps,txt}.gz -- The care and feeding of Sendmail. - 3) faq.txt.gz -- Sendmail FAQ, current as of the package date. + cf.README.gz -- A reference for all things in sendmail.{mc,cf} + op.{ps,txt}.gz -- The care and feeding of Sendmail. + faq.txt.gz -- Sendmail FAQ, current as of the package date. . Other files include the references for smrsh and libmilter. + . + Homepage: http://www.sendmail.org + +Package: sendmail +Architecture: all +Section: mail +Replaces: sendmail-tls +Depends: sendmail-base (= ${Source-Version}), sendmail-bin (= ${Source-Version}), sendmail-cf (= ${Source-Version}), sensible-mda (= ${Source-Version}), rmail (= ${Source-Version}) +Suggests: sendmail-doc +Description: powerful, efficient, and scalable Mail Transport Agent + Sendmail is an alternative Mail Transport Agent (MTA) for Debian. + It is suitable for handling sophisticated mail configurations, + although this means that its configuration can also be complex. + . + Fortunately, simple thing can be done easily, and complex things + are possible, even if not easily understood ;) Sendmail is the *ONLY* + MTA with a Turing complete language to control *ALL* aspects of delivery! + . + Sendmail provides Security and SPAM/UCE/UBE protection via several means. + . + Sendmail includes *no* Mail User Agents (MUA), you'll have to + pick from the plethora of available MUAs (mutt, vm, etc.) + . + This package supports REGEX, DB, NIS, NIS+, LDAP, DNS maps, + and has enabled IPv6, LockFile, SMTP AUTH(SASL), STARTTLS(SSL). + . + This package is to make installation/upgrading easier (Do NOT delete it) + . + Homepage: http://www.sendmail.org + +Package: sendmail-base +Architecture: all +Section: mail +Depends: m4, make, adduser, ${perl:Depends} +Recommends: resolvconf +Suggests: sendmail-doc, ca-certificates, logcheck, logrotate +Conflicts: sendmail (<= 8.13.1-7) +Description: powerful, efficient, and scalable Mail Transport Agent + Sendmail is an alternative Mail Transport Agent (MTA) for + Debian. It is suitable for handling sophisticated mail + configurations, although this means that its configuration + can also be complex. + . + This package contains the base, architecture independent, portions + of the sendmail packages. + . + Homepage: http://www.sendmail.org + +Package: sendmail-cf +Architecture: all +Section: mail +Suggests: sendmail-doc, m4 +Conflicts: sendmail (<< 8.13.1-7) +Description: powerful, efficient, and scalable Mail Transport Agent + Sendmail is an alternative Mail Transport Agent (MTA) for + Debian. It is suitable for handling sophisticated mail + configurations, although this means that its configuration + can also be complex. + . + This package contains the .m4 (configuration files) for the + sendmail packages. + . + Homepage: http://www.sendmail.org diff --git a/debian/examples/Makefile.in b/debian/examples/Makefile.in index aef3815..08f4d46 100644 --- a/debian/examples/Makefile.in +++ b/debian/examples/Makefile.in @@ -1,3 +1,260 @@ +# Makefile.in generated by automake 1.9.4 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = examples +DIST_COMMON = $(dist_man_MANS) $(dist_sbin_SCRIPTS) \ + $(nobase_dist_sysconf_DATA) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/./build/mkinstalldirs +CONFIG_CLEAN_FILES = +am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)" \ + "$(DESTDIR)$(sysconfdir)" +dist_sbinSCRIPT_INSTALL = $(INSTALL_SCRIPT) +SCRIPTS = $(dist_sbin_SCRIPTS) +SOURCES = +DIST_SOURCES = +man8dir = $(mandir)/man8 +NROFF = nroff +MANS = $(dist_man_MANS) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +nobase_dist_sysconfDATA_INSTALL = $(install_sh_DATA) +DATA = $(nobase_dist_sysconf_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBIAN = @DEBIAN@ +DEBIAN_DH = @DEBIAN_DH@ +DEB_BUILD_ARCH = @DEB_BUILD_ARCH@ +DEB_BUILD_GNU_CPU = @DEB_BUILD_GNU_CPU@ +DEB_BUILD_GNU_SYSTEM = @DEB_BUILD_GNU_SYSTEM@ +DEB_BUILD_GNU_TYPE = @DEB_BUILD_GNU_TYPE@ +DEB_HOST_ARCH = @DEB_HOST_ARCH@ +DEB_HOST_GNU_CPU = @DEB_HOST_GNU_CPU@ +DEB_HOST_GNU_SYSTEM = @DEB_HOST_GNU_SYSTEM@ +DEB_HOST_GNU_TYPE = @DEB_HOST_GNU_TYPE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SM_CPYRT = @SM_CPYRT@ +SM_DATE = @SM_DATE@ +SM_ENABLE_AUTH_FALSE = @SM_ENABLE_AUTH_FALSE@ +SM_ENABLE_AUTH_TRUE = @SM_ENABLE_AUTH_TRUE@ +SM_ENABLE_LDAP_FALSE = @SM_ENABLE_LDAP_FALSE@ +SM_ENABLE_LDAP_TRUE = @SM_ENABLE_LDAP_TRUE@ +SM_ENABLE_TLS_FALSE = @SM_ENABLE_TLS_FALSE@ +SM_ENABLE_TLS_TRUE = @SM_ENABLE_TLS_TRUE@ +SM_MAXVERS = @SM_MAXVERS@ +SM_MINVERS = @SM_MINVERS@ +SM_VERS = @SM_VERS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_STRIP = @ac_ct_STRIP@ +ac_version = @ac_version@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +am_version = @am_version@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +buildtree = @buildtree@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sm_auth_lib = @sm_auth_lib@ +sm_badepends = @sm_badepends@ +sm_build_arch = @sm_build_arch@ +sm_custom = @sm_custom@ +sm_databases = @sm_databases@ +sm_date = @sm_date@ +sm_depends = @sm_depends@ +sm_dist_name = @sm_dist_name@ +sm_dist_vers = @sm_dist_vers@ +sm_editmap_envdef = @sm_editmap_envdef@ +sm_editmap_libs = @sm_editmap_libs@ +sm_enable_auth = @sm_enable_auth@ +sm_enable_bind = @sm_enable_bind@ +sm_enable_dev = @sm_enable_dev@ +sm_enable_doc = @sm_enable_doc@ +sm_enable_hesiod = @sm_enable_hesiod@ +sm_enable_ipv6 = @sm_enable_ipv6@ +sm_enable_ldap = @sm_enable_ldap@ +sm_enable_maillock = @sm_enable_maillock@ +sm_enable_milter = @sm_enable_milter@ +sm_enable_ndbm = @sm_enable_ndbm@ +sm_enable_newdb = @sm_enable_newdb@ +sm_enable_nis = @sm_enable_nis@ +sm_enable_nisplus = @sm_enable_nisplus@ +sm_enable_regex = @sm_enable_regex@ +sm_enable_sfio = @sm_enable_sfio@ +sm_enable_shm = @sm_enable_shm@ +sm_enable_tcpd = @sm_enable_tcpd@ +sm_enable_tls = @sm_enable_tls@ +sm_envdef = @sm_envdef@ +sm_features = @sm_features@ +sm_ffr = @sm_ffr@ +sm_hesiod_parms = @sm_hesiod_parms@ +sm_host_arch = @sm_host_arch@ +sm_incdirs = @sm_incdirs@ +sm_ldap_lib = @sm_ldap_lib@ +sm_libmilter_envdef = @sm_libmilter_envdef@ +sm_libmilter_libs = @sm_libmilter_libs@ +sm_libs = @sm_libs@ +sm_libsm_envdef = @sm_libsm_envdef@ +sm_libsm_libs = @sm_libsm_libs@ +sm_libsmdb_envdef = @sm_libsmdb_envdef@ +sm_libsmdb_libs = @sm_libsmdb_libs@ +sm_libsmutil_envdef = @sm_libsmutil_envdef@ +sm_libsmutil_libs = @sm_libsmutil_libs@ +sm_m4_ffr = @sm_m4_ffr@ +sm_mail_local_envdef = @sm_mail_local_envdef@ +sm_mail_local_libs = @sm_mail_local_libs@ +sm_mailstats_envdef = @sm_mailstats_envdef@ +sm_mailstats_libs = @sm_mailstats_libs@ +sm_makemap_envdef = @sm_makemap_envdef@ +sm_makemap_libs = @sm_makemap_libs@ +sm_mapdef = @sm_mapdef@ +sm_newdb_lib = @sm_newdb_lib@ +sm_praliases_envdef = @sm_praliases_envdef@ +sm_praliases_libs = @sm_praliases_libs@ +sm_recommends = @sm_recommends@ +sm_revision = @sm_revision@ +sm_rmail_envdef = @sm_rmail_envdef@ +sm_rmail_libs = @sm_rmail_libs@ +sm_sendmail_envdef = @sm_sendmail_envdef@ +sm_sendmail_libs = @sm_sendmail_libs@ +sm_smrsh_envdef = @sm_smrsh_envdef@ +sm_smrsh_libs = @sm_smrsh_libs@ +sm_suggests = @sm_suggests@ +sm_time = @sm_time@ +sm_utc = @sm_utc@ +sm_vacation_envdef = @sm_vacation_envdef@ +sm_vacation_libs = @sm_vacation_libs@ +sm_version = @sm_version@ +sm_version_beta = @sm_version_beta@ +sm_version_major = @sm_version_major@ +sm_version_math = @sm_version_math@ +sm_version_minor = @sm_version_minor@ +sm_version_r = @sm_version_r@ +sm_version_v = @sm_version_v@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ + #!/usr/bin/make -f #------------------------------------------------------------------------------ # vim: syntax=make @@ -18,107 +275,368 @@ # # Richard Nelson <cowboy@debian.org> @sm_date@ @sm_time@ (@sm_utc@) #------------------------------------------------------------------------------ -#SHELL=/bin/sh -x +# +# Shipped programs +# +dist_sbin_SCRIPTS = checksendmail/checksendmail +# +# Shipped manpages +# +dist_man_MANS = checksendmail/checksendmail.8 +# +# Shipped data +# +# Installed example subdirectories +EXAMPLES_DIRS = amavis db dhcp3 \ + ldap logcheck milter network \ + pam.d ppp resolvconf sasl tls -# Include Debian Autoconf settings --include ../build/autoconf.mk +# +# Sigh... I wanted to use sysconf_SCRIPTS, but automake says NO! +nobase_dist_sysconf_DATA = dhcp3/dhclient-exit-hooks.d/sendmail \ + logcheck/ignore.d.paranoid/sendmail \ + logcheck/ignore.d.server/sendmail \ + logcheck/ignore.d.workstation/sendmail \ + logcheck/violations.ignore.d/sendmail \ + network/if-down.d/sendmail network/if-up.d/sendmail pam.d/smtp \ + ppp/ip-down.d/sendmail ppp/ip-up.d/sendmail \ + resolvconf/update-libc.d/sendmail +all: all-am -ALL_SUBDIRS = . amavis db dialup ldap logcheck milter pam sasl tls -DATA_SUBDIRS = amavis db ldap pam sasl tls -SCRIPT_SUBDIRS = dialup +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu examples/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; -all: +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -clean: - for subdir in ${ALL_SUBDIRS}; do \ - rm -rf $${subdir}/core $${subdir}/*~; \ - done; +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-dist_sbinSCRIPTS: $(dist_sbin_SCRIPTS) + @$(NORMAL_INSTALL) + test -z "$(sbindir)" || $(mkdir_p) "$(DESTDIR)$(sbindir)" + @list='$(dist_sbin_SCRIPTS)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f $$d$$p; then \ + f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ + echo " $(dist_sbinSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(sbindir)/$$f'"; \ + $(dist_sbinSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(sbindir)/$$f"; \ + else :; fi; \ + done -setup: +uninstall-dist_sbinSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(dist_sbin_SCRIPTS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ + echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \ + rm -f "$(DESTDIR)$(sbindir)/$$f"; \ + done +uninstall-info-am: +install-man8: $(man8_MANS) $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man8dir)" || $(mkdir_p) "$(DESTDIR)$(man8dir)" + @list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.8*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 8*) ;; \ + *) ext='8' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst"; \ + done +uninstall-man8: + @$(NORMAL_UNINSTALL) + @list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.8*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 8*) ;; \ + *) ext='8' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f '$(DESTDIR)$(man8dir)/$$inst'"; \ + rm -f "$(DESTDIR)$(man8dir)/$$inst"; \ + done +install-nobase_dist_sysconfDATA: $(nobase_dist_sysconf_DATA) + @$(NORMAL_INSTALL) + test -z "$(sysconfdir)" || $(mkdir_p) "$(DESTDIR)$(sysconfdir)" + @$(am__vpath_adj_setup) \ + list='$(nobase_dist_sysconf_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + $(am__vpath_adj) \ + echo " $(nobase_dist_sysconfDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(sysconfdir)/$$f'"; \ + $(nobase_dist_sysconfDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(sysconfdir)/$$f"; \ + done -build-indep: -build-arch: - # - # Debian Local additions / changes - # - # examples/ldap/sendmail.schema.v2 - conditional - # - if (grep -qEe "^#LDAP:[[:space:]]*yes" ../build/site.config.m4); then \ - if [ -e ../../${buildtree}/cf/sendmail.schema ]; then \ - $(INSTALL_DATA) ../../${buildtree}/cf/sendmail.schema \ - ldap/sendmail.schema.v2; \ - fi; \ - fi; +uninstall-nobase_dist_sysconfDATA: + @$(NORMAL_UNINSTALL) + @$(am__vpath_adj_setup) \ + list='$(nobase_dist_sysconf_DATA)'; for p in $$list; do \ + $(am__vpath_adj) \ + echo " rm -f '$(DESTDIR)$(sysconfdir)/$$f'"; \ + rm -f "$(DESTDIR)$(sysconfdir)/$$f"; \ + done +tags: TAGS +TAGS: -install-indep: build-indep -install-arch: build-arch - # - # Debian Local additions / changes - # - # ${sysconfdir}/ppp/ip-{up,down}.d - unconditional - # - $(INSTALL) -d ${sysconfdir}/ppp/ip-up.d; - $(INSTALL_SCRIPT) dialup/ip-up.d \ - ${sysconfdir}/ppp/ip-up.d/sendmail; - $(INSTALL) -d ${sysconfdir}/ppp/ip-down.d; - $(INSTALL_SCRIPT) dialup/ip-down.d \ - ${sysconfdir}/ppp/ip-down.d/sendmail; - # - # ${sysconfdir}/pam.d - unconditional - # - $(INSTALL) -d ${sysconfdir}/pam.d; - $(INSTALL_DATA) pam/* \ - ${sysconfdir}/pam.d; - # - # ${sysconfdir}/logcheck - unconditional - # - (cd logcheck && \ - for file in $$(find . -type d); do \ - $(INSTALL) -d ../${sysconfdir}/logcheck/$$file; \ - done;); - for file in $$(find logcheck -type f -name '*sendmail'); do \ - $(INSTALL_DATA) $$file \ - ${sysconfdir}/logcheck/$$(echo "$$file" \ - | sed -e 's?^.*logcheck/??'); \ - done; - # - # ${datadir}/sendmail/examples - unconditional - # - for subdir in ${DATA_SUBDIRS}; do \ - $(INSTALL) -d ${datadir}/sendmail/examples/$$subdir; \ - find $$subdir -type f ! -name '*.in' | xargs -ri \ - $(INSTALL_DATA) '{}' ${datadir}/sendmail/examples/$$subdir; \ - done; - for subdir in ${SCRIPT_SUBDIRS}; do \ - $(INSTALL) -d ${datadir}/sendmail/examples/$$subdir; \ - find $$subdir -type f ! -name '*.in' | xargs -ri \ - $(INSTALL_SCRIPT) '{}' ${datadir}/sendmail/examples/$$subdir; \ - done; - # Can't simply $(INSTALL) logcheck, has subdirs... - $(INSTALL) -d ${datadir}/sendmail/examples/logcheck; - cp -a logcheck/* \ - ${datadir}/sendmail/examples/logcheck; - # - # ${datadir}/sendmail/examples - conditional - # - if (grep -qEe "^#MILTER:[[:space:]]*yes" ../build/site.config.m4); then \ - $(INSTALL) -d ${datadir}/sendmail/examples/milter; \ - $(INSTALL_DATA) milter/* \ - ${datadir}/sendmail/examples/milter; \ - chmod a+x \ - ${datadir}/sendmail/examples/milter/Makefile; \ - fi; +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + $(mkdir_p) $(distdir)/checksendmail $(distdir)/dhcp3/dhclient-exit-hooks.d $(distdir)/logcheck/ignore.d.paranoid $(distdir)/logcheck/ignore.d.server $(distdir)/logcheck/ignore.d.workstation $(distdir)/logcheck/violations.ignore.d $(distdir)/network/if-down.d $(distdir)/network/if-up.d $(distdir)/pam.d $(distdir)/ppp/ip-down.d $(distdir)/ppp/ip-up.d $(distdir)/resolvconf/update-libc.d + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(SCRIPTS) $(MANS) $(DATA) +installdirs: + for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(sysconfdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic -#------------- -# Below here is fairly generic really +dvi: dvi-am -source diff: - @echo >&2 'source and diff are obsolete - use dpkg-source -b'; false +dvi-am: -build: build-indep build-arch -install: install-indep install-arch -.PHONY: all -.PHONY: setup -.PHONY: clean build build-indep build-arch -.PHONY: install install-indep install-arch -.PHONY: source diff +html: html-am + +info: info-am + +info-am: + +install-data-am: install-man + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook + +install-exec-am: install-dist_sbinSCRIPTS \ + install-nobase_dist_sysconfDATA + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-exec-hook + +install-info: install-info-am + +install-man: install-man8 + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-dist_sbinSCRIPTS uninstall-info-am \ + uninstall-man uninstall-nobase_dist_sysconfDATA + +uninstall-man: uninstall-man8 + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-data-hook install-dist_sbinSCRIPTS install-exec \ + install-exec-am install-exec-hook install-info install-info-am \ + install-man install-man8 install-nobase_dist_sysconfDATA \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \ + uninstall-dist_sbinSCRIPTS uninstall-info-am uninstall-man \ + uninstall-man8 uninstall-nobase_dist_sysconfDATA + +# +# Local customisation... not automake friendly +# +install-data-hook: + $(INSTALL) -d ${DESTDIR}${pkgdatadir}/examples; + for dir in ${EXAMPLES_DIRS}; do \ + $(INSTALL) -d ${DESTDIR}${pkgdatadir}/examples/$$dir; \ + find $$dir -type f \ + ! -name '*.in' -a ! -name '*.am' -a ! -name '*.old' \ + | xargs -ri \ + $(INSTALL_DATA) '{}' ${DESTDIR}${pkgdatadir}/examples/'{}'; \ + done; + chmod a+rx ${DESTDIR}${pkgdatadir}/examples/milter/Makefile; + chmod a+rx ${DESTDIR}${pkgdatadir}/examples/dhcp3/dhclient-exit-hooks.d/sendmail; + chmod a+rx ${DESTDIR}${pkgdatadir}/examples/network/if-down.d/sendmail; + chmod a+rx ${DESTDIR}${pkgdatadir}/examples/network/if-up.d/sendmail; + chmod a+rx ${DESTDIR}${pkgdatadir}/examples/ppp/ip-down.d/sendmail; + chmod a+rx ${DESTDIR}${pkgdatadir}/examples/ppp/ip-up.d/sendmail; + chmod a+rx ${DESTDIR}${pkgdatadir}/examples/resolvconf/update-libc.d/sendmail; + chmod a+rx ${DESTDIR}${sysconfdir}/dhcp3/dhclient-exit-hooks.d/sendmail; + chmod a+rx ${DESTDIR}${sysconfdir}/network/if-down.d/sendmail; + chmod a+rx ${DESTDIR}${sysconfdir}/network/if-up.d/sendmail; + chmod a+rx ${DESTDIR}${sysconfdir}/ppp/ip-down.d/sendmail; + chmod a+rx ${DESTDIR}${sysconfdir}/ppp/ip-up.d/sendmail; + chmod a+rx ${DESTDIR}${sysconfdir}/resolvconf/update-libc.d/sendmail; + $(INSTALL_DATA) checksendmail/address.resolve \ + ${DESTDIR}${sysconfdir}/mail/; +install-exec-hook: + sed -e "s?/etc/sendmail.cf?${sysconfdir}/mail/sendmail.cf?g" \ + -e "s?address.resolve?${sysconfdir}/mail/address.resolve?g" \ + checksendmail/checksendmail \ + > ${DESTDIR}${sbindir}/checksendmail; + chmod 0755 ${DESTDIR}${sbindir}/checksendmail; + if [ -f ${top_srcdir}/../${buildtree}/contrib/buildvirtuser ]; then \ + $(INSTALL_SCRIPT) ${top_srcdir}/../${buildtree}/contrib/buildvirtuser \ + ${DESTDIR}${pkgdatadir}; \ + fi; + sed 's?/bin/perl?/usr/bin/perl?g' \ + ${top_srcdir}/../${buildtree}/contrib/passwd-to-alias.pl \ + > ${DESTDIR}${pkgdatadir}/examples/passwd-to-alias; + chmod 0755 ${DESTDIR}${pkgdatadir}/examples/passwd-to-alias; + sed -e 's?/usr/local/bin/perl?/usr/bin/perl?g' \ + -e "s?/etc/sendmail.cf?${sysconfdir}/mail/sendmail.cf?g" \ + ${top_srcdir}/../${buildtree}/contrib/etrn.pl \ + > ${DESTDIR}${sbindir}/etrn; + chmod 0755 ${DESTDIR}${sbindir}/etrn; + if [ -f ${top_srcdir}/../${buildtree}/contrib/etrn.0 ]; then \ + sed -e 's?/usr/local/bin/perl?/usr/bin/perl?g' \ + -e 's?etrn(1M)?etrn(8)?g' \ + ${top_srcdir}/../${buildtree}/contrib/etrn.0 \ + > ${DESTDIR}${mandir}/man8/etrn.8; \ + else \ + sed -e 's?/usr/local/bin/perl?/usr/bin/perl?g' \ + -e 's?etrn(1M)?etrn(8)?g' \ + ${top_srcdir}/../${buildtree}/contrib/etrn.pl \ + > ${DESTDIR}${mandir}/man8/etrn.8; \ + fi; + sed -e 's?/usr/local/bin/perl?/usr/bin/perl?g' \ + ${top_srcdir}/../${buildtree}/contrib/expn.pl \ + > ${DESTDIR}${bindir}/expn; + chmod 0755 ${DESTDIR}${bindir}/expn; + sed -e 's?/usr/local/bin/perl?/usr/bin/perl?g' \ + ${top_srcdir}/../${buildtree}/contrib/expn.pl \ + > ${DESTDIR}${mandir}/man1/expn.1; + sed -e 's?/usr/local/bin/perl?/usr/bin/perl?g' \ + -e 's?/usr/sbin/sendmail -q30m -bd?/etc/init.d/sendmail start?g' \ + ${top_srcdir}/../${buildtree}/contrib/smcontrol.pl \ + > ${DESTDIR}${pkgdatadir}/smcontrol.pl; + chmod 0755 ${DESTDIR}${pkgdatadir}/smcontrol.pl; + $(INSTALL_SCRIPT) ${top_srcdir}/../${buildtree}/contrib/doublebounce.pl \ + ${DESTDIR}${pkgdatadir}; + if [ -f ${top_srcdir}/../${buildtree}/contrib/qtool.pl ]; then \ + sed -e 's?/usr/bin/env perl?/usr/bin/perl?g' \ + ${top_srcdir}/../${buildtree}/contrib/qtool.pl \ + > ${DESTDIR}${pkgdatadir}/qtool.pl; \ + chmod 0755 ${DESTDIR}${datadir}/sendmail/qtool.pl; \ + $(INSTALL_DATA) ${top_srcdir}/../${buildtree}/contrib/qtool.8 \ + ${DESTDIR}${mandir}/man8/; \ + fi; +# +# Debian targets, phase out (this needs to be treated as -arch, not -indep) +# +.PHONY: build-indep build-arch +.PHONY: install-indep install-arch +build-indep: +build-arch: +install-indep: install +install-arch: +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/debian/checksendmail/BSDI_CONTRIB b/debian/examples/checksendmail/BSDI/BSDI_CONTRIB index 97871d5..97871d5 100644 --- a/debian/checksendmail/BSDI_CONTRIB +++ b/debian/examples/checksendmail/BSDI/BSDI_CONTRIB diff --git a/debian/checksendmail/Makefile b/debian/examples/checksendmail/BSDI/Makefile index 101ba4e..101ba4e 100644 --- a/debian/checksendmail/Makefile +++ b/debian/examples/checksendmail/BSDI/Makefile diff --git a/debian/checksendmail/address.resolve b/debian/examples/checksendmail/BSDI/address.resolve index 01f3011..01f3011 100644 --- a/debian/checksendmail/address.resolve +++ b/debian/examples/checksendmail/BSDI/address.resolve diff --git a/debian/checksendmail/checksendmail.8 b/debian/examples/checksendmail/BSDI/checksendmail.8 index b129c35..b129c35 100644 --- a/debian/checksendmail/checksendmail.8 +++ b/debian/examples/checksendmail/BSDI/checksendmail.8 diff --git a/debian/checksendmail/checksendmail.perl b/debian/examples/checksendmail/BSDI/checksendmail.perl index 14f4c14..a8e9e11 100644 --- a/debian/checksendmail/checksendmail.perl +++ b/debian/examples/checksendmail/BSDI/checksendmail.perl @@ -24,12 +24,6 @@ $cffile = "/etc/sendmail.cf"; $sendmail = "/usr/sbin/sendmail"; -# Pre-create tmp files (so can use safely) -use Fcntl; -foreach ("/tmp/csm$$", "/tmp/csm.in$$") { - die "Can't pre-create $_" unless sysopen(T,$_,O_RDWR|O_CREAT|O_EXCL,0600) and close(T); -} - sub usage { die "Usage: checksendmail [-C cffile.cf] [-r resolve_addrs_file [-T one\@test.addr\n"; } diff --git a/debian/examples/checksendmail/BSDI_CONTRIB b/debian/examples/checksendmail/BSDI_CONTRIB new file mode 100644 index 0000000..97871d5 --- /dev/null +++ b/debian/examples/checksendmail/BSDI_CONTRIB @@ -0,0 +1,18 @@ +Software Package: + checksendmail + +Release/Version: + Dated 7/11/90. + +Retrieved from: + N/A. + +Bug reports: + This software package is maintained by the software contributor, + not BSDI. Please send any bug reports to both support@BSDI.COM + and polk@bsdi.com. + +Comments: + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Modifications to this version made by BSDI: diff --git a/debian/examples/checksendmail/address.resolve b/debian/examples/checksendmail/address.resolve new file mode 100644 index 0000000..2de8a60 --- /dev/null +++ b/debian/examples/checksendmail/address.resolve @@ -0,0 +1,15 @@ +# addresses to be delivered locally +root +postmaster +user +user@mailhub +user@mailhub.gadget.com +user@gadget.com + +# Addresses to be forwarded with SMTP to firewall +user@firewall +user@firewall.gadget.com + +# Addresses to be forwarded with SMTP to harker.com +user@harker.com +harker!user diff --git a/debian/examples/checksendmail/checksendmail b/debian/examples/checksendmail/checksendmail new file mode 100644 index 0000000..349d025 --- /dev/null +++ b/debian/examples/checksendmail/checksendmail @@ -0,0 +1,868 @@ +#!/usr/bin/perl + +# BSDI $Id: checksendmail.perl,v 1.1.1.1 1994/01/13 21:15:31 polk Exp $ + +# checksendmail +# +# The checksendmail program is a perl script that aids the testing +# of sendmail's various configuration filse. checksendmail +# passes typical addresses (supplied in input files) through +# sendmail and prints the result of the resolution and +# transformation routines. +# +# Gene Kim & Rob Kolstad & Jeff Polk, 7/11/90 +# Modified by Robert Harker, 11/14/00 + +# -- -a show aliasing of local addresses +# -- -d preceed each line with ruleset sequence summary +# -- -C config_file +# -- -b sendmail_binary +# -- -l log_file of results of tests +# -- -r resolve_addresses_file +# -- -T test one address + +# defaults: + $resolve = "address.resolve"; + $cffile = "/etc/mail/sendmail.cf"; + +# Pre-create tmp files (so can use safely) + use Fcntl; + foreach ("/tmp/csm$$", "/tmp/csm.in$$") { + die "Can't pre-create $_" + unless sysopen(T,$_,O_RDWR|O_CREAT|O_EXCL,0600) + and close(T); + }; + +sub usage { + die "Usage: checksendmail [-C cffile.cf] [-b sendmail_binary] [-l log_file]\n\t\t\t\t[-a] [-d] [-r resolve_addrs_file || -T one\@test.addr]\n$errormsg\n"; +} + +for (unshift (@ARGV, "XX"); $#ARGV > 0; shift ARGV) { + if ($ARGV[1] eq "-C") + { + if ($setcffile & 1) { die "Can only set `cffile.cf' once"; } + shift @ARGV; + if ($#ARGV >= 1) {$cffile = $ARGV[1]; } + else { + $errormsg = "No sendmail.cf file given for -C flag\n"; + &usage(); + } + $setcffile += 1; + } + elsif ($ARGV[1] eq "-r") + { + if ($setfile & 1) { die "Can only set `resolve' once"; } + shift @ARGV; + if ($#ARGV < 1) { + $errormsg = "No resolve_addrs_file given for -r flag\n"; + &usage(); + } + $resolve = $ARGV[1]; + $setfile += 1; + } + elsif ($ARGV[1] eq "-T") + { + if ($setfile) { die "Can't set other files and use -T"; } + shift @ARGV; + if ($#ARGV < 1) { + $errormsg = "No one\@test.addr given for -T flag\n"; + &usage(); + } + open (OUT, ">/tmp/csm.in$$") || + die "Can't open >/tmp/csm.in$$"; + $resolve = "/tmp/csm.in$$"; + print OUT "$ARGV[1]\n"; + close (OUT); + $setfile = 7; + } + elsif ($ARGV[1] eq "-b") + { + if ($setbin & 1) { die "Can only set `sendmail_binary' once"; } + shift @ARGV; + if ($#ARGV >= 1) {$sendmail = $ARGV[1]; } + else { + $errormsg = "No sendmail_binary file given for -b flag\n"; + &usage(); + } + $setbin += 1; + } + elsif ($ARGV[1] eq "-l") + { + if ($setlog & 1) { die "Can only set `log_file' once"; } + shift @ARGV; + if ($#ARGV >= 1) {$logfile = $ARGV[1]; } + else { + $errormsg = "No log_file file given for -l flag\n"; + &usage(); + } + $setlog += 1; + } + elsif ($ARGV[1] eq "-a") + { + $doaliasing += 1; + } + elsif ($ARGV[1] eq "-d") + { + $dorspath += 1; + } + else { &usage(); } +} + +# Figure out where the sendmail binary is +if (! $setbin & 1) { + foreach $i ("/usr/sbin/sendmail", "/usr/libexec/sendmail", "/usr/lib/sendmail") + { + # test if binary exists and is executable + if ((-e $i) && (-x $i)) { + $sendmail = $i; + last; + } + } +} + + +# Figure out the version of sendmail and the location of the sendmail.cf file +# sendmail -d0.10 -bv root +# ("-bv root" is just to give sendmail something to chew on) + +$binversion = `$sendmail -d0.10 -bv root | grep "^Version "`; +chop $binversion; +$binversion =~ s/^Version //; + +# Get the major relase number from the sendmail version +$binver = $binversion; +$binver =~ s/^8\.//; +$binver =~ s/\..+//; + +# if the cf file was not set on the command line, +# find out where the binary looks for it +if ( ! -e $cffile ) { + $cffile = `$sendmail -d0.10 -bv root | grep "Def Conf file:"`; + chop $cffile; + $cffile =~ s/ //g; + $cffile =~ s/ //g; + $cffile =~ s/^DefConffile://; +} + +if (!-e $cffile) { die "Can't find configuration file $cffile\n"; } + +if (!-e $resolve) { die "Can't find name file $resolve\n"; } + +# Figure out the version of the sendmail.cf file +# Look for the V line +$cfversion = `grep "^V" $cffile`; +chop $cfversion; +# if $cfversion is empty, then the configuration is sendmail 5, not sendmail 8 +$cfversion =~ s/^$/V0/; + +# Get the version number from the V line +$cfver = $cfversion; +$cfver =~ s/^V//; +$cfver =~ s'/.+''; + +# check that the binary is a higher version than config file +if ( $binver < $cfver + 1) { + die "$cffile version ($cfversion) is more advanced than $sendmail version ($binversion)\n"; +} + +# figure out where the mqueue directory is +if ( $cfver <= 6 ) { + $maildir = `grep "^OQ" $cffile`; + chop $maildir; + $maildir =~ s/^OQ//; +} else { + $maildir = `grep "^O QueueDirectory" $cffile`; + chop $maildir; + $maildir =~ s/^O QueueDirectory=//; +} + +# make sure the user can access the ../mqueue directory +if ((!-r $maildir) || (!-x $maildir) || (!-w $maildir)) { + if ($doaliasing & 1) { + die "checksendmail: can't access $maildir! can't use checksendmail's -a flag\n"; + } else { + warn "checksendmail: can't access $maildir! trying anyway...\n"; + } +} + +chop($hostname = `hostname`); +chop($pwd = `pwd`); +print "system: $hostname\t\tcurrent dir: $pwd\n"; +print "resolve file: $resolve\n"; +print "sendmail binary: $sendmail\t\tsendmail version: $binversion\n"; +print "config file: $cffile\t\tconfig file version: $cfversion\n\n"; +if ($setlog & 1) { + print "log file: $logfile\n\n"; + # now print to the log file + open (LOG , ">$logfile") || die "Can't open >$logfile"; + print LOG "system: $hostname\t\tcurrent dir: $pwd\n"; + print LOG "resolve file: $resolve\n"; + print LOG "sendmail binary: $sendmail\t\tsendmail version: $binversion\n"; + print LOG "config file: $cffile\t\tconfig file version: $cfversion\n"; + print LOG "log file: $logfile\n\n"; +} + +sub handler { # 1st argument is signal name + local($sig) = @_; + print STDERR "Caught a SIG$sig--shutting down\n"; + unlink("/tmp/csm$$") || die "Can't unlink /tmp/csm$$"; + unlink("/tmp/csm.in$$"); + if ($setlog & 1) { + close(LOG); + } + exit(0); +} + +$SIG{'INT'} = 'handler'; +$SIG{'QUIT'} = 'handler'; + + + +# glean the mailers used from the rule 0 tests + +sub parseresolve +{ + while (<MAIL>) + { + # now print to the log file + if ($setlog & 1) { + print LOG $_; + } + if (/^ADDRESS TEST MODE/) { next; } + if (/^Enter <ruleset>/) { next; } + if (/^Warning: .cf file is out of date/) { next; } + + # if the binary is less than 8.7 then use result of ruleset 0 + if ( $binver <= 6 ) { + if (/^>/) # INPUT LINE! (and last output is done) + { + chop; + if ($prevline) { # OUTPUT LINE! + &printparseresolve; + } + s/> *[0-9,]* *//g; + s/.*input: *//; + s/ //g; + s/"//g; + $input = $_; + } + else { chop; } + $prevline = $_; + } else { + # format of /parse output is: + # Parsing envelope recipient address + # rewrite: ruleset 3 input: harker @ harker . com + if ($prevrule eq "Parsing envelope recipient address\n" ) + { + chop; + s/> *[0-9,]* *//g; + s/.*input: *//; + s/ //g; + s/"//g; + $input = $_; + $prevrule = $_; + } + elsif (/^mailer /) + { + $prevrule = $_; + &printparseresolve; + } + else + { + $prevrule = $_; + } + } + } + #&printparseresolve; +} + +sub printparseresolve { + # if the binary is less than 8.7 then use result of ruleset 0 + if ( $binver <= 6 ) { + if ($input eq "") { return;} + + $prevline =~ s/.*returns: *//; + $prevline =~ s/"//g; + $prevline =~ s/ //g; + # Don't strip spaces off error messages + $prevline =~ s/ *([.!%<>]) */$1/g; + $prevline =~ s/ +([;?\$])/$1/g; + $prevline =~ s/([#\@:]) +/$1/g; + +# non-Sun test mode delimiters -> easily-readable style +# Mark Sausville, MIT Media Laboratory, saus@media-lab.media.mit.edu + $prevline =~ s/\^V/\$#/; + $prevline =~ s/\^W/\$@/; + $prevline =~ s/\^X/\$:/; + + #### $#ether$@sun-barr.Ebay.Sun.COM$:site!user@uunet.uu.NET + @t = split( '\$', $prevline); + $address = "XXX"; + $remote = "XXX"; + $mailer = "XXX"; + for ($i = 1; $i <= $#t; $i++) + { + if (substr($t[$i], 0, 1) eq ":") + { $address = substr($t[$i], 1,999); } + if (substr($t[$i], 0, 1) eq "@") + { $remote = substr($t[$i], 1,999); } + if (substr($t[$i], 0, 1) eq "#") + { $mailer = substr($t[$i], 1,999); + $mailer =~ tr/A-Z/a-z/; } + } + } else { + # the binary is at least 8.7 then use result of /parse + chop; + s/,//g; + + # mailer esmtp, host harker.com., user harker@harker.com + @t = split( ' ', $_); + $address = "XXX"; + $remote = "XXX"; + $mailer = "XXX"; + for ($i = 0; $i <= $#t; $i++) + { + if ($t[$i] eq "user") + { $address = $t[++$i]; } + if ($t[$i] eq "host") + { $remote = $t[++$i]; } + if ($t[$i] eq "mailer") + { $mailer = $t[++$i]; + $mailer =~ tr/A-Z/a-z/; } + } + } + printf("%-27.27s --(%-6.6s)--> %s[%s]\n", $input, $mailer, + $address, $remote); + # now print to the log file + if ($setlog & 1) { + printf LOG ("%-27.27s --(%-6.6s)--> %s[%s]\n\n", $input, $mailer, + $address, $remote); + } + + if ($doaliasing & 1) { + # If the address resolved to the local mailer, + # then expand the username as an alias + if ( $mailer eq "local") + { + $setalias = $aliasfound = 0; + $laddress = $address; + $sendmailprog = "$sendmail -bv -C$cffile $laddress|"; + open(LOCAL, $sendmailprog) || + die "can't exec $sendmailprog...\n"; + # now print to the log file + if ($setlog & 1) { + print LOG "\n$sendmailprog\n"; + } + while (<LOCAL>) + { + # now print to the log file + if ($setlog & 1) { + print LOG $_; + } + chop; + if (/unknown/) + { + $aliasfound = 1; + printf("\t\t aliased to --(error )--> %s\n", $_); + # now print to the log file + if ($setlog & 1) { + printf LOG ("\t\t aliased to --(error )--> %s\n\n", $_); + } + next; + } + s/,//g; + @l = split( ' ', $_); + $aladdress = "XXX"; + $remote = "XXX"; + $mailer = "XXX"; + for ($i = 1; $i <= $#l; $i++) + { + # ./sendmail -bv -C./sendmail.cf j.murphy + # j.murphy@pop.mcit.com... deliverable: mailer mciesmtp, + # host pop.mcit.com, user j.murphy@pop.mcit.com + if ($l[$i] eq "user") { $aladdress = $l[++$i]; } + if ($l[$i] eq "host") { $remote = $l[++$i]; } + if ($l[$i] eq "mailer") { $mailer = $l[++$i]; } + } + if (("$laddress" eq "$aladdress") && ($aliasfound == 0)) { + $selfalias = 1; + next; + } + printf("\t\t aliased to --(%-6.6s)--> %s[%s]\n", + $mailer, $aladdress, $remote); + # now print to the log file + if ($setlog & 1) { + printf LOG ("\t\t aliased to --(%-6.6s)--> %s[%s]\n\n", + $mailer, $aladdress, $remote); + } + if ("$laddress" ne "$aladdress") { + $aliasfound = 1; + $envsenderaddrs .= " $aladdress"; + } + if ($mailer ne "XXX") { $themailers{$mailer}=1;} + } + close(LOCAL); + if ($selfalias == 1 && $aliasfound == 1) { + printf("\t\t aliased to --(%-6.6s)--> %s[%s]\n", + $mailer, $aladdress, $remote); + # now print to the log file + if ($setlog & 1) { + printf LOG ("\t\t aliased to --(%-6.6s)--> %s[%s]\n\n", + $mailer, $aladdress, $remote); + } + } + # now print a blank line to the log file + if ($setlog & 1) { + print LOG "\n"; + } + } else { + $envsenderaddrs .= " $address"; + } + } + + if ($mailer ne "XXX") { $themailers{$mailer}.="$input ";} +} + +# Parse output of sendmail name resolution + +sub parseaddress +{ +## ADDRESS TEST MODE +## Enter <ruleset> <address> +## > rewrite: ruleset 3 input: "user" + + open(MAIL, $_[0]) || die "Can't open $_[0]...\n"; + local ($k, $address, $prevline, $mailer, $remote, $input); + print $_[1]; # the title + # now print to the log file + if ($setlog & 1) { + print LOG "\n$_[1]"; # the title + } + + $done = 0; + while (<MAIL>) + { + # now print to the log file + if ($setlog & 1) { + print LOG $_; + } + if (/^> *$/) { $done = 1; } + if (/^ADDRESS TEST MODE/) { next; } + if (/^Enter <ruleset>/) { next; } + if (/^Warning: .cf file is out of date/) { next; } + if (/^$/) { next; } + chop; + # rewrite $rules to be just a slash if it starts with a / + $rules =~ s'/.+'/'; + # if the binary is less than 8.7 then use result of ruleset 4 + if ( $binver <= 6 || $rules ne "/" ) { + if (/^>/) # INPUT LINE! (and last output is done) + { + if ($prevline) { # OUTPUT LINE! + $prevline =~ s/.*returns: *//; + $prevline =~ s/"//g; + $prevline =~ s/ //g; +#> rewrite: ruleset 3 input: "site" "!" "user" "@" "uunet" "." "uu" "." "net" +#rewrite: ruleset 8 input: "site" "!" "user" "@" "uunet" "." "uu" "." "net" +#> + printf("%s%-24.24s ----> %s\n", $rspath, $input, $prevline); + # now print to the log file + if ($setlog & 1) { + printf LOG ("%s%-24.24s ----> %s\n", $rspath, $input, $prevline); + } + } + s/> *[0-9,]* *//g; + s/.*input: *//; + s/ //g; + s/"//g; + $input = $_; + } + last if $done; + $prevline = $_; + } else { + # format of /try output is: + # Trying envelope recipient address harker for mailer esmtp + # ... + # Rcode = 0, addr = harker@mailhub.gadget.com + # remove extra ">" from "> >" lines + s/^> >/>/; + if (/^> Trying/) # INPUT LINE! (and last output is done) + { + chop; + s/> Trying .+ address //; + s/ for mailer .+//; + s/ //g; + s/"//g; + $input = $_; + $prevrule = $_; + } + elsif (/^Rcode = /) + { + $prevrule = $_; + # Rcode = 0, addr = harker@mailhub.gadget.com + s/^Rcode = .+ addr = //; + printf("%s%-24.24s ----> %s\n", $rspath, $input, $_); + # now print to the log file + if ($setlog & 1) { + printf LOG ("%s%-24.24s ----> %s\n\n", $rspath, $input, $_); + } + } + else + { + $prevrule = $_; + } + } + } + # now print to the log file + if ($setlog & 1) { + print LOG "\n"; + } + close(MAIL); +} + + +# if the binary is less than 8.7 then use result of ruleset 4 +if ( $binver <= 6 ) { + print "Mail address resolution (rule 0)\n"; + # now print to the log file + if ($setlog & 1) { + print LOG "Mail address resolution (rule 0)\n"; + } +} else { + print "Mail address resolution (/parse)\n"; + # now print to the log file + if ($setlog & 1) { + print LOG "Mail address resolution (/parse)\n"; + } +} +# pass names from resolve files to sendmail + +open(IN, $resolve) || die "can't open $resolve\n"; +open(OUT, ">/tmp/csm$$") || die "can't open >/tmp/csm$$\n"; +while (<IN>) +{ + /^$/ && next; + /^#/ && next; + # if the binary is less than 8.7 then use result of ruleset 0 + if ( $binver == 5 ) { + $rules = "0 $_"; + } elsif ( $binver <= 6 ) { + $rules = "3,0 $_"; + } else { + $rules = "/parse $_"; + } + print OUT $rules; + # now print to the log file + if ($setlog & 1) { + print LOG "$rules"; + } + chop; + $allinput .= " $_"; +} + $allinput =~ s/^ //; +close(OUT); +close(IN); +$sendmailprog = "$sendmail -bt -C$cffile < /tmp/csm$$|"; +open(MAIL, $sendmailprog) || die "can't exec $sendmailprog...\n"; +&parseresolve(); + +# calculate $f + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + open (OUT, $sendmailprog); + open (IN, $resolve); + # sendmail 5 automatically runs ruleset 3 + if ( $binver == 5 ) { + $rules = "1,4"; + } else { + $rules = "3,1,4"; + } + if ($dorspath & 1) { $rspath = "\$f: "; } + + while (<IN>) { + chop; + /^$/ && next; + /^#/ && next; + $address = $_; + print OUT "$rules $address\n"; + # now print to the log file + if ($setlog & 1) { + print LOG "$rules $address\n"; + } + } + print OUT "\n"; # stuff last line into sendmail + # now print to the log file + if ($setlog & 1) { + print LOG "\n"; # stuff last line into sendmail + } + close(IN); + close(OUT); + &parseaddress ("/tmp/csm$$", "\n\$f address header transformations\n"); + +# Get the R= and S= special rulesets from the configuration +# now print to the log file +if ($setlog & 1) { + print LOG "\nGet the R= and S= mailer specific rulesets\n"; +} + +open(FID, "grep ^M $cffile|"); +while (<FID>) +{ +# Mether, P=[IPC], F=msDFMueCX, S=11, R=21, A=IPC $h + chop; + $thisline = $_; + $thisline =~ s/M//; + $thisline =~ s/,.*//; + $thisline =~ tr/A-Z/a-z/; + $sendrule = $_; + $sendrule =~ s/.*S=//; + $sendrule =~ s/,.*//; + if ($sendrule=~q!/!) { + ($esendrule, $hsendrule) = split (q!/!, $sendrule); + } else { + $esendrule = $hsendrule = $sendrule; + } + $recvrule = $_; + $recvrule =~ s/.*R=//; + $recvrule =~ s/,.*//; + if ($recvrule=~q!/!) { + ($erecvrule, $hrecvrule) = split (q!/!, $recvrule); + } else { + $erecvrule = $hrecvrule = $recvrule; + } + $esendrules{$thisline} = $esendrule; + $hsendrules{$thisline} = $hsendrule; + $erecvrules{$thisline} = $erecvrule; + $hrecvrules{$thisline} = $hrecvrule; + # now print to the log file + if ($setlog & 1) { + print LOG "mailer: $thisline\t->\tesendrule = $esendrule, hsendrule = $hsendrule, + erecvrule = $erecvrule, hrecvrule = $hrecvrule\n"; + } +} +# now print to the log file +if ($setlog & 1) { + print LOG "\n"; +} +close(FID); + +# pass envelope recipient names from various mailers through sendmail +foreach $i (keys %themailers) +{ + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + open (OUT, $sendmailprog); + if ($dorspath & 1) { $rspath = "$i ER: "; } + + # if the binary is less than 8.7 then use result of ruleset 0 + if ( $binver <= 6 ) { + if ($erecvrules{$i} == 0) { + print "\nCan't find recv rule for `$i', skipping this mailer <-------------------\n"; + next; + } + # sendmail 5 automatically runs ruleset 3 + if ( $binver == 5 ) { + $rules = "2,$erecvrules{$i},4"; + } else { + $rules = "3,2,$erecvrules{$i},4"; + } + } else { + print OUT "/tryflags ER\n"; + # now print to the log file + if ($setlog & 1) { + print LOG "/tryflags ER\n"; + } + $rules = "/try $i"; + } + @namelist = split(/ /, $allinput); + foreach (@namelist) { + print OUT "$rules $_\n"; + # now print to the log file + if ($setlog & 1) { + print LOG "$rules $_\n"; + } + } + print OUT "\n"; # stuff last line into sendmail + # now print to the log file + if ($setlog & 1) { + print LOG "\n"; # stuff last line into the log + } + close(OUT); + $note = ""; + if ($erecvrules{$i} eq $hrecvrules{$i}) { $note = "and header "; } + &parseaddress ("/tmp/csm$$", "\n`To' envelope ${note}address transformations for mailer $i [$rules]:\n"); +} + +# pass header recipient names from various mailers through sendmail +foreach $i (keys %themailers) +{ + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + open (OUT, $sendmailprog); + if ($dorspath & 1) { $rspath = "$i HR: "; } + + # only run the header ruleset if the mailer uses split env/hdr rulesets + if ($hrecvrules{$i} ne $erecvrules{$i}) { + # if the binary is less than 8.7 then use result of ruleset 0 + if ( $binver <= 6 ) { + if ($hrecvrules{$i} == 0) { + print "\nCan't find recv rule for `$i', skipping this mailer <-------------------\n"; + next; + } + # sendmail 5 automatically runs ruleset 3 + if ( $binver == 5 ) { + $rules = "2,$hrecvrules{$i},4"; + } else { + $rules = "3,2,$hrecvrules{$i},4"; + } + } else { + print OUT "/tryflags HR\n"; + # now print to the log file + if ($setlog & 1) { + print LOG "/tryflags HR\n"; + } + $rules = "/try $i"; + } + @namelist = split(/ /, $allinput); + foreach (@namelist) { + print OUT "$rules $_\n"; + # now print to the log file + if ($setlog & 1) { + print LOG "$rules $_\n"; + } + } + print OUT "\n"; # stuff last line into sendmail + # now print to the log file + if ($setlog & 1) { + print LOG "\n"; # stuff last line into the log + } + close(OUT); + &parseaddress ("/tmp/csm$$", "\n`To' header address transformations for mailer $i [$rules]:\n"); + } +} + +# pass envelope sender names from various mailers through sendmail +foreach $i (keys %themailers) +{ + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + open (OUT, $sendmailprog); + if ($dorspath & 1) { $rspath = "$i ES: "; } + + # if the binary is less than 8.7 then use result of ruleset 0 + if ( $binver <= 6 ) { + if ($esendrules{$i} == 0) { + print "\nCan't find send rule for `$i', skipping this mailer <-------------------\n"; + next; + } + # sendmail 5 automatically runs ruleset 3 + if ( $binver == 5 ) { + $rules = "2,$esendrules{$i},4"; + } else { + $rules = "3,2,$esendrules{$i},4"; + } + } else { + print OUT "/tryflags ES\n"; + # now print to the log file + if ($setlog & 1) { + print LOG "/tryflags ES\n"; + } + $rules = "/try $i"; + } + @namelist = split(/ /, $allinput); + foreach (@namelist) { + print OUT "$rules $_\n"; + # now print to the log file + if ($setlog & 1) { + print LOG "$rules $_\n"; + } + } + print OUT "\n"; # stuff last line into sendmail + close(IN); + close(OUT); + $note = ""; + if ($esendrules{$i} eq $hsendrles{$i}) {$note = "and header ";} + &parseaddress ("/tmp/csm$$", "\n`From' envelope ${note}address transformations for mailer $i [$rules]:\n"); +} + +# pass header sender names from various mailers through sendmail +foreach $i (keys %themailers) +{ + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + open (OUT, $sendmailprog); + if ($dorspath & 1) { $rspath = "$i HS: "; } + + # only run the header ruleset if the mailer uses split env/hdr rulesets + if ($hsendrules{$i} ne $esendrules{$i}) { + # if the binary is less than 8.7 then use result of ruleset 0 + if ( $binver <= 6 ) { + if ($hsendrules{$i} == 0) { + print "\nCan't find send rule for `$i', skipping this mailer <-------------------\n"; + next; + } + # sendmail 5 automatically runs ruleset 3 + if ( $binver == 5 ) { + $rules = "2,$hsendrules{$i},4"; + } else { + $rules = "3,2,$hsendrules{$i},4"; + } + } else { + print OUT "/tryflags HS\n"; + # now print to the log file + if ($setlog & 1) { + print LOG "/tryflags HR\n"; + } + $rules = "/try $i"; + } + @namelist = split(/ /, $allinput); + foreach (@namelist) { + print OUT "$rules $_\n"; + # now print to the log file + if ($setlog & 1) { + print LOG "$rules $_\n"; + } + } + print OUT "\n"; # stuff last line into sendmail + close(IN); + close(OUT); + &parseaddress ("/tmp/csm$$", "\n`From' address header transformations for mailer $i [$rules]:\n"); + } +} + +foreach $i (keys %themailers) +{ + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + open (OUT, $sendmailprog); + if ($dorspath & 1) { $rspath = "\$g: "; } + + # if the binary is 8.9 or below then check if the mailer + # specific ruleset exists + if ( $binver <= 9 ) { + # if the binary is less than 8.7 then use result of ruleset 0 + if ($esendrules{$i} == 0) { + print "\nCan't find send rule for `$i', skipping this mailer <-------------------\n"; + next; + } + } + # sendmail 5 automatically runs ruleset 3 + if ( $binver == 5 ) { + $rules = "1,4,3,1,$hsendrules{$i},4"; # XXX esendrules? book p. 431??? + } else { + $rules = "3,1,4,3,1,$hsendrules{$i},4"; # XXX esendrules? book p. 431??? + } + open (IN, $resolve); + while (<IN>) { + chop; + /^$/ && next; + /^#/ && next; + $address = $_; + print OUT "$rules $address\n"; + } + print OUT "\n"; # stuff last line into sendmail + close(IN); + close(OUT); + $note = ""; + if ($esendrules{$i} eq $hsendrles{$i}) {$note = "and header ";} + &parseaddress ("/tmp/csm$$", "\n\$g address transformations for mailer $i [$rules]:\n"); +} + +unlink("/tmp/csm$$") || die "Can't unlink /tmp/csm$$"; +unlink("/tmp/csm.in$$"); + +exit; diff --git a/debian/examples/checksendmail/checksendmail-BSDI.patch b/debian/examples/checksendmail/checksendmail-BSDI.patch new file mode 100644 index 0000000..35b4b2e --- /dev/null +++ b/debian/examples/checksendmail/checksendmail-BSDI.patch @@ -0,0 +1,1240 @@ +diff -c 'BSDI/checksendmail.perl' 'checksendmail' +Index: ./BSDI/checksendmail.perl +Prereq: 1.1.1.1 +*** ./BSDI/checksendmail.perl Mon Jan 15 12:49:25 2001 +--- ./checksendmail Mon Apr 14 15:57:56 2003 +*************** +*** 4,45 **** + + # checksendmail + # +! # The checksendmail program is a perl script that aids the testing + # of sendmail's various configuration filse. checksendmail + # passes typical addresses (supplied in input files) through + # sendmail and prints the result of the resolution and + # transformation routines. + # + # Gene Kim & Rob Kolstad & Jeff Polk, 7/11/90 + +! # -- -C config file + # -- -r resolve_addresses_file + # -- -T test one address +- # -- -b sendmail binary +- +- # XXX deficiencies: ``/etc/sendmail'' should be a parameter + + # defaults: + $resolve = "address.resolve"; +! $cffile = "/etc/sendmail.cf"; +! $sendmail = "/usr/sbin/sendmail"; + + sub usage { +! die "Usage: checksendmail [-C cffile.cf] [-r resolve_addrs_file [-T one\@test.addr\n"; + } + + for (unshift (@ARGV, "XX"); $#ARGV > 0; shift ARGV) { + if ($ARGV[1] eq "-C") + { + shift @ARGV; + if ($#ARGV >= 1) {$cffile = $ARGV[1]; } +! else { &usage(); } + } + elsif ($ARGV[1] eq "-r") + { + if ($setfile & 1) { die "Can only set `resolve' once"; } + shift @ARGV; +! if ($#ARGV < 1) { &usage(); } + $resolve = $ARGV[1]; + $setfile += 1; + } +--- 4,62 ---- + + # checksendmail + # +! # The checksendmail program is a perl script that aids the testing + # of sendmail's various configuration filse. checksendmail + # passes typical addresses (supplied in input files) through + # sendmail and prints the result of the resolution and + # transformation routines. + # + # Gene Kim & Rob Kolstad & Jeff Polk, 7/11/90 ++ # Modified by Robert Harker, 11/14/00 + +! # -- -a show aliasing of local addresses +! # -- -d preceed each line with ruleset sequence summary +! # -- -C config_file +! # -- -b sendmail_binary +! # -- -l log_file of results of tests + # -- -r resolve_addresses_file + # -- -T test one address + + # defaults: + $resolve = "address.resolve"; +! $cffile = "/etc/mail/sendmail.cf"; +! +! # Pre-create tmp files (so can use safely) +! use Fcntl; +! foreach ("/tmp/csm$$", "/tmp/csm.in$$") { +! die "Can't pre-create $_" +! unless sysopen(T,$_,O_RDWR|O_CREAT|O_EXCL,0600) +! and close(T); +! }; + + sub usage { +! die "Usage: checksendmail [-C cffile.cf] [-b sendmail_binary] [-l log_file]\n\t\t\t\t[-a] [-d] [-r resolve_addrs_file || -T one\@test.addr]\n$errormsg\n"; + } + + for (unshift (@ARGV, "XX"); $#ARGV > 0; shift ARGV) { + if ($ARGV[1] eq "-C") + { ++ if ($setcffile & 1) { die "Can only set `cffile.cf' once"; } + shift @ARGV; + if ($#ARGV >= 1) {$cffile = $ARGV[1]; } +! else { +! $errormsg = "No sendmail.cf file given for -C flag\n"; +! &usage(); +! } +! $setcffile += 1; + } + elsif ($ARGV[1] eq "-r") + { + if ($setfile & 1) { die "Can only set `resolve' once"; } + shift @ARGV; +! if ($#ARGV < 1) { +! $errormsg = "No resolve_addrs_file given for -r flag\n"; +! &usage(); +! } + $resolve = $ARGV[1]; + $setfile += 1; + } +*************** +*** 47,53 **** + { + if ($setfile) { die "Can't set other files and use -T"; } + shift @ARGV; +! if ($#ARGV < 1) { &usage(); } + open (OUT, ">/tmp/csm.in$$") || + die "Can't open >/tmp/csm.in$$"; + $resolve = "/tmp/csm.in$$"; +--- 64,73 ---- + { + if ($setfile) { die "Can't set other files and use -T"; } + shift @ARGV; +! if ($#ARGV < 1) { +! $errormsg = "No one\@test.addr given for -T flag\n"; +! &usage(); +! } + open (OUT, ">/tmp/csm.in$$") || + die "Can't open >/tmp/csm.in$$"; + $resolve = "/tmp/csm.in$$"; +*************** +*** 57,91 **** + } + elsif ($ARGV[1] eq "-b") + { + shift @ARGV; + if ($#ARGV >= 1) {$sendmail = $ARGV[1]; } +! else { &usage(); } + } + else { &usage(); } + } + + if (!-e $cffile) { die "Can't find configuration file $cffile\n"; } + if (!-e $resolve) { die "Can't find name file $resolve\n"; } + +! # make sure the user can access the ../mqueue directory + +! $maildir = `grep ^OQ $cffile`; +! chop $maildir; +! $maildir =~ s/^OQ//; + if ((!-r $maildir) || (!-x $maildir) || (!-w $maildir)) { +! warn "checksendmail: can't access $maildir! trying anyway...\n"; + } + + chop($hostname = `hostname`); + chop($pwd = `pwd`); + print "system: $hostname\t\tcurrent dir: $pwd\n"; +! print "config file: $cffile\t\tresolve file: $resolve\n"; + + sub handler { # 1st argument is signal name + local($sig) = @_; + print STDERR "Caught a SIG$sig--shutting down\n"; + unlink("/tmp/csm$$") || die "Can't unlink /tmp/csm$$"; + unlink("/tmp/csm.in$$"); + exit(0); + } + +--- 77,215 ---- + } + elsif ($ARGV[1] eq "-b") + { ++ if ($setbin & 1) { die "Can only set `sendmail_binary' once"; } + shift @ARGV; + if ($#ARGV >= 1) {$sendmail = $ARGV[1]; } +! else { +! $errormsg = "No sendmail_binary file given for -b flag\n"; +! &usage(); +! } +! $setbin += 1; +! } +! elsif ($ARGV[1] eq "-l") +! { +! if ($setlog & 1) { die "Can only set `log_file' once"; } +! shift @ARGV; +! if ($#ARGV >= 1) {$logfile = $ARGV[1]; } +! else { +! $errormsg = "No log_file file given for -l flag\n"; +! &usage(); +! } +! $setlog += 1; +! } +! elsif ($ARGV[1] eq "-a") +! { +! $doaliasing += 1; +! } +! elsif ($ARGV[1] eq "-d") +! { +! $dorspath += 1; + } + else { &usage(); } + } + ++ # Figure out where the sendmail binary is ++ if (! $setbin & 1) { ++ foreach $i ("/usr/sbin/sendmail", "/usr/libexec/sendmail", "/usr/lib/sendmail") ++ { ++ # test if binary exists and is executable ++ if ((-e $i) && (-x $i)) { ++ $sendmail = $i; ++ last; ++ } ++ } ++ } ++ ++ ++ # Figure out the version of sendmail and the location of the sendmail.cf file ++ # sendmail -d0.10 -bv root ++ # ("-bv root" is just to give sendmail something to chew on) ++ ++ $binversion = `$sendmail -d0.10 -bv root | grep "^Version "`; ++ chop $binversion; ++ $binversion =~ s/^Version //; ++ ++ # Get the major relase number from the sendmail version ++ $binver = $binversion; ++ $binver =~ s/^8\.//; ++ $binver =~ s/\..+//; ++ ++ # if the cf file was not set on the command line, ++ # find out where the binary looks for it ++ if ( ! -e $cffile ) { ++ $cffile = `$sendmail -d0.10 -bv root | grep "Def Conf file:"`; ++ chop $cffile; ++ $cffile =~ s/ //g; ++ $cffile =~ s/ //g; ++ $cffile =~ s/^DefConffile://; ++ } ++ + if (!-e $cffile) { die "Can't find configuration file $cffile\n"; } ++ + if (!-e $resolve) { die "Can't find name file $resolve\n"; } + +! # Figure out the version of the sendmail.cf file +! # Look for the V line +! $cfversion = `grep "^V" $cffile`; +! chop $cfversion; +! # if $cfversion is empty, then the configuration is sendmail 5, not sendmail 8 +! $cfversion =~ s/^$/V0/; +! +! # Get the version number from the V line +! $cfver = $cfversion; +! $cfver =~ s/^V//; +! $cfver =~ s'/.+''; +! +! # check that the binary is a higher version than config file +! if ( $binver < $cfver + 1) { +! die "$cffile version ($cfversion) is more advanced than $sendmail version ($binversion)\n"; +! } +! +! # figure out where the mqueue directory is +! if ( $cfver <= 6 ) { +! $maildir = `grep "^OQ" $cffile`; +! chop $maildir; +! $maildir =~ s/^OQ//; +! } else { +! $maildir = `grep "^O QueueDirectory" $cffile`; +! chop $maildir; +! $maildir =~ s/^O QueueDirectory=//; +! } + +! # make sure the user can access the ../mqueue directory + if ((!-r $maildir) || (!-x $maildir) || (!-w $maildir)) { +! if ($doaliasing & 1) { +! die "checksendmail: can't access $maildir! can't use checksendmail's -a flag\n"; +! } else { +! warn "checksendmail: can't access $maildir! trying anyway...\n"; +! } + } + + chop($hostname = `hostname`); + chop($pwd = `pwd`); + print "system: $hostname\t\tcurrent dir: $pwd\n"; +! print "resolve file: $resolve\n"; +! print "sendmail binary: $sendmail\t\tsendmail version: $binversion\n"; +! print "config file: $cffile\t\tconfig file version: $cfversion\n\n"; +! if ($setlog & 1) { +! print "log file: $logfile\n\n"; +! # now print to the log file +! open (LOG , ">$logfile") || die "Can't open >$logfile"; +! print LOG "system: $hostname\t\tcurrent dir: $pwd\n"; +! print LOG "resolve file: $resolve\n"; +! print LOG "sendmail binary: $sendmail\t\tsendmail version: $binversion\n"; +! print LOG "config file: $cffile\t\tconfig file version: $cfversion\n"; +! print LOG "log file: $logfile\n\n"; +! } + + sub handler { # 1st argument is signal name + local($sig) = @_; + print STDERR "Caught a SIG$sig--shutting down\n"; + unlink("/tmp/csm$$") || die "Can't unlink /tmp/csm$$"; + unlink("/tmp/csm.in$$"); ++ if ($setlog & 1) { ++ close(LOG); ++ } + exit(0); + } + +*************** +*** 93,157 **** + $SIG{'QUIT'} = 'handler'; + + + # glean the mailers used from the rule 0 tests + + sub parseresolve + { + while (<MAIL>) + { +! if (/^ADDRESS TEST MODE/) { next; } +! if (/^Enter <ruleset>/) { next; } +! if (/^>/) # INPUT LINE! (and last output is done) +! { +! chop; +! if ($prevline) { # OUTPUT LINE! + &printparseresolve; +! } +! s/> *[0-9,]* *//g; +! s/.*input: *//; +! s/ //g; +! s/"//g; +! $input = $_; +! } +! else { chop; } +! $prevline = $_; + } +! &printparseresolve; + } + + sub printparseresolve { +! $prevline =~ s/.*returns: *//; +! $prevline =~ s/"//g; +! $prevline =~ s/ //g; +! # Don't strip spaces off error messages +! $prevline =~ s/ *([.!%<>]) */$1/g; +! $prevline =~ s/ +([;?\$])/$1/g; +! $prevline =~ s/([#\@:]) +/$1/g; + + # non-Sun test mode delimiters -> easily-readable style + # Mark Sausville, MIT Media Laboratory, saus@media-lab.media.mit.edu +! $prevline =~ s/\^V/\$#/; +! $prevline =~ s/\^W/\$@/; +! $prevline =~ s/\^X/\$:/; +! +! #### $#ether$@sun-barr.Ebay.Sun.COM$:site!user@uunet.uu.NET +! @t = split( '\$', $prevline); +! $address = "XXX"; +! $remote = "XXX"; +! $mailer = "XXX"; +! for ($i = 1; $i <= $#t; $i++) +! { +! if (substr($t[$i], 0, 1) eq ":") +! { $address = substr($t[$i], 1,999); } +! if (substr($t[$i], 0, 1) eq "@") +! { $remote = substr($t[$i], 1,999); } +! if (substr($t[$i], 0, 1) eq "#") +! { $mailer = substr($t[$i], 1,999); +! $mailer =~ tr/A-Z/a-z/; } +! } +! printf("%-27.27s --(%-6.6s)--> %s[%s]\n", $input, $mailer, +! $address, $remote); +! if ($mailer ne "XXX") { $themailers{$mailer}.="$input ";} + } + + # Parse output of sendmail name resolution +--- 217,426 ---- + $SIG{'QUIT'} = 'handler'; + + ++ + # glean the mailers used from the rule 0 tests + + sub parseresolve + { + while (<MAIL>) + { +! # now print to the log file +! if ($setlog & 1) { +! print LOG $_; +! } +! if (/^ADDRESS TEST MODE/) { next; } +! if (/^Enter <ruleset>/) { next; } +! if (/^Warning: .cf file is out of date/) { next; } +! +! # if the binary is less than 8.7 then use result of ruleset 0 +! if ( $binver <= 6 ) { +! if (/^>/) # INPUT LINE! (and last output is done) +! { +! chop; +! if ($prevline) { # OUTPUT LINE! +! &printparseresolve; +! } +! s/> *[0-9,]* *//g; +! s/.*input: *//; +! s/ //g; +! s/"//g; +! $input = $_; +! } +! else { chop; } +! $prevline = $_; +! } else { +! # format of /parse output is: +! # Parsing envelope recipient address +! # rewrite: ruleset 3 input: harker @ harker . com +! if ($prevrule eq "Parsing envelope recipient address\n" ) +! { +! chop; +! s/> *[0-9,]* *//g; +! s/.*input: *//; +! s/ //g; +! s/"//g; +! $input = $_; +! $prevrule = $_; +! } +! elsif (/^mailer /) +! { +! $prevrule = $_; + &printparseresolve; +! } +! else +! { +! $prevrule = $_; +! } +! } + } +! #&printparseresolve; + } + + sub printparseresolve { +! # if the binary is less than 8.7 then use result of ruleset 0 +! if ( $binver <= 6 ) { +! if ($input eq "") { return;} +! +! $prevline =~ s/.*returns: *//; +! $prevline =~ s/"//g; +! $prevline =~ s/ //g; +! # Don't strip spaces off error messages +! $prevline =~ s/ *([.!%<>]) */$1/g; +! $prevline =~ s/ +([;?\$])/$1/g; +! $prevline =~ s/([#\@:]) +/$1/g; + + # non-Sun test mode delimiters -> easily-readable style + # Mark Sausville, MIT Media Laboratory, saus@media-lab.media.mit.edu +! $prevline =~ s/\^V/\$#/; +! $prevline =~ s/\^W/\$@/; +! $prevline =~ s/\^X/\$:/; +! +! #### $#ether$@sun-barr.Ebay.Sun.COM$:site!user@uunet.uu.NET +! @t = split( '\$', $prevline); +! $address = "XXX"; +! $remote = "XXX"; +! $mailer = "XXX"; +! for ($i = 1; $i <= $#t; $i++) +! { +! if (substr($t[$i], 0, 1) eq ":") +! { $address = substr($t[$i], 1,999); } +! if (substr($t[$i], 0, 1) eq "@") +! { $remote = substr($t[$i], 1,999); } +! if (substr($t[$i], 0, 1) eq "#") +! { $mailer = substr($t[$i], 1,999); +! $mailer =~ tr/A-Z/a-z/; } +! } +! } else { +! # the binary is at least 8.7 then use result of /parse +! chop; +! s/,//g; +! +! # mailer esmtp, host harker.com., user harker@harker.com +! @t = split( ' ', $_); +! $address = "XXX"; +! $remote = "XXX"; +! $mailer = "XXX"; +! for ($i = 0; $i <= $#t; $i++) +! { +! if ($t[$i] eq "user") +! { $address = $t[++$i]; } +! if ($t[$i] eq "host") +! { $remote = $t[++$i]; } +! if ($t[$i] eq "mailer") +! { $mailer = $t[++$i]; +! $mailer =~ tr/A-Z/a-z/; } +! } +! } +! printf("%-27.27s --(%-6.6s)--> %s[%s]\n", $input, $mailer, +! $address, $remote); +! # now print to the log file +! if ($setlog & 1) { +! printf LOG ("%-27.27s --(%-6.6s)--> %s[%s]\n\n", $input, $mailer, +! $address, $remote); +! } +! +! if ($doaliasing & 1) { +! # If the address resolved to the local mailer, +! # then expand the username as an alias +! if ( $mailer eq "local") +! { +! $setalias = $aliasfound = 0; +! $laddress = $address; +! $sendmailprog = "$sendmail -bv -C$cffile $laddress|"; +! open(LOCAL, $sendmailprog) || +! die "can't exec $sendmailprog...\n"; +! # now print to the log file +! if ($setlog & 1) { +! print LOG "\n$sendmailprog\n"; +! } +! while (<LOCAL>) +! { +! # now print to the log file +! if ($setlog & 1) { +! print LOG $_; +! } +! chop; +! if (/unknown/) +! { +! $aliasfound = 1; +! printf("\t\t aliased to --(error )--> %s\n", $_); +! # now print to the log file +! if ($setlog & 1) { +! printf LOG ("\t\t aliased to --(error )--> %s\n\n", $_); +! } +! next; +! } +! s/,//g; +! @l = split( ' ', $_); +! $aladdress = "XXX"; +! $remote = "XXX"; +! $mailer = "XXX"; +! for ($i = 1; $i <= $#l; $i++) +! { +! # ./sendmail -bv -C./sendmail.cf j.murphy +! # j.murphy@pop.mcit.com... deliverable: mailer mciesmtp, +! # host pop.mcit.com, user j.murphy@pop.mcit.com +! if ($l[$i] eq "user") { $aladdress = $l[++$i]; } +! if ($l[$i] eq "host") { $remote = $l[++$i]; } +! if ($l[$i] eq "mailer") { $mailer = $l[++$i]; } +! } +! if (("$laddress" eq "$aladdress") && ($aliasfound == 0)) { +! $selfalias = 1; +! next; +! } +! printf("\t\t aliased to --(%-6.6s)--> %s[%s]\n", +! $mailer, $aladdress, $remote); +! # now print to the log file +! if ($setlog & 1) { +! printf LOG ("\t\t aliased to --(%-6.6s)--> %s[%s]\n\n", +! $mailer, $aladdress, $remote); +! } +! if ("$laddress" ne "$aladdress") { +! $aliasfound = 1; +! $envsenderaddrs .= " $aladdress"; +! } +! if ($mailer ne "XXX") { $themailers{$mailer}=1;} +! } +! close(LOCAL); +! if ($selfalias == 1 && $aliasfound == 1) { +! printf("\t\t aliased to --(%-6.6s)--> %s[%s]\n", +! $mailer, $aladdress, $remote); +! # now print to the log file +! if ($setlog & 1) { +! printf LOG ("\t\t aliased to --(%-6.6s)--> %s[%s]\n\n", +! $mailer, $aladdress, $remote); +! } +! } +! # now print a blank line to the log file +! if ($setlog & 1) { +! print LOG "\n"; +! } +! } else { +! $envsenderaddrs .= " $address"; +! } +! } +! +! if ($mailer ne "XXX") { $themailers{$mailer}.="$input ";} + } + + # Parse output of sendmail name resolution +*************** +*** 162,202 **** + ## Enter <ruleset> <address> + ## > rewrite: ruleset 3 input: "user" + +! open(MAIL, $_[0]) || die "Can't open $_[0]...\n"; +! local ($k, $address, $prevline, $mailer, $remote, $input); +! print $_[1]; # the title + + $done = 0; +! while (<MAIL>) +! { + if (/^> *$/) { $done = 1; } +! if (/^ADDRESS TEST MODE/) { next; } +! if (/^Enter <ruleset>/) { next; } +! chop; +! if (/^>/) # INPUT LINE! (and last output is done) +! { +! if ($prevline) { # OUTPUT LINE! +! $prevline =~ s/.*returns: *//; +! $prevline =~ s/"//g; +! $prevline =~ s/ //g; + #> rewrite: ruleset 3 input: "site" "!" "user" "@" "uunet" "." "uu" "." "net" + #rewrite: ruleset 8 input: "site" "!" "user" "@" "uunet" "." "uu" "." "net" + #> +! printf("%-27.27s ----> %s\n", $input, $prevline); +! } +! s/> *[0-9,]* *//g; +! s/.*input: *//; +! s/ //g; +! s/"//g; +! $input = $_; +! } +! last if $done; +! $prevline = $_; +! } + close(MAIL); + } + + + # pass names from resolve files to sendmail + + open(IN, $resolve) || die "can't open $resolve\n"; +--- 431,540 ---- + ## Enter <ruleset> <address> + ## > rewrite: ruleset 3 input: "user" + +! open(MAIL, $_[0]) || die "Can't open $_[0]...\n"; +! local ($k, $address, $prevline, $mailer, $remote, $input); +! print $_[1]; # the title +! # now print to the log file +! if ($setlog & 1) { +! print LOG "\n$_[1]"; # the title +! } + + $done = 0; +! while (<MAIL>) +! { +! # now print to the log file +! if ($setlog & 1) { +! print LOG $_; +! } + if (/^> *$/) { $done = 1; } +! if (/^ADDRESS TEST MODE/) { next; } +! if (/^Enter <ruleset>/) { next; } +! if (/^Warning: .cf file is out of date/) { next; } +! if (/^$/) { next; } +! chop; +! # rewrite $rules to be just a slash if it starts with a / +! $rules =~ s'/.+'/'; +! # if the binary is less than 8.7 then use result of ruleset 4 +! if ( $binver <= 6 || $rules ne "/" ) { +! if (/^>/) # INPUT LINE! (and last output is done) +! { +! if ($prevline) { # OUTPUT LINE! +! $prevline =~ s/.*returns: *//; +! $prevline =~ s/"//g; +! $prevline =~ s/ //g; + #> rewrite: ruleset 3 input: "site" "!" "user" "@" "uunet" "." "uu" "." "net" + #rewrite: ruleset 8 input: "site" "!" "user" "@" "uunet" "." "uu" "." "net" + #> +! printf("%s%-24.24s ----> %s\n", $rspath, $input, $prevline); +! # now print to the log file +! if ($setlog & 1) { +! printf LOG ("%s%-24.24s ----> %s\n", $rspath, $input, $prevline); +! } +! } +! s/> *[0-9,]* *//g; +! s/.*input: *//; +! s/ //g; +! s/"//g; +! $input = $_; +! } +! last if $done; +! $prevline = $_; +! } else { +! # format of /try output is: +! # Trying envelope recipient address harker for mailer esmtp +! # ... +! # Rcode = 0, addr = harker@mailhub.gadget.com +! # remove extra ">" from "> >" lines +! s/^> >/>/; +! if (/^> Trying/) # INPUT LINE! (and last output is done) +! { +! chop; +! s/> Trying .+ address //; +! s/ for mailer .+//; +! s/ //g; +! s/"//g; +! $input = $_; +! $prevrule = $_; +! } +! elsif (/^Rcode = /) +! { +! $prevrule = $_; +! # Rcode = 0, addr = harker@mailhub.gadget.com +! s/^Rcode = .+ addr = //; +! printf("%s%-24.24s ----> %s\n", $rspath, $input, $_); +! # now print to the log file +! if ($setlog & 1) { +! printf LOG ("%s%-24.24s ----> %s\n\n", $rspath, $input, $_); +! } +! } +! else +! { +! $prevrule = $_; +! } +! } +! } +! # now print to the log file +! if ($setlog & 1) { +! print LOG "\n"; +! } + close(MAIL); + } + + ++ # if the binary is less than 8.7 then use result of ruleset 4 ++ if ( $binver <= 6 ) { ++ print "Mail address resolution (rule 0)\n"; ++ # now print to the log file ++ if ($setlog & 1) { ++ print LOG "Mail address resolution (rule 0)\n"; ++ } ++ } else { ++ print "Mail address resolution (/parse)\n"; ++ # now print to the log file ++ if ($setlog & 1) { ++ print LOG "Mail address resolution (/parse)\n"; ++ } ++ } + # pass names from resolve files to sendmail + + open(IN, $resolve) || die "can't open $resolve\n"; +*************** +*** 205,377 **** + { + /^$/ && next; + /^#/ && next; +! print OUT "3,0 $_"; + chop; + $allinput .= " $_"; + } + close(OUT); + close(IN); + $sendmailprog = "$sendmail -bt -C$cffile < /tmp/csm$$|"; + open(MAIL, $sendmailprog) || die "can't exec $sendmailprog...\n"; +- print "Mail address resolution (rule 0)\n\n"; + &parseresolve(); + + # calculate $f + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + open (OUT, $sendmailprog); + open (IN, $resolve); +! $rules = "3,1,4"; + while (<IN>) { +! chop; +! /^$/ && next; +! /^#/ && next; + $address = $_; +! print OUT "$rules $address\n"; + } + print OUT "\n"; # stuff last line into sendmail + close(IN); + close(OUT); +! &parseaddress ("/tmp/csm$$", "\n\n\$f address header transformations\n\n"); + + # Get the R= and S= special rulesets from the configuration + + open(FID, "grep ^M $cffile|"); + while (<FID>) + { + # Mether, P=[IPC], F=msDFMueCX, S=11, R=21, A=IPC $h + chop; +! $thisline = $_; $thisline =~ s/M//; $thisline =~ s/,.*//; + $thisline =~ tr/A-Z/a-z/; +! $sendrule = $_; $sendrule =~ s/.*S=//; $sendrule =~ s/,.*//; +! if ($sendrule=~q!/!) { +! ($esendrule, $hsendrule) = split (q!/!, $sendrule); +! } +! else { $esendrule = $hsendrule = $sendrule; } +! $recvrule = $_; $recvrule =~ s/.*R=//; $recvrule =~ s/,.*//; +! if ($recvrule=~q!/!) { +! ($erecvrule, $hrecvrule) = split (q!/!, $recvrule); +! } +! else { $erecvrule = $hrecvrule = $recvrule; } + $esendrules{$thisline} = $esendrule; + $hsendrules{$thisline} = $hsendrule; + $erecvrules{$thisline} = $erecvrule; + $hrecvrules{$thisline} = $hrecvrule; + } + close(FID); + +! # pass names from various mailers through sendmail +! + foreach $i (keys %themailers) + { + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; +! if ($erecvrules{$i} == 0) { +! print "\n\nCan't find recv rule for `$i', skipping this mailer <-------------------\n"; + next; + } +- open (OUT, $sendmailprog); + @namelist = split(/ /, $allinput); +- $rules = "3,2,$erecvrules{$i},4"; + foreach (@namelist) { +! print OUT "$rules $_\n"; + } + print OUT "\n"; # stuff last line into sendmail + close(OUT); + $note = ""; + if ($erecvrules{$i} eq $hrecvrules{$i}) { $note = "and header "; } +! &parseaddress ("/tmp/csm$$", "\n\n`To' envelope ${note}address transformations for mailer $i [$rules]:\n\n"); + } + foreach $i (keys %themailers) + { + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; +! if ($hrecvrules{$i} == 0) { +! print "\n\nCan't find recv rule for `$i', skipping this mailer <-------------------\n"; +! next; +! } + if ($hrecvrules{$i} ne $erecvrules{$i}) { +! open (OUT, $sendmailprog); +! @namelist = split(/ /, $allinput); +! $rules = "3,2,$hrecvrules{$i},4"; +! foreach (@namelist) { +! print OUT "$rules $_\n"; +! } +! print OUT "\n"; # stuff last line into sendmail +! close(OUT); +! &parseaddress ("/tmp/csm$$", "\n\n`To' header address transformations for mailer $i [$rules]:\n\n"); + } + } + +! # pass names from various mailers through sendmail + foreach $i (keys %themailers) + { + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; +! if ($esendrules{$i} == 0) { +! print "\n\nCan't find send rule for `$i', skipping this mailer <-------------------\n"; + next; + } +- open (OUT, $sendmailprog); +- open (IN, $resolve); +- $rules = "3,1,$esendrules{$i},4"; +- while (<IN>) { +- chop; +- /^$/ && next; +- /^#/ && next; +- $address = $_; +- print OUT "$rules $address\n"; + } + print OUT "\n"; # stuff last line into sendmail + close(IN); + close(OUT); + $note = ""; + if ($esendrules{$i} eq $hsendrles{$i}) {$note = "and header ";} +! &parseaddress ("/tmp/csm$$", "\n\n`From' envelope ${note}address transformations for mailer $i [$rules]:\n\n"); + } + foreach $i (keys %themailers) + { + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; +- if ($hsendrules{$i} == 0) { +- print "\n\nCan't find send rule for `$i', skipping this mailer <-------------------\n"; +- next; +- } + open (OUT, $sendmailprog); +! open (IN, $resolve); +! $rules = "3,1,$hsendrules{$i},4"; +! while (<IN>) { +! chop; +! /^$/ && next; +! /^#/ && next; +! $address = $_; +! print OUT "$rules $address\n"; + } +- print OUT "\n"; # stuff last line into sendmail +- close(IN); +- close(OUT); +- &parseaddress ("/tmp/csm$$", "\n\n`From' address header transformations for mailer $i [$rules]:\n\n"); + } + foreach $i (keys %themailers) + { + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; +! if ($esendrules{$i} == 0) { +! print "\n\nCan't find send rule for `$i', skipping this mailer <-------------------\n"; + next; + } +- open (OUT, $sendmailprog); + open (IN, $resolve); +- $rules = "3,1,4,3,1,$hsendrules{$i},4"; # XXX esendrules? book p. 431??? + while (<IN>) { +! chop; +! /^$/ && next; +! /^#/ && next; + $address = $_; +! print OUT "$rules $address\n"; + } + print OUT "\n"; # stuff last line into sendmail + close(IN); + close(OUT); + $note = ""; + if ($esendrules{$i} eq $hsendrles{$i}) {$note = "and header ";} +! &parseaddress ("/tmp/csm$$", "\n\n\$g address transformations for mailer $i [$rules]:\n\n"); + } + + unlink("/tmp/csm$$") || die "Can't unlink /tmp/csm$$"; + unlink("/tmp/csm.in$$"); + +--- 543,868 ---- + { + /^$/ && next; + /^#/ && next; +! # if the binary is less than 8.7 then use result of ruleset 0 +! if ( $binver == 5 ) { +! $rules = "0 $_"; +! } elsif ( $binver <= 6 ) { +! $rules = "3,0 $_"; +! } else { +! $rules = "/parse $_"; +! } +! print OUT $rules; +! # now print to the log file +! if ($setlog & 1) { +! print LOG "$rules"; +! } + chop; + $allinput .= " $_"; + } ++ $allinput =~ s/^ //; + close(OUT); + close(IN); + $sendmailprog = "$sendmail -bt -C$cffile < /tmp/csm$$|"; + open(MAIL, $sendmailprog) || die "can't exec $sendmailprog...\n"; + &parseresolve(); + + # calculate $f + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + open (OUT, $sendmailprog); + open (IN, $resolve); +! # sendmail 5 automatically runs ruleset 3 +! if ( $binver == 5 ) { +! $rules = "1,4"; +! } else { +! $rules = "3,1,4"; +! } +! if ($dorspath & 1) { $rspath = "\$f: "; } +! + while (<IN>) { +! chop; +! /^$/ && next; +! /^#/ && next; + $address = $_; +! print OUT "$rules $address\n"; +! # now print to the log file +! if ($setlog & 1) { +! print LOG "$rules $address\n"; +! } + } + print OUT "\n"; # stuff last line into sendmail ++ # now print to the log file ++ if ($setlog & 1) { ++ print LOG "\n"; # stuff last line into sendmail ++ } + close(IN); + close(OUT); +! &parseaddress ("/tmp/csm$$", "\n\$f address header transformations\n"); + + # Get the R= and S= special rulesets from the configuration ++ # now print to the log file ++ if ($setlog & 1) { ++ print LOG "\nGet the R= and S= mailer specific rulesets\n"; ++ } + + open(FID, "grep ^M $cffile|"); + while (<FID>) + { + # Mether, P=[IPC], F=msDFMueCX, S=11, R=21, A=IPC $h + chop; +! $thisline = $_; +! $thisline =~ s/M//; +! $thisline =~ s/,.*//; + $thisline =~ tr/A-Z/a-z/; +! $sendrule = $_; +! $sendrule =~ s/.*S=//; +! $sendrule =~ s/,.*//; +! if ($sendrule=~q!/!) { +! ($esendrule, $hsendrule) = split (q!/!, $sendrule); +! } else { +! $esendrule = $hsendrule = $sendrule; +! } +! $recvrule = $_; +! $recvrule =~ s/.*R=//; +! $recvrule =~ s/,.*//; +! if ($recvrule=~q!/!) { +! ($erecvrule, $hrecvrule) = split (q!/!, $recvrule); +! } else { +! $erecvrule = $hrecvrule = $recvrule; +! } + $esendrules{$thisline} = $esendrule; + $hsendrules{$thisline} = $hsendrule; + $erecvrules{$thisline} = $erecvrule; + $hrecvrules{$thisline} = $hrecvrule; ++ # now print to the log file ++ if ($setlog & 1) { ++ print LOG "mailer: $thisline\t->\tesendrule = $esendrule, hsendrule = $hsendrule, ++ erecvrule = $erecvrule, hrecvrule = $hrecvrule\n"; ++ } ++ } ++ # now print to the log file ++ if ($setlog & 1) { ++ print LOG "\n"; + } + close(FID); + +! # pass envelope recipient names from various mailers through sendmail + foreach $i (keys %themailers) + { + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; +! open (OUT, $sendmailprog); +! if ($dorspath & 1) { $rspath = "$i ER: "; } +! +! # if the binary is less than 8.7 then use result of ruleset 0 +! if ( $binver <= 6 ) { +! if ($erecvrules{$i} == 0) { +! print "\nCan't find recv rule for `$i', skipping this mailer <-------------------\n"; + next; ++ } ++ # sendmail 5 automatically runs ruleset 3 ++ if ( $binver == 5 ) { ++ $rules = "2,$erecvrules{$i},4"; ++ } else { ++ $rules = "3,2,$erecvrules{$i},4"; ++ } ++ } else { ++ print OUT "/tryflags ER\n"; ++ # now print to the log file ++ if ($setlog & 1) { ++ print LOG "/tryflags ER\n"; ++ } ++ $rules = "/try $i"; + } + @namelist = split(/ /, $allinput); + foreach (@namelist) { +! print OUT "$rules $_\n"; +! # now print to the log file +! if ($setlog & 1) { +! print LOG "$rules $_\n"; +! } + } + print OUT "\n"; # stuff last line into sendmail ++ # now print to the log file ++ if ($setlog & 1) { ++ print LOG "\n"; # stuff last line into the log ++ } + close(OUT); + $note = ""; + if ($erecvrules{$i} eq $hrecvrules{$i}) { $note = "and header "; } +! &parseaddress ("/tmp/csm$$", "\n`To' envelope ${note}address transformations for mailer $i [$rules]:\n"); + } ++ ++ # pass header recipient names from various mailers through sendmail + foreach $i (keys %themailers) + { + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; +! open (OUT, $sendmailprog); +! if ($dorspath & 1) { $rspath = "$i HR: "; } +! +! # only run the header ruleset if the mailer uses split env/hdr rulesets + if ($hrecvrules{$i} ne $erecvrules{$i}) { +! # if the binary is less than 8.7 then use result of ruleset 0 +! if ( $binver <= 6 ) { +! if ($hrecvrules{$i} == 0) { +! print "\nCan't find recv rule for `$i', skipping this mailer <-------------------\n"; +! next; +! } +! # sendmail 5 automatically runs ruleset 3 +! if ( $binver == 5 ) { +! $rules = "2,$hrecvrules{$i},4"; +! } else { +! $rules = "3,2,$hrecvrules{$i},4"; +! } +! } else { +! print OUT "/tryflags HR\n"; +! # now print to the log file +! if ($setlog & 1) { +! print LOG "/tryflags HR\n"; +! } +! $rules = "/try $i"; +! } +! @namelist = split(/ /, $allinput); +! foreach (@namelist) { +! print OUT "$rules $_\n"; +! # now print to the log file +! if ($setlog & 1) { +! print LOG "$rules $_\n"; +! } +! } +! print OUT "\n"; # stuff last line into sendmail +! # now print to the log file +! if ($setlog & 1) { +! print LOG "\n"; # stuff last line into the log +! } +! close(OUT); +! &parseaddress ("/tmp/csm$$", "\n`To' header address transformations for mailer $i [$rules]:\n"); + } + } + +! # pass envelope sender names from various mailers through sendmail + foreach $i (keys %themailers) + { + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; +! open (OUT, $sendmailprog); +! if ($dorspath & 1) { $rspath = "$i ES: "; } +! +! # if the binary is less than 8.7 then use result of ruleset 0 +! if ( $binver <= 6 ) { +! if ($esendrules{$i} == 0) { +! print "\nCan't find send rule for `$i', skipping this mailer <-------------------\n"; + next; ++ } ++ # sendmail 5 automatically runs ruleset 3 ++ if ( $binver == 5 ) { ++ $rules = "2,$esendrules{$i},4"; ++ } else { ++ $rules = "3,2,$esendrules{$i},4"; ++ } ++ } else { ++ print OUT "/tryflags ES\n"; ++ # now print to the log file ++ if ($setlog & 1) { ++ print LOG "/tryflags ES\n"; ++ } ++ $rules = "/try $i"; ++ } ++ @namelist = split(/ /, $allinput); ++ foreach (@namelist) { ++ print OUT "$rules $_\n"; ++ # now print to the log file ++ if ($setlog & 1) { ++ print LOG "$rules $_\n"; + } + } + print OUT "\n"; # stuff last line into sendmail + close(IN); + close(OUT); + $note = ""; + if ($esendrules{$i} eq $hsendrles{$i}) {$note = "and header ";} +! &parseaddress ("/tmp/csm$$", "\n`From' envelope ${note}address transformations for mailer $i [$rules]:\n"); + } ++ ++ # pass header sender names from various mailers through sendmail + foreach $i (keys %themailers) + { + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + open (OUT, $sendmailprog); +! if ($dorspath & 1) { $rspath = "$i HS: "; } +! +! # only run the header ruleset if the mailer uses split env/hdr rulesets +! if ($hsendrules{$i} ne $esendrules{$i}) { +! # if the binary is less than 8.7 then use result of ruleset 0 +! if ( $binver <= 6 ) { +! if ($hsendrules{$i} == 0) { +! print "\nCan't find send rule for `$i', skipping this mailer <-------------------\n"; +! next; +! } +! # sendmail 5 automatically runs ruleset 3 +! if ( $binver == 5 ) { +! $rules = "2,$hsendrules{$i},4"; +! } else { +! $rules = "3,2,$hsendrules{$i},4"; +! } +! } else { +! print OUT "/tryflags HS\n"; +! # now print to the log file +! if ($setlog & 1) { +! print LOG "/tryflags HR\n"; +! } +! $rules = "/try $i"; +! } +! @namelist = split(/ /, $allinput); +! foreach (@namelist) { +! print OUT "$rules $_\n"; +! # now print to the log file +! if ($setlog & 1) { +! print LOG "$rules $_\n"; +! } +! } +! print OUT "\n"; # stuff last line into sendmail +! close(IN); +! close(OUT); +! &parseaddress ("/tmp/csm$$", "\n`From' address header transformations for mailer $i [$rules]:\n"); + } + } ++ + foreach $i (keys %themailers) + { + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; +! open (OUT, $sendmailprog); +! if ($dorspath & 1) { $rspath = "\$g: "; } +! +! # if the binary is 8.9 or below then check if the mailer +! # specific ruleset exists +! if ( $binver <= 9 ) { +! # if the binary is less than 8.7 then use result of ruleset 0 +! if ($esendrules{$i} == 0) { +! print "\nCan't find send rule for `$i', skipping this mailer <-------------------\n"; + next; ++ } ++ } ++ # sendmail 5 automatically runs ruleset 3 ++ if ( $binver == 5 ) { ++ $rules = "1,4,3,1,$hsendrules{$i},4"; # XXX esendrules? book p. 431??? ++ } else { ++ $rules = "3,1,4,3,1,$hsendrules{$i},4"; # XXX esendrules? book p. 431??? + } + open (IN, $resolve); + while (<IN>) { +! chop; +! /^$/ && next; +! /^#/ && next; + $address = $_; +! print OUT "$rules $address\n"; + } + print OUT "\n"; # stuff last line into sendmail + close(IN); + close(OUT); + $note = ""; + if ($esendrules{$i} eq $hsendrles{$i}) {$note = "and header ";} +! &parseaddress ("/tmp/csm$$", "\n\$g address transformations for mailer $i [$rules]:\n"); + } + + unlink("/tmp/csm$$") || die "Can't unlink /tmp/csm$$"; + unlink("/tmp/csm.in$$"); + ++ exit; diff --git a/debian/examples/checksendmail/checksendmail-harker.patch b/debian/examples/checksendmail/checksendmail-harker.patch new file mode 100644 index 0000000..879e188 --- /dev/null +++ b/debian/examples/checksendmail/checksendmail-harker.patch @@ -0,0 +1,22 @@ +diff -c 'harker/checksendmail' 'checksendmail' +Index: ./harker/checksendmail +Prereq: 1.1.1.1 +*** ./harker/checksendmail Mon Apr 14 15:44:43 2003 +--- ./checksendmail Mon Apr 14 15:57:56 2003 +*************** +*** 25,30 **** +--- 25,38 ---- + $resolve = "address.resolve"; + $cffile = "/etc/mail/sendmail.cf"; + ++ # Pre-create tmp files (so can use safely) ++ use Fcntl; ++ foreach ("/tmp/csm$$", "/tmp/csm.in$$") { ++ die "Can't pre-create $_" ++ unless sysopen(T,$_,O_RDWR|O_CREAT|O_EXCL,0600) ++ and close(T); ++ }; ++ + sub usage { + die "Usage: checksendmail [-C cffile.cf] [-b sendmail_binary] [-l log_file]\n\t\t\t\t[-a] [-d] [-r resolve_addrs_file || -T one\@test.addr]\n$errormsg\n"; + } diff --git a/debian/examples/checksendmail/checksendmail.8 b/debian/examples/checksendmail/checksendmail.8 new file mode 100644 index 0000000..229f229 --- /dev/null +++ b/debian/examples/checksendmail/checksendmail.8 @@ -0,0 +1,246 @@ +.\" BSDI $Id: checksendmail.8,v 1.1.1.1 1994/01/13 21:15:31 polk Exp $ +.Dd November 14, 2000 +.Dt CHECKSENDMAIL 8 +.Os +.Sh NAME +.Nm checksendmail +.Nd verify sendmail address transformations. +.Sh SYNOPSIS +.Nm checksendmail +.Op Fl a +.Op Fl d +.Op Fl b +.Op Fl C Ar file.cf +.Op Fl b Ar sendmail_binary +.Op Fl l Ar log_file +.Op Fl r Ar resolve +.Op Fl T Ar test.address + +.Sh DESCRIPTION +.Pp +The +.Nm checksendmail +program is a +.Xr perl +script that aids the testing of +.Xr sendmail 8 's +various configuration files. +.Nm checksendmail +passes typical addresses (supplied in input files) through +.Xr sendmail +and prints the results of the resolution and transformation routines. +.Pp +The input files contain a list of addresses, one per line. +For example: +.Bd -literal -offset indent +user +user@site +user@site.com +.Ed +.Pp +The input file can contain comments started with a +.Em # +and blank lines. +.Sh OPTIONS +.Pp +.Bl -tag -width Fl -compact -offset left +.It Fl a +Show aliasing of local addresses in +mail address resolution phase of testing +.It Fl d +Preceed each address translation line with ruleset sequence summary +.It Fl C Ar file.cf +Use the +.Xr sendmail +configuration file +.Ar file.cf +instead of the default +.Pa /etc/sendmail.cf +file. +.It Fl b Ar sendmail_binary +Use the specified +.Ar sendmail_binary +as the path to invoke sendmail (instead of +.Pa /usr/sbin/sendmail ) . +.It Fl l Ar log_file +Log +.Xr sendmail +address test mode debugging output to +.Ar log_file +.It Fl r Ar resolve +Use +.Ar resolve +as the input file for the addresses to be used for mail resolving. Defaults +to +.Ar address.resolve . +.It Fl T Ar test.address +Use +.Ar test.address +as the single address to test. Cannot be used in conjunction with +file setting flags. +.El +.Sh EXAMPLES +.Pp +The following command will pass the addresses in +.Ar address.resolve +through +.Xr sendmail +using the configuration information in +.Ar myconfig.cf . +.Bd -literal -offset left +example% cat address.resolve +user +user@site +user@site.com + +example% checksendmail \-C myconfig.cf +system: myhost.gadget.com current dir: /tmp/Checksendmail +resolve file: address.resolve +sendmail binary: /usr/sbin/sendmail sendmail version: 8.9.3 +config file: /etc/sendmail.cf config file version: V8/Berkeley + +Mail address resolution +user --(ether )--> user[rmtc] +user@site --(ether )--> user@site[rmtc] +user@site.com --(ether )--> user@site.com[rmtc] + +`To' address transformations for mailer ether: +user ----> user +user@site ----> user@site +user@site.com ----> user@site.com + +`From' address transformations for mailer ether: +user ----> user +user@site ----> user +user@site.com ----> user +.Ed +.Pp +The first section of the output shows how the addresses in the input +files are resolved by +.Xr sendmail 8 . +Consider the following output line: +.Pp +.Dl user@site.com --(ether )--> user@site.com[rmtc] +.Pp +The input address +.Em user@site.com +resolves to use the +.Em ether +mailer. That mailer is directed to send the mail to +to the user +.Em user@site.com +at site +.Em rmtc +(as indicated in the square brackets). +.Pp +The two later sections of output show how the addresses specified as +the +.Em To +and +.Em From +address are transformed in the text of the +headers. In the example above, the +.Em To +addresses are untouched. +The +.Em From +addresses, however, all lose their machine information on +the way through the mailer: +.Pp +.Dl user@site ----> user +.Pp +This may be desirable when using a configuration file on a +workstation which is to be hidden as a mailhost from the rest of the +network. +.Pp +The following is a set of addresses used at one site for the purposes of +testing address resolution. Comments after the addresses detail why +particular addresses are present: +.Bl -tag -width "user@machine.com" -compact -offset indent +.It user +Standard trivial address +.It user@rmtc +qualified at one level +.It user@rmtc.central +qualified at two levels +.It user@rmtc.central.sun.com +qualified all the way +.It rmtc!user +local but specified as uucp +.It user@summit +a workstation (normally delivered locally, though) +.It user@summit.central +same but more qualified +.It user@summit.central.sun.com +same but fully qualified +.It summit!user +same but specified as uucp +.It user@prisma +Backward compatibility tests +.It user@prisma.com +.It prisma!user +.It user@central +Superior domain testing +.It user@machine.central +more qualified, but unknown +.It user@summit.central +more qualified and known +.It user@eng +name in faraway domain +.It user@machine.eng +unknown machine in faraway domain +.It user@summit.eng +local machine, far away domain +.It user@hoback +far away machine +.It user@machine +apparently local but unknown machine +.It user@sun.com +Standard trivial address +.It user@machine.dom.sun.com +fully qualified but unknown machine +.It user@foo.com +standard, known, really far away domain +.It user@foo.dom +standard, unknown, really far away domain +.It site!user +Single level uucp +.It site1!site2!user +Double level uucp +.It user@foo.dom@bar.dom +Trickier address +.It site!user@foo.dom +Mixed uucp/domain +.It site!user@uunet.uu.net +Mixed double uucp/domain +.El +.Sh NOTES +Note that +.Nm checksendmail +is a +.Xr perl +script. If your site does not have +.Xr perl 1 , +it can be obtained via anonymous +.Xr ftp +from +.Em ftp.uu.net . +.Pp +.Xr sendmail +requires that the user have access to directory specified by the +.Em OQ +parameter in the configuration file (normally +.Pa /usr/spool/mqueue ) . +.Nm checksendmail +verifies that the user has access to this directory before allowing the +test to continue. +.Sh AUTHORS +.Bd -literal +Gene Kim +Rob Kolstad +Jeff Polk +.Ed +.Pp +Modified by Robert Harker +.Sh "SEE ALSO" +.Xr sendmail 8 diff --git a/debian/examples/checksendmail/checksendmail.perl b/debian/examples/checksendmail/checksendmail.perl new file mode 100644 index 0000000..a8e9e11 --- /dev/null +++ b/debian/examples/checksendmail/checksendmail.perl @@ -0,0 +1,377 @@ +#!/usr/bin/perl + +# BSDI $Id: checksendmail.perl,v 1.1.1.1 1994/01/13 21:15:31 polk Exp $ + +# checksendmail +# +# The checksendmail program is a perl script that aids the testing +# of sendmail's various configuration filse. checksendmail +# passes typical addresses (supplied in input files) through +# sendmail and prints the result of the resolution and +# transformation routines. +# +# Gene Kim & Rob Kolstad & Jeff Polk, 7/11/90 + +# -- -C config file +# -- -r resolve_addresses_file +# -- -T test one address +# -- -b sendmail binary + +# XXX deficiencies: ``/etc/sendmail'' should be a parameter + +# defaults: + $resolve = "address.resolve"; + $cffile = "/etc/sendmail.cf"; + $sendmail = "/usr/sbin/sendmail"; + +sub usage { + die "Usage: checksendmail [-C cffile.cf] [-r resolve_addrs_file [-T one\@test.addr\n"; +} + +for (unshift (@ARGV, "XX"); $#ARGV > 0; shift ARGV) { + if ($ARGV[1] eq "-C") + { + shift @ARGV; + if ($#ARGV >= 1) {$cffile = $ARGV[1]; } + else { &usage(); } + } + elsif ($ARGV[1] eq "-r") + { + if ($setfile & 1) { die "Can only set `resolve' once"; } + shift @ARGV; + if ($#ARGV < 1) { &usage(); } + $resolve = $ARGV[1]; + $setfile += 1; + } + elsif ($ARGV[1] eq "-T") + { + if ($setfile) { die "Can't set other files and use -T"; } + shift @ARGV; + if ($#ARGV < 1) { &usage(); } + open (OUT, ">/tmp/csm.in$$") || + die "Can't open >/tmp/csm.in$$"; + $resolve = "/tmp/csm.in$$"; + print OUT "$ARGV[1]\n"; + close (OUT); + $setfile = 7; + } + elsif ($ARGV[1] eq "-b") + { + shift @ARGV; + if ($#ARGV >= 1) {$sendmail = $ARGV[1]; } + else { &usage(); } + } + else { &usage(); } +} + +if (!-e $cffile) { die "Can't find configuration file $cffile\n"; } +if (!-e $resolve) { die "Can't find name file $resolve\n"; } + +# make sure the user can access the ../mqueue directory + +$maildir = `grep ^OQ $cffile`; +chop $maildir; +$maildir =~ s/^OQ//; +if ((!-r $maildir) || (!-x $maildir) || (!-w $maildir)) { + warn "checksendmail: can't access $maildir! trying anyway...\n"; +} + +chop($hostname = `hostname`); +chop($pwd = `pwd`); +print "system: $hostname\t\tcurrent dir: $pwd\n"; +print "config file: $cffile\t\tresolve file: $resolve\n"; + +sub handler { # 1st argument is signal name + local($sig) = @_; + print STDERR "Caught a SIG$sig--shutting down\n"; + unlink("/tmp/csm$$") || die "Can't unlink /tmp/csm$$"; + unlink("/tmp/csm.in$$"); + exit(0); +} + +$SIG{'INT'} = 'handler'; +$SIG{'QUIT'} = 'handler'; + + +# glean the mailers used from the rule 0 tests + +sub parseresolve +{ + while (<MAIL>) + { + if (/^ADDRESS TEST MODE/) { next; } + if (/^Enter <ruleset>/) { next; } + if (/^>/) # INPUT LINE! (and last output is done) + { + chop; + if ($prevline) { # OUTPUT LINE! + &printparseresolve; + } + s/> *[0-9,]* *//g; + s/.*input: *//; + s/ //g; + s/"//g; + $input = $_; + } + else { chop; } + $prevline = $_; + } + &printparseresolve; +} + +sub printparseresolve { + $prevline =~ s/.*returns: *//; + $prevline =~ s/"//g; + $prevline =~ s/ //g; + # Don't strip spaces off error messages + $prevline =~ s/ *([.!%<>]) */$1/g; + $prevline =~ s/ +([;?\$])/$1/g; + $prevline =~ s/([#\@:]) +/$1/g; + +# non-Sun test mode delimiters -> easily-readable style +# Mark Sausville, MIT Media Laboratory, saus@media-lab.media.mit.edu + $prevline =~ s/\^V/\$#/; + $prevline =~ s/\^W/\$@/; + $prevline =~ s/\^X/\$:/; + + #### $#ether$@sun-barr.Ebay.Sun.COM$:site!user@uunet.uu.NET + @t = split( '\$', $prevline); + $address = "XXX"; + $remote = "XXX"; + $mailer = "XXX"; + for ($i = 1; $i <= $#t; $i++) + { + if (substr($t[$i], 0, 1) eq ":") + { $address = substr($t[$i], 1,999); } + if (substr($t[$i], 0, 1) eq "@") + { $remote = substr($t[$i], 1,999); } + if (substr($t[$i], 0, 1) eq "#") + { $mailer = substr($t[$i], 1,999); + $mailer =~ tr/A-Z/a-z/; } + } + printf("%-27.27s --(%-6.6s)--> %s[%s]\n", $input, $mailer, + $address, $remote); + if ($mailer ne "XXX") { $themailers{$mailer}.="$input ";} +} + +# Parse output of sendmail name resolution + +sub parseaddress +{ +## ADDRESS TEST MODE +## Enter <ruleset> <address> +## > rewrite: ruleset 3 input: "user" + + open(MAIL, $_[0]) || die "Can't open $_[0]...\n"; + local ($k, $address, $prevline, $mailer, $remote, $input); + print $_[1]; # the title + + $done = 0; + while (<MAIL>) + { + if (/^> *$/) { $done = 1; } + if (/^ADDRESS TEST MODE/) { next; } + if (/^Enter <ruleset>/) { next; } + chop; + if (/^>/) # INPUT LINE! (and last output is done) + { + if ($prevline) { # OUTPUT LINE! + $prevline =~ s/.*returns: *//; + $prevline =~ s/"//g; + $prevline =~ s/ //g; +#> rewrite: ruleset 3 input: "site" "!" "user" "@" "uunet" "." "uu" "." "net" +#rewrite: ruleset 8 input: "site" "!" "user" "@" "uunet" "." "uu" "." "net" +#> + printf("%-27.27s ----> %s\n", $input, $prevline); + } + s/> *[0-9,]* *//g; + s/.*input: *//; + s/ //g; + s/"//g; + $input = $_; + } + last if $done; + $prevline = $_; + } + close(MAIL); +} + + +# pass names from resolve files to sendmail + +open(IN, $resolve) || die "can't open $resolve\n"; +open(OUT, ">/tmp/csm$$") || die "can't open >/tmp/csm$$\n"; +while (<IN>) +{ + /^$/ && next; + /^#/ && next; + print OUT "3,0 $_"; + chop; + $allinput .= " $_"; +} +close(OUT); +close(IN); +$sendmailprog = "$sendmail -bt -C$cffile < /tmp/csm$$|"; +open(MAIL, $sendmailprog) || die "can't exec $sendmailprog...\n"; +print "Mail address resolution (rule 0)\n\n"; +&parseresolve(); + +# calculate $f + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + open (OUT, $sendmailprog); + open (IN, $resolve); + $rules = "3,1,4"; + while (<IN>) { + chop; + /^$/ && next; + /^#/ && next; + $address = $_; + print OUT "$rules $address\n"; + } + print OUT "\n"; # stuff last line into sendmail + close(IN); + close(OUT); + &parseaddress ("/tmp/csm$$", "\n\n\$f address header transformations\n\n"); + +# Get the R= and S= special rulesets from the configuration + +open(FID, "grep ^M $cffile|"); +while (<FID>) +{ +# Mether, P=[IPC], F=msDFMueCX, S=11, R=21, A=IPC $h + chop; + $thisline = $_; $thisline =~ s/M//; $thisline =~ s/,.*//; + $thisline =~ tr/A-Z/a-z/; + $sendrule = $_; $sendrule =~ s/.*S=//; $sendrule =~ s/,.*//; + if ($sendrule=~q!/!) { + ($esendrule, $hsendrule) = split (q!/!, $sendrule); + } + else { $esendrule = $hsendrule = $sendrule; } + $recvrule = $_; $recvrule =~ s/.*R=//; $recvrule =~ s/,.*//; + if ($recvrule=~q!/!) { + ($erecvrule, $hrecvrule) = split (q!/!, $recvrule); + } + else { $erecvrule = $hrecvrule = $recvrule; } + $esendrules{$thisline} = $esendrule; + $hsendrules{$thisline} = $hsendrule; + $erecvrules{$thisline} = $erecvrule; + $hrecvrules{$thisline} = $hrecvrule; +} +close(FID); + +# pass names from various mailers through sendmail + +foreach $i (keys %themailers) +{ + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + if ($erecvrules{$i} == 0) { + print "\n\nCan't find recv rule for `$i', skipping this mailer <-------------------\n"; + next; + } + open (OUT, $sendmailprog); + @namelist = split(/ /, $allinput); + $rules = "3,2,$erecvrules{$i},4"; + foreach (@namelist) { + print OUT "$rules $_\n"; + } + print OUT "\n"; # stuff last line into sendmail + close(OUT); + $note = ""; + if ($erecvrules{$i} eq $hrecvrules{$i}) { $note = "and header "; } + &parseaddress ("/tmp/csm$$", "\n\n`To' envelope ${note}address transformations for mailer $i [$rules]:\n\n"); +} +foreach $i (keys %themailers) +{ + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + if ($hrecvrules{$i} == 0) { + print "\n\nCan't find recv rule for `$i', skipping this mailer <-------------------\n"; + next; + } + if ($hrecvrules{$i} ne $erecvrules{$i}) { + open (OUT, $sendmailprog); + @namelist = split(/ /, $allinput); + $rules = "3,2,$hrecvrules{$i},4"; + foreach (@namelist) { + print OUT "$rules $_\n"; + } + print OUT "\n"; # stuff last line into sendmail + close(OUT); + &parseaddress ("/tmp/csm$$", "\n\n`To' header address transformations for mailer $i [$rules]:\n\n"); + } +} + +# pass names from various mailers through sendmail +foreach $i (keys %themailers) +{ + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + if ($esendrules{$i} == 0) { + print "\n\nCan't find send rule for `$i', skipping this mailer <-------------------\n"; + next; + } + open (OUT, $sendmailprog); + open (IN, $resolve); + $rules = "3,1,$esendrules{$i},4"; + while (<IN>) { + chop; + /^$/ && next; + /^#/ && next; + $address = $_; + print OUT "$rules $address\n"; + } + print OUT "\n"; # stuff last line into sendmail + close(IN); + close(OUT); + $note = ""; + if ($esendrules{$i} eq $hsendrles{$i}) {$note = "and header ";} + &parseaddress ("/tmp/csm$$", "\n\n`From' envelope ${note}address transformations for mailer $i [$rules]:\n\n"); +} +foreach $i (keys %themailers) +{ + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + if ($hsendrules{$i} == 0) { + print "\n\nCan't find send rule for `$i', skipping this mailer <-------------------\n"; + next; + } + open (OUT, $sendmailprog); + open (IN, $resolve); + $rules = "3,1,$hsendrules{$i},4"; + while (<IN>) { + chop; + /^$/ && next; + /^#/ && next; + $address = $_; + print OUT "$rules $address\n"; + } + print OUT "\n"; # stuff last line into sendmail + close(IN); + close(OUT); + &parseaddress ("/tmp/csm$$", "\n\n`From' address header transformations for mailer $i [$rules]:\n\n"); +} +foreach $i (keys %themailers) +{ + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + if ($esendrules{$i} == 0) { + print "\n\nCan't find send rule for `$i', skipping this mailer <-------------------\n"; + next; + } + open (OUT, $sendmailprog); + open (IN, $resolve); + $rules = "3,1,4,3,1,$hsendrules{$i},4"; # XXX esendrules? book p. 431??? + while (<IN>) { + chop; + /^$/ && next; + /^#/ && next; + $address = $_; + print OUT "$rules $address\n"; + } + print OUT "\n"; # stuff last line into sendmail + close(IN); + close(OUT); + $note = ""; + if ($esendrules{$i} eq $hsendrles{$i}) {$note = "and header ";} + &parseaddress ("/tmp/csm$$", "\n\n\$g address transformations for mailer $i [$rules]:\n\n"); +} + +unlink("/tmp/csm$$") || die "Can't unlink /tmp/csm$$"; +unlink("/tmp/csm.in$$"); + diff --git a/debian/examples/checksendmail/harker/address.resolve b/debian/examples/checksendmail/harker/address.resolve new file mode 100644 index 0000000..2de8a60 --- /dev/null +++ b/debian/examples/checksendmail/harker/address.resolve @@ -0,0 +1,15 @@ +# addresses to be delivered locally +root +postmaster +user +user@mailhub +user@mailhub.gadget.com +user@gadget.com + +# Addresses to be forwarded with SMTP to firewall +user@firewall +user@firewall.gadget.com + +# Addresses to be forwarded with SMTP to harker.com +user@harker.com +harker!user diff --git a/debian/examples/checksendmail/harker/checksendmail b/debian/examples/checksendmail/harker/checksendmail new file mode 100644 index 0000000..6a265bd --- /dev/null +++ b/debian/examples/checksendmail/harker/checksendmail @@ -0,0 +1,860 @@ +#!/usr/bin/perl + +# BSDI $Id: checksendmail.perl,v 1.1.1.1 1994/01/13 21:15:31 polk Exp $ + +# checksendmail +# +# The checksendmail program is a perl script that aids the testing +# of sendmail's various configuration filse. checksendmail +# passes typical addresses (supplied in input files) through +# sendmail and prints the result of the resolution and +# transformation routines. +# +# Gene Kim & Rob Kolstad & Jeff Polk, 7/11/90 +# Modified by Robert Harker, 11/14/00 + +# -- -a show aliasing of local addresses +# -- -d preceed each line with ruleset sequence summary +# -- -C config_file +# -- -b sendmail_binary +# -- -l log_file of results of tests +# -- -r resolve_addresses_file +# -- -T test one address + +# defaults: + $resolve = "address.resolve"; + $cffile = "/etc/mail/sendmail.cf"; + +sub usage { + die "Usage: checksendmail [-C cffile.cf] [-b sendmail_binary] [-l log_file]\n\t\t\t\t[-a] [-d] [-r resolve_addrs_file || -T one\@test.addr]\n$errormsg\n"; +} + +for (unshift (@ARGV, "XX"); $#ARGV > 0; shift ARGV) { + if ($ARGV[1] eq "-C") + { + if ($setcffile & 1) { die "Can only set `cffile.cf' once"; } + shift @ARGV; + if ($#ARGV >= 1) {$cffile = $ARGV[1]; } + else { + $errormsg = "No sendmail.cf file given for -C flag\n"; + &usage(); + } + $setcffile += 1; + } + elsif ($ARGV[1] eq "-r") + { + if ($setfile & 1) { die "Can only set `resolve' once"; } + shift @ARGV; + if ($#ARGV < 1) { + $errormsg = "No resolve_addrs_file given for -r flag\n"; + &usage(); + } + $resolve = $ARGV[1]; + $setfile += 1; + } + elsif ($ARGV[1] eq "-T") + { + if ($setfile) { die "Can't set other files and use -T"; } + shift @ARGV; + if ($#ARGV < 1) { + $errormsg = "No one\@test.addr given for -T flag\n"; + &usage(); + } + open (OUT, ">/tmp/csm.in$$") || + die "Can't open >/tmp/csm.in$$"; + $resolve = "/tmp/csm.in$$"; + print OUT "$ARGV[1]\n"; + close (OUT); + $setfile = 7; + } + elsif ($ARGV[1] eq "-b") + { + if ($setbin & 1) { die "Can only set `sendmail_binary' once"; } + shift @ARGV; + if ($#ARGV >= 1) {$sendmail = $ARGV[1]; } + else { + $errormsg = "No sendmail_binary file given for -b flag\n"; + &usage(); + } + $setbin += 1; + } + elsif ($ARGV[1] eq "-l") + { + if ($setlog & 1) { die "Can only set `log_file' once"; } + shift @ARGV; + if ($#ARGV >= 1) {$logfile = $ARGV[1]; } + else { + $errormsg = "No log_file file given for -l flag\n"; + &usage(); + } + $setlog += 1; + } + elsif ($ARGV[1] eq "-a") + { + $doaliasing += 1; + } + elsif ($ARGV[1] eq "-d") + { + $dorspath += 1; + } + else { &usage(); } +} + +# Figure out where the sendmail binary is +if (! $setbin & 1) { + foreach $i ("/usr/sbin/sendmail", "/usr/libexec/sendmail", "/usr/lib/sendmail") + { + # test if binary exists and is executable + if ((-e $i) && (-x $i)) { + $sendmail = $i; + last; + } + } +} + + +# Figure out the version of sendmail and the location of the sendmail.cf file +# sendmail -d0.10 -bv root +# ("-bv root" is just to give sendmail something to chew on) + +$binversion = `$sendmail -d0.10 -bv root | grep "^Version "`; +chop $binversion; +$binversion =~ s/^Version //; + +# Get the major relase number from the sendmail version +$binver = $binversion; +$binver =~ s/^8\.//; +$binver =~ s/\..+//; + +# if the cf file was not set on the command line, +# find out where the binary looks for it +if ( ! -e $cffile ) { + $cffile = `$sendmail -d0.10 -bv root | grep "Def Conf file:"`; + chop $cffile; + $cffile =~ s/ //g; + $cffile =~ s/ //g; + $cffile =~ s/^DefConffile://; +} + +if (!-e $cffile) { die "Can't find configuration file $cffile\n"; } + +if (!-e $resolve) { die "Can't find name file $resolve\n"; } + +# Figure out the version of the sendmail.cf file +# Look for the V line +$cfversion = `grep "^V" $cffile`; +chop $cfversion; +# if $cfversion is empty, then the configuration is sendmail 5, not sendmail 8 +$cfversion =~ s/^$/V0/; + +# Get the version number from the V line +$cfver = $cfversion; +$cfver =~ s/^V//; +$cfver =~ s'/.+''; + +# check that the binary is a higher version than config file +if ( $binver < $cfver + 1) { + die "$cffile version ($cfversion) is more advanced than $sendmail version ($binversion)\n"; +} + +# figure out where the mqueue directory is +if ( $cfver <= 6 ) { + $maildir = `grep "^OQ" $cffile`; + chop $maildir; + $maildir =~ s/^OQ//; +} else { + $maildir = `grep "^O QueueDirectory" $cffile`; + chop $maildir; + $maildir =~ s/^O QueueDirectory=//; +} + +# make sure the user can access the ../mqueue directory +if ((!-r $maildir) || (!-x $maildir) || (!-w $maildir)) { + if ($doaliasing & 1) { + die "checksendmail: can't access $maildir! can't use checksendmail's -a flag\n"; + } else { + warn "checksendmail: can't access $maildir! trying anyway...\n"; + } +} + +chop($hostname = `hostname`); +chop($pwd = `pwd`); +print "system: $hostname\t\tcurrent dir: $pwd\n"; +print "resolve file: $resolve\n"; +print "sendmail binary: $sendmail\t\tsendmail version: $binversion\n"; +print "config file: $cffile\t\tconfig file version: $cfversion\n\n"; +if ($setlog & 1) { + print "log file: $logfile\n\n"; + # now print to the log file + open (LOG , ">$logfile") || die "Can't open >$logfile"; + print LOG "system: $hostname\t\tcurrent dir: $pwd\n"; + print LOG "resolve file: $resolve\n"; + print LOG "sendmail binary: $sendmail\t\tsendmail version: $binversion\n"; + print LOG "config file: $cffile\t\tconfig file version: $cfversion\n"; + print LOG "log file: $logfile\n\n"; +} + +sub handler { # 1st argument is signal name + local($sig) = @_; + print STDERR "Caught a SIG$sig--shutting down\n"; + unlink("/tmp/csm$$") || die "Can't unlink /tmp/csm$$"; + unlink("/tmp/csm.in$$"); + if ($setlog & 1) { + close(LOG); + } + exit(0); +} + +$SIG{'INT'} = 'handler'; +$SIG{'QUIT'} = 'handler'; + + + +# glean the mailers used from the rule 0 tests + +sub parseresolve +{ + while (<MAIL>) + { + # now print to the log file + if ($setlog & 1) { + print LOG $_; + } + if (/^ADDRESS TEST MODE/) { next; } + if (/^Enter <ruleset>/) { next; } + if (/^Warning: .cf file is out of date/) { next; } + + # if the binary is less than 8.7 then use result of ruleset 0 + if ( $binver <= 6 ) { + if (/^>/) # INPUT LINE! (and last output is done) + { + chop; + if ($prevline) { # OUTPUT LINE! + &printparseresolve; + } + s/> *[0-9,]* *//g; + s/.*input: *//; + s/ //g; + s/"//g; + $input = $_; + } + else { chop; } + $prevline = $_; + } else { + # format of /parse output is: + # Parsing envelope recipient address + # rewrite: ruleset 3 input: harker @ harker . com + if ($prevrule eq "Parsing envelope recipient address\n" ) + { + chop; + s/> *[0-9,]* *//g; + s/.*input: *//; + s/ //g; + s/"//g; + $input = $_; + $prevrule = $_; + } + elsif (/^mailer /) + { + $prevrule = $_; + &printparseresolve; + } + else + { + $prevrule = $_; + } + } + } + #&printparseresolve; +} + +sub printparseresolve { + # if the binary is less than 8.7 then use result of ruleset 0 + if ( $binver <= 6 ) { + if ($input eq "") { return;} + + $prevline =~ s/.*returns: *//; + $prevline =~ s/"//g; + $prevline =~ s/ //g; + # Don't strip spaces off error messages + $prevline =~ s/ *([.!%<>]) */$1/g; + $prevline =~ s/ +([;?\$])/$1/g; + $prevline =~ s/([#\@:]) +/$1/g; + +# non-Sun test mode delimiters -> easily-readable style +# Mark Sausville, MIT Media Laboratory, saus@media-lab.media.mit.edu + $prevline =~ s/\^V/\$#/; + $prevline =~ s/\^W/\$@/; + $prevline =~ s/\^X/\$:/; + + #### $#ether$@sun-barr.Ebay.Sun.COM$:site!user@uunet.uu.NET + @t = split( '\$', $prevline); + $address = "XXX"; + $remote = "XXX"; + $mailer = "XXX"; + for ($i = 1; $i <= $#t; $i++) + { + if (substr($t[$i], 0, 1) eq ":") + { $address = substr($t[$i], 1,999); } + if (substr($t[$i], 0, 1) eq "@") + { $remote = substr($t[$i], 1,999); } + if (substr($t[$i], 0, 1) eq "#") + { $mailer = substr($t[$i], 1,999); + $mailer =~ tr/A-Z/a-z/; } + } + } else { + # the binary is at least 8.7 then use result of /parse + chop; + s/,//g; + + # mailer esmtp, host harker.com., user harker@harker.com + @t = split( ' ', $_); + $address = "XXX"; + $remote = "XXX"; + $mailer = "XXX"; + for ($i = 0; $i <= $#t; $i++) + { + if ($t[$i] eq "user") + { $address = $t[++$i]; } + if ($t[$i] eq "host") + { $remote = $t[++$i]; } + if ($t[$i] eq "mailer") + { $mailer = $t[++$i]; + $mailer =~ tr/A-Z/a-z/; } + } + } + printf("%-27.27s --(%-6.6s)--> %s[%s]\n", $input, $mailer, + $address, $remote); + # now print to the log file + if ($setlog & 1) { + printf LOG ("%-27.27s --(%-6.6s)--> %s[%s]\n\n", $input, $mailer, + $address, $remote); + } + + if ($doaliasing & 1) { + # If the address resolved to the local mailer, + # then expand the username as an alias + if ( $mailer eq "local") + { + $setalias = $aliasfound = 0; + $laddress = $address; + $sendmailprog = "$sendmail -bv -C$cffile $laddress|"; + open(LOCAL, $sendmailprog) || + die "can't exec $sendmailprog...\n"; + # now print to the log file + if ($setlog & 1) { + print LOG "\n$sendmailprog\n"; + } + while (<LOCAL>) + { + # now print to the log file + if ($setlog & 1) { + print LOG $_; + } + chop; + if (/unknown/) + { + $aliasfound = 1; + printf("\t\t aliased to --(error )--> %s\n", $_); + # now print to the log file + if ($setlog & 1) { + printf LOG ("\t\t aliased to --(error )--> %s\n\n", $_); + } + next; + } + s/,//g; + @l = split( ' ', $_); + $aladdress = "XXX"; + $remote = "XXX"; + $mailer = "XXX"; + for ($i = 1; $i <= $#l; $i++) + { + # ./sendmail -bv -C./sendmail.cf j.murphy + # j.murphy@pop.mcit.com... deliverable: mailer mciesmtp, + # host pop.mcit.com, user j.murphy@pop.mcit.com + if ($l[$i] eq "user") { $aladdress = $l[++$i]; } + if ($l[$i] eq "host") { $remote = $l[++$i]; } + if ($l[$i] eq "mailer") { $mailer = $l[++$i]; } + } + if (("$laddress" eq "$aladdress") && ($aliasfound == 0)) { + $selfalias = 1; + next; + } + printf("\t\t aliased to --(%-6.6s)--> %s[%s]\n", + $mailer, $aladdress, $remote); + # now print to the log file + if ($setlog & 1) { + printf LOG ("\t\t aliased to --(%-6.6s)--> %s[%s]\n\n", + $mailer, $aladdress, $remote); + } + if ("$laddress" ne "$aladdress") { + $aliasfound = 1; + $envsenderaddrs .= " $aladdress"; + } + if ($mailer ne "XXX") { $themailers{$mailer}=1;} + } + close(LOCAL); + if ($selfalias == 1 && $aliasfound == 1) { + printf("\t\t aliased to --(%-6.6s)--> %s[%s]\n", + $mailer, $aladdress, $remote); + # now print to the log file + if ($setlog & 1) { + printf LOG ("\t\t aliased to --(%-6.6s)--> %s[%s]\n\n", + $mailer, $aladdress, $remote); + } + } + # now print a blank line to the log file + if ($setlog & 1) { + print LOG "\n"; + } + } else { + $envsenderaddrs .= " $address"; + } + } + + if ($mailer ne "XXX") { $themailers{$mailer}.="$input ";} +} + +# Parse output of sendmail name resolution + +sub parseaddress +{ +## ADDRESS TEST MODE +## Enter <ruleset> <address> +## > rewrite: ruleset 3 input: "user" + + open(MAIL, $_[0]) || die "Can't open $_[0]...\n"; + local ($k, $address, $prevline, $mailer, $remote, $input); + print $_[1]; # the title + # now print to the log file + if ($setlog & 1) { + print LOG "\n$_[1]"; # the title + } + + $done = 0; + while (<MAIL>) + { + # now print to the log file + if ($setlog & 1) { + print LOG $_; + } + if (/^> *$/) { $done = 1; } + if (/^ADDRESS TEST MODE/) { next; } + if (/^Enter <ruleset>/) { next; } + if (/^Warning: .cf file is out of date/) { next; } + if (/^$/) { next; } + chop; + # rewrite $rules to be just a slash if it starts with a / + $rules =~ s'/.+'/'; + # if the binary is less than 8.7 then use result of ruleset 4 + if ( $binver <= 6 || $rules ne "/" ) { + if (/^>/) # INPUT LINE! (and last output is done) + { + if ($prevline) { # OUTPUT LINE! + $prevline =~ s/.*returns: *//; + $prevline =~ s/"//g; + $prevline =~ s/ //g; +#> rewrite: ruleset 3 input: "site" "!" "user" "@" "uunet" "." "uu" "." "net" +#rewrite: ruleset 8 input: "site" "!" "user" "@" "uunet" "." "uu" "." "net" +#> + printf("%s%-24.24s ----> %s\n", $rspath, $input, $prevline); + # now print to the log file + if ($setlog & 1) { + printf LOG ("%s%-24.24s ----> %s\n", $rspath, $input, $prevline); + } + } + s/> *[0-9,]* *//g; + s/.*input: *//; + s/ //g; + s/"//g; + $input = $_; + } + last if $done; + $prevline = $_; + } else { + # format of /try output is: + # Trying envelope recipient address harker for mailer esmtp + # ... + # Rcode = 0, addr = harker@mailhub.gadget.com + # remove extra ">" from "> >" lines + s/^> >/>/; + if (/^> Trying/) # INPUT LINE! (and last output is done) + { + chop; + s/> Trying .+ address //; + s/ for mailer .+//; + s/ //g; + s/"//g; + $input = $_; + $prevrule = $_; + } + elsif (/^Rcode = /) + { + $prevrule = $_; + # Rcode = 0, addr = harker@mailhub.gadget.com + s/^Rcode = .+ addr = //; + printf("%s%-24.24s ----> %s\n", $rspath, $input, $_); + # now print to the log file + if ($setlog & 1) { + printf LOG ("%s%-24.24s ----> %s\n\n", $rspath, $input, $_); + } + } + else + { + $prevrule = $_; + } + } + } + # now print to the log file + if ($setlog & 1) { + print LOG "\n"; + } + close(MAIL); +} + + +# if the binary is less than 8.7 then use result of ruleset 4 +if ( $binver <= 6 ) { + print "Mail address resolution (rule 0)\n"; + # now print to the log file + if ($setlog & 1) { + print LOG "Mail address resolution (rule 0)\n"; + } +} else { + print "Mail address resolution (/parse)\n"; + # now print to the log file + if ($setlog & 1) { + print LOG "Mail address resolution (/parse)\n"; + } +} +# pass names from resolve files to sendmail + +open(IN, $resolve) || die "can't open $resolve\n"; +open(OUT, ">/tmp/csm$$") || die "can't open >/tmp/csm$$\n"; +while (<IN>) +{ + /^$/ && next; + /^#/ && next; + # if the binary is less than 8.7 then use result of ruleset 0 + if ( $binver == 5 ) { + $rules = "0 $_"; + } elsif ( $binver <= 6 ) { + $rules = "3,0 $_"; + } else { + $rules = "/parse $_"; + } + print OUT $rules; + # now print to the log file + if ($setlog & 1) { + print LOG "$rules"; + } + chop; + $allinput .= " $_"; +} + $allinput =~ s/^ //; +close(OUT); +close(IN); +$sendmailprog = "$sendmail -bt -C$cffile < /tmp/csm$$|"; +open(MAIL, $sendmailprog) || die "can't exec $sendmailprog...\n"; +&parseresolve(); + +# calculate $f + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + open (OUT, $sendmailprog); + open (IN, $resolve); + # sendmail 5 automatically runs ruleset 3 + if ( $binver == 5 ) { + $rules = "1,4"; + } else { + $rules = "3,1,4"; + } + if ($dorspath & 1) { $rspath = "\$f: "; } + + while (<IN>) { + chop; + /^$/ && next; + /^#/ && next; + $address = $_; + print OUT "$rules $address\n"; + # now print to the log file + if ($setlog & 1) { + print LOG "$rules $address\n"; + } + } + print OUT "\n"; # stuff last line into sendmail + # now print to the log file + if ($setlog & 1) { + print LOG "\n"; # stuff last line into sendmail + } + close(IN); + close(OUT); + &parseaddress ("/tmp/csm$$", "\n\$f address header transformations\n"); + +# Get the R= and S= special rulesets from the configuration +# now print to the log file +if ($setlog & 1) { + print LOG "\nGet the R= and S= mailer specific rulesets\n"; +} + +open(FID, "grep ^M $cffile|"); +while (<FID>) +{ +# Mether, P=[IPC], F=msDFMueCX, S=11, R=21, A=IPC $h + chop; + $thisline = $_; + $thisline =~ s/M//; + $thisline =~ s/,.*//; + $thisline =~ tr/A-Z/a-z/; + $sendrule = $_; + $sendrule =~ s/.*S=//; + $sendrule =~ s/,.*//; + if ($sendrule=~q!/!) { + ($esendrule, $hsendrule) = split (q!/!, $sendrule); + } else { + $esendrule = $hsendrule = $sendrule; + } + $recvrule = $_; + $recvrule =~ s/.*R=//; + $recvrule =~ s/,.*//; + if ($recvrule=~q!/!) { + ($erecvrule, $hrecvrule) = split (q!/!, $recvrule); + } else { + $erecvrule = $hrecvrule = $recvrule; + } + $esendrules{$thisline} = $esendrule; + $hsendrules{$thisline} = $hsendrule; + $erecvrules{$thisline} = $erecvrule; + $hrecvrules{$thisline} = $hrecvrule; + # now print to the log file + if ($setlog & 1) { + print LOG "mailer: $thisline\t->\tesendrule = $esendrule, hsendrule = $hsendrule, + erecvrule = $erecvrule, hrecvrule = $hrecvrule\n"; + } +} +# now print to the log file +if ($setlog & 1) { + print LOG "\n"; +} +close(FID); + +# pass envelope recipient names from various mailers through sendmail +foreach $i (keys %themailers) +{ + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + open (OUT, $sendmailprog); + if ($dorspath & 1) { $rspath = "$i ER: "; } + + # if the binary is less than 8.7 then use result of ruleset 0 + if ( $binver <= 6 ) { + if ($erecvrules{$i} == 0) { + print "\nCan't find recv rule for `$i', skipping this mailer <-------------------\n"; + next; + } + # sendmail 5 automatically runs ruleset 3 + if ( $binver == 5 ) { + $rules = "2,$erecvrules{$i},4"; + } else { + $rules = "3,2,$erecvrules{$i},4"; + } + } else { + print OUT "/tryflags ER\n"; + # now print to the log file + if ($setlog & 1) { + print LOG "/tryflags ER\n"; + } + $rules = "/try $i"; + } + @namelist = split(/ /, $allinput); + foreach (@namelist) { + print OUT "$rules $_\n"; + # now print to the log file + if ($setlog & 1) { + print LOG "$rules $_\n"; + } + } + print OUT "\n"; # stuff last line into sendmail + # now print to the log file + if ($setlog & 1) { + print LOG "\n"; # stuff last line into the log + } + close(OUT); + $note = ""; + if ($erecvrules{$i} eq $hrecvrules{$i}) { $note = "and header "; } + &parseaddress ("/tmp/csm$$", "\n`To' envelope ${note}address transformations for mailer $i [$rules]:\n"); +} + +# pass header recipient names from various mailers through sendmail +foreach $i (keys %themailers) +{ + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + open (OUT, $sendmailprog); + if ($dorspath & 1) { $rspath = "$i HR: "; } + + # only run the header ruleset if the mailer uses split env/hdr rulesets + if ($hrecvrules{$i} ne $erecvrules{$i}) { + # if the binary is less than 8.7 then use result of ruleset 0 + if ( $binver <= 6 ) { + if ($hrecvrules{$i} == 0) { + print "\nCan't find recv rule for `$i', skipping this mailer <-------------------\n"; + next; + } + # sendmail 5 automatically runs ruleset 3 + if ( $binver == 5 ) { + $rules = "2,$hrecvrules{$i},4"; + } else { + $rules = "3,2,$hrecvrules{$i},4"; + } + } else { + print OUT "/tryflags HR\n"; + # now print to the log file + if ($setlog & 1) { + print LOG "/tryflags HR\n"; + } + $rules = "/try $i"; + } + @namelist = split(/ /, $allinput); + foreach (@namelist) { + print OUT "$rules $_\n"; + # now print to the log file + if ($setlog & 1) { + print LOG "$rules $_\n"; + } + } + print OUT "\n"; # stuff last line into sendmail + # now print to the log file + if ($setlog & 1) { + print LOG "\n"; # stuff last line into the log + } + close(OUT); + &parseaddress ("/tmp/csm$$", "\n`To' header address transformations for mailer $i [$rules]:\n"); + } +} + +# pass envelope sender names from various mailers through sendmail +foreach $i (keys %themailers) +{ + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + open (OUT, $sendmailprog); + if ($dorspath & 1) { $rspath = "$i ES: "; } + + # if the binary is less than 8.7 then use result of ruleset 0 + if ( $binver <= 6 ) { + if ($esendrules{$i} == 0) { + print "\nCan't find send rule for `$i', skipping this mailer <-------------------\n"; + next; + } + # sendmail 5 automatically runs ruleset 3 + if ( $binver == 5 ) { + $rules = "2,$esendrules{$i},4"; + } else { + $rules = "3,2,$esendrules{$i},4"; + } + } else { + print OUT "/tryflags ES\n"; + # now print to the log file + if ($setlog & 1) { + print LOG "/tryflags ES\n"; + } + $rules = "/try $i"; + } + @namelist = split(/ /, $allinput); + foreach (@namelist) { + print OUT "$rules $_\n"; + # now print to the log file + if ($setlog & 1) { + print LOG "$rules $_\n"; + } + } + print OUT "\n"; # stuff last line into sendmail + close(IN); + close(OUT); + $note = ""; + if ($esendrules{$i} eq $hsendrles{$i}) {$note = "and header ";} + &parseaddress ("/tmp/csm$$", "\n`From' envelope ${note}address transformations for mailer $i [$rules]:\n"); +} + +# pass header sender names from various mailers through sendmail +foreach $i (keys %themailers) +{ + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + open (OUT, $sendmailprog); + if ($dorspath & 1) { $rspath = "$i HS: "; } + + # only run the header ruleset if the mailer uses split env/hdr rulesets + if ($hsendrules{$i} ne $esendrules{$i}) { + # if the binary is less than 8.7 then use result of ruleset 0 + if ( $binver <= 6 ) { + if ($hsendrules{$i} == 0) { + print "\nCan't find send rule for `$i', skipping this mailer <-------------------\n"; + next; + } + # sendmail 5 automatically runs ruleset 3 + if ( $binver == 5 ) { + $rules = "2,$hsendrules{$i},4"; + } else { + $rules = "3,2,$hsendrules{$i},4"; + } + } else { + print OUT "/tryflags HS\n"; + # now print to the log file + if ($setlog & 1) { + print LOG "/tryflags HR\n"; + } + $rules = "/try $i"; + } + @namelist = split(/ /, $allinput); + foreach (@namelist) { + print OUT "$rules $_\n"; + # now print to the log file + if ($setlog & 1) { + print LOG "$rules $_\n"; + } + } + print OUT "\n"; # stuff last line into sendmail + close(IN); + close(OUT); + &parseaddress ("/tmp/csm$$", "\n`From' address header transformations for mailer $i [$rules]:\n"); + } +} + +foreach $i (keys %themailers) +{ + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + open (OUT, $sendmailprog); + if ($dorspath & 1) { $rspath = "\$g: "; } + + # if the binary is 8.9 or below then check if the mailer + # specific ruleset exists + if ( $binver <= 9 ) { + # if the binary is less than 8.7 then use result of ruleset 0 + if ($esendrules{$i} == 0) { + print "\nCan't find send rule for `$i', skipping this mailer <-------------------\n"; + next; + } + } + # sendmail 5 automatically runs ruleset 3 + if ( $binver == 5 ) { + $rules = "1,4,3,1,$hsendrules{$i},4"; # XXX esendrules? book p. 431??? + } else { + $rules = "3,1,4,3,1,$hsendrules{$i},4"; # XXX esendrules? book p. 431??? + } + open (IN, $resolve); + while (<IN>) { + chop; + /^$/ && next; + /^#/ && next; + $address = $_; + print OUT "$rules $address\n"; + } + print OUT "\n"; # stuff last line into sendmail + close(IN); + close(OUT); + $note = ""; + if ($esendrules{$i} eq $hsendrles{$i}) {$note = "and header ";} + &parseaddress ("/tmp/csm$$", "\n\$g address transformations for mailer $i [$rules]:\n"); +} + +unlink("/tmp/csm$$") || die "Can't unlink /tmp/csm$$"; +unlink("/tmp/csm.in$$"); + +exit; diff --git a/debian/examples/checksendmail/harker/checksendmail.8 b/debian/examples/checksendmail/harker/checksendmail.8 new file mode 100644 index 0000000..229f229 --- /dev/null +++ b/debian/examples/checksendmail/harker/checksendmail.8 @@ -0,0 +1,246 @@ +.\" BSDI $Id: checksendmail.8,v 1.1.1.1 1994/01/13 21:15:31 polk Exp $ +.Dd November 14, 2000 +.Dt CHECKSENDMAIL 8 +.Os +.Sh NAME +.Nm checksendmail +.Nd verify sendmail address transformations. +.Sh SYNOPSIS +.Nm checksendmail +.Op Fl a +.Op Fl d +.Op Fl b +.Op Fl C Ar file.cf +.Op Fl b Ar sendmail_binary +.Op Fl l Ar log_file +.Op Fl r Ar resolve +.Op Fl T Ar test.address + +.Sh DESCRIPTION +.Pp +The +.Nm checksendmail +program is a +.Xr perl +script that aids the testing of +.Xr sendmail 8 's +various configuration files. +.Nm checksendmail +passes typical addresses (supplied in input files) through +.Xr sendmail +and prints the results of the resolution and transformation routines. +.Pp +The input files contain a list of addresses, one per line. +For example: +.Bd -literal -offset indent +user +user@site +user@site.com +.Ed +.Pp +The input file can contain comments started with a +.Em # +and blank lines. +.Sh OPTIONS +.Pp +.Bl -tag -width Fl -compact -offset left +.It Fl a +Show aliasing of local addresses in +mail address resolution phase of testing +.It Fl d +Preceed each address translation line with ruleset sequence summary +.It Fl C Ar file.cf +Use the +.Xr sendmail +configuration file +.Ar file.cf +instead of the default +.Pa /etc/sendmail.cf +file. +.It Fl b Ar sendmail_binary +Use the specified +.Ar sendmail_binary +as the path to invoke sendmail (instead of +.Pa /usr/sbin/sendmail ) . +.It Fl l Ar log_file +Log +.Xr sendmail +address test mode debugging output to +.Ar log_file +.It Fl r Ar resolve +Use +.Ar resolve +as the input file for the addresses to be used for mail resolving. Defaults +to +.Ar address.resolve . +.It Fl T Ar test.address +Use +.Ar test.address +as the single address to test. Cannot be used in conjunction with +file setting flags. +.El +.Sh EXAMPLES +.Pp +The following command will pass the addresses in +.Ar address.resolve +through +.Xr sendmail +using the configuration information in +.Ar myconfig.cf . +.Bd -literal -offset left +example% cat address.resolve +user +user@site +user@site.com + +example% checksendmail \-C myconfig.cf +system: myhost.gadget.com current dir: /tmp/Checksendmail +resolve file: address.resolve +sendmail binary: /usr/sbin/sendmail sendmail version: 8.9.3 +config file: /etc/sendmail.cf config file version: V8/Berkeley + +Mail address resolution +user --(ether )--> user[rmtc] +user@site --(ether )--> user@site[rmtc] +user@site.com --(ether )--> user@site.com[rmtc] + +`To' address transformations for mailer ether: +user ----> user +user@site ----> user@site +user@site.com ----> user@site.com + +`From' address transformations for mailer ether: +user ----> user +user@site ----> user +user@site.com ----> user +.Ed +.Pp +The first section of the output shows how the addresses in the input +files are resolved by +.Xr sendmail 8 . +Consider the following output line: +.Pp +.Dl user@site.com --(ether )--> user@site.com[rmtc] +.Pp +The input address +.Em user@site.com +resolves to use the +.Em ether +mailer. That mailer is directed to send the mail to +to the user +.Em user@site.com +at site +.Em rmtc +(as indicated in the square brackets). +.Pp +The two later sections of output show how the addresses specified as +the +.Em To +and +.Em From +address are transformed in the text of the +headers. In the example above, the +.Em To +addresses are untouched. +The +.Em From +addresses, however, all lose their machine information on +the way through the mailer: +.Pp +.Dl user@site ----> user +.Pp +This may be desirable when using a configuration file on a +workstation which is to be hidden as a mailhost from the rest of the +network. +.Pp +The following is a set of addresses used at one site for the purposes of +testing address resolution. Comments after the addresses detail why +particular addresses are present: +.Bl -tag -width "user@machine.com" -compact -offset indent +.It user +Standard trivial address +.It user@rmtc +qualified at one level +.It user@rmtc.central +qualified at two levels +.It user@rmtc.central.sun.com +qualified all the way +.It rmtc!user +local but specified as uucp +.It user@summit +a workstation (normally delivered locally, though) +.It user@summit.central +same but more qualified +.It user@summit.central.sun.com +same but fully qualified +.It summit!user +same but specified as uucp +.It user@prisma +Backward compatibility tests +.It user@prisma.com +.It prisma!user +.It user@central +Superior domain testing +.It user@machine.central +more qualified, but unknown +.It user@summit.central +more qualified and known +.It user@eng +name in faraway domain +.It user@machine.eng +unknown machine in faraway domain +.It user@summit.eng +local machine, far away domain +.It user@hoback +far away machine +.It user@machine +apparently local but unknown machine +.It user@sun.com +Standard trivial address +.It user@machine.dom.sun.com +fully qualified but unknown machine +.It user@foo.com +standard, known, really far away domain +.It user@foo.dom +standard, unknown, really far away domain +.It site!user +Single level uucp +.It site1!site2!user +Double level uucp +.It user@foo.dom@bar.dom +Trickier address +.It site!user@foo.dom +Mixed uucp/domain +.It site!user@uunet.uu.net +Mixed double uucp/domain +.El +.Sh NOTES +Note that +.Nm checksendmail +is a +.Xr perl +script. If your site does not have +.Xr perl 1 , +it can be obtained via anonymous +.Xr ftp +from +.Em ftp.uu.net . +.Pp +.Xr sendmail +requires that the user have access to directory specified by the +.Em OQ +parameter in the configuration file (normally +.Pa /usr/spool/mqueue ) . +.Nm checksendmail +verifies that the user has access to this directory before allowing the +test to continue. +.Sh AUTHORS +.Bd -literal +Gene Kim +Rob Kolstad +Jeff Polk +.Ed +.Pp +Modified by Robert Harker +.Sh "SEE ALSO" +.Xr sendmail 8 diff --git a/debian/examples/db/access b/debian/examples/db/access index 9eea701..8bfab0b 100644 --- a/debian/examples/db/access +++ b/debian/examples/db/access @@ -1,88 +1,162 @@ # /etc/mail/access -# Copyright (c) 1998, Richard Nelson <cowboy@debian.org>. +# Copyright (c) 1998,2004 Richard Nelson <cowboy@debian.org>. # Time-stamp: <1998/10/27 10:00:00 cowboy> # GPL'd config file, please feed any gripes, suggestions, etc. to me # # Function: -# Access Control for this smtp server - determines: -# * Who we accept mail from -# * Who we accept relaying from -# * Who we will not send to +# Access Control for this smtp server - determines: +# * Who we accept mail from +# * Who we accept relaying from +# * Who we will not send to # # Usage: -# FEATURE(access_db[, type [-o] /etc/mail/access])dnl -# makemap hash access < access +# FEATURE(access_db[, type [-o] /etc/mail/access])dnl +# makemap hash access < access # # Format: -# lhs: -# email addr <user@[host.domain]> -# domain name unless FEATURE(relay_hosts_only) is used, +# lhs: +# email addr <user@[host.domain]> +# domain name unless FEATURE(relay_hosts_only) is used, # then this is a fqdn - and relay-domains ($=R) # must also be fqdns. -# network number must end on an octet boundary, or +# network number must end on an octet boundary, or # you're stuck going the longwinded way ;-{ -# rhs: -# OK accept mail even if other rules in the -# running ruleset would reject it. -# RELAY Allow domain to relay through your SMTP -# server. RELAY also serves an implicit -# OK for the other checks. -# REJECT reject the sender/recipient with a general -# purpose message that can be customized. -# confREJECT_MSG [550 Access denied] will be issued -# DISCARD discard the message completely using -# the $#discard mailer. -# ### any text where ### is an RFC 821 compliant error code -# and "any text" is a message to return for +# rhs: +# OK accept mail even if other rules in the +# running ruleset would reject it. +# RELAY Allow domain to relay through your SMTP +# server. RELAY also serves an implicit +# OK for the other checks. +# REJECT reject the sender/recipient with a general +# purpose message that can be customized. +# confREJECT_MSG [550 Access denied] will be issued +# DISCARD discard the message completely using +# the $#discard mailer. +# ### any text where ### is an RFC 821 compliant error code +# and "any text" is a message to return for # the command # Examples: -# spammer@aol.com REJECT -# FREE.STEALTH.MAILER@ 550 Spam not accepted +# spammer@aol.com REJECT +# FREE.STEALTH.MAILER@ 550 Spam not accepted # # Notes: -# With FEATURE(blacklist_recipients) this is also possible: -# badlocaluser 550 Mailbox disabled for this username -# host.mydomain.com 550 That host does not accept mail -# user@otherhost.mydomain.com 550 Mailbox disabled for this recipient +# With FEATURE(blacklist_recipients) this is also possible: +# badlocaluser 550 Mailbox disabled for this username +# host.mydomain.com 550 That host does not accept mail +# user@otherhost.mydomain.com 550 Mailbox disabled for this recipient # # Related: -# define(`confREJECT_MSG', `550 Access denied')dnl -# define(`confCR_FILE', `-o /etc/mail/relay-domains')dnl <<- $=R -# FEATURE(relay_hosts_only)dnl -# FEATURE(relay_entire_domain)dnl <<- relays any host in the $=m class -# FEATURE(relay_based_on_MX)dnl <<- relaying for boxes MX'd to you -# FEATURE(blacklist_recipients)dnl -# FEATURE(rbl[,alternate server])dnl -# FEATURE(orbs[,alternate server])dnl <<- Debian addition -# FEATURE(orca[,alternate server])dnl <<- Debian addition -# FEATURE(accept_unqualified_senders)dnl -# FEATURE(accept_unresolvable_domains)dnl +# define(`confREJECT_MSG', `550 Access denied')dnl +# define(`confCR_FILE', `-o /etc/mail/relay-domains')dnl <<- $=R +# FEATURE(relay_hosts_only)dnl +# FEATURE(relay_entire_domain)dnl <<- relays any host in the $=m class +# FEATURE(relay_based_on_MX)dnl <<- relaying for boxes MX'd to you +# FEATURE(blacklist_recipients)dnl +# FEATURE(rbl[,alternate server])dnl +# FEATURE(orbs[,alternate server])dnl <<- Debian addition +# FEATURE(orca[,alternate server])dnl <<- Debian addition +# FEATURE(accept_unqualified_senders)dnl +# FEATURE(accept_unresolvable_domains)dnl # # Local addresses 10.x.x.x, 127.x.x.x, 172.16-31.x.x 192.168.x.x can relay # Note Well! You *must* make sure these address can't be spoofed externally -10 RELAY -127 RELAY -172.16 RELAY -172.17 RELAY -172.18 RELAY -172.19 RELAY -172.20 RELAY -172.21 RELAY -172.22 RELAY -172.23 RELAY -172.24 RELAY -172.25 RELAY -172.26 RELAY -172.27 RELAY -172.28 RELAY -172.29 RELAY -172.30 RELAY -172.31 RELAY -192.168 RELAY -# -# Hosts that are allowed to talk to me +# Note, outbound relaying is controlled by connection and/or auth +# If you're not firewalled, and you don't have a lan, comment these out +# If you're not firewalled, and you have a lan, get firewalled *NOW* +# GreetPause - delay to check for spammers +# Client Connection rate (and #) control +Connect:localhost RELAY +GreetPause:localhost 0 +ClientRate:localhost 0 +ClientConn:localhost 0 +#Connect:10 RELAY +#GreetPause:10 0 +#ClientRate:10 0 +#ClientConn:10 0 +Connect:127 RELAY +GreetPause:127 0 +ClientRate:127 0 +ClientConn:127 0 +Connect:[IPv6:::1] RELAY +GreetPause:[IPv6:::1] 0 +ClientRate:[IPv6:::1] 0 +ClientConn:[IPv6:::1] 0 +#Connect:172.16 RELAY +#Connect:172.17 RELAY +#Connect:172.18 RELAY +#Connect:172.19 RELAY +#Connect:172.20 RELAY +#Connect:172.21 RELAY +#Connect:172.22 RELAY +#Connect:172.23 RELAY +#Connect:172.24 RELAY +#Connect:172.25 RELAY +#Connect:172.26 RELAY +#Connect:172.27 RELAY +#Connect:172.28 RELAY +#Connect:172.29 RELAY +#Connect:172.30 RELAY +#Connect:172.31 RELAY +#Connect:192.168 RELAY +#GreetPause:192.168 0 +#ClientRate:192.168 0 +#ClientConn:192.168 0 +# Defaults +GreetPause: 5000 +ClientRate: 10 +ClientConn: 10 # +# Don't offer AUTH on local network +#SRV_Features:192.168.1 A +# +# Hosts with to allow relaying +# +# +# Hosts that validly forward to me +#GreetPause:<ip> 0 +#ClientRate:<ip> 30 +#ClientConn:<ip> 0 +# +# Whitelisted users +# +Spam:postmaster@ FRIEND +Spam:abuse@ FRIEND +Spam:spam@ FRIEND # # Blacklisted users # -reject@ REJECT +#Connect:rampellsoft.com 554 Email directly, not through didtheyreadit.com +reject@ REJECT +#cyberpromo.com REJECT +#From:MAILER-DAEMON@store2.netvisao.pt REJECT +# +# Block invalid IPs +# +Connect:0 REJECT +Connect:2 REJECT +Connect:5 REJECT +Connect:7 REJECT +Connect:8 REJECT +Connect:23 REJECT +Connect:27 REJECT +Connect:31 REJECT +Connect:36 REJECT +Connect:37 REJECT +Connect:39 REJECT +Connect:41 REJECT +Connect:42 REJECT +Connect:50 REJECT +Connect:71 REJECT +Connect:72 REJECT +Connect:73 REJECT +Connect:74 REJECT +Connect:75 REJECT +Connect:76 REJECT +Connect:77 REJECT +Connect:78 REJECT +Connect:79 REJECT +Connect:169.254 REJECT +Connect:192.0.2 REJECT +Connect:197 REJECT +Connect:224 REJECT +Connect:255 REJECT diff --git a/debian/examples/db/relay-domains b/debian/examples/db/relay-domains index 393f65d..c16b9de 100644 --- a/debian/examples/db/relay-domains +++ b/debian/examples/db/relay-domains @@ -8,6 +8,7 @@ # # Usage: # define(`confCR_FILE', `[-o ]/etc/mail/relay-domains')dnl +# RELAY_DOMAIN_FILE(`/etc/mail/relay-domains %[^\#]')dnl # # Format: # lhs: diff --git a/debian/examples/db/userdb b/debian/examples/db/userdb new file mode 100644 index 0000000..9d4d915 --- /dev/null +++ b/debian/examples/db/userdb @@ -0,0 +1,10 @@ +#User names and the inbound(maildrop)/outbound(mailname) addresses +#dest machine/domain names must also be in sendmail.cG for masquerading +# NOTE: do NOT use FEATURE(stickyhost) with userdb +# NOTE: be carefull with local delivery, defeats plussed users +# +# NOTE: Combined with virtusertable and/or aliases, Genericstable +# can do everything the userdb can and more (and the difference +# is growing bigger). The userdb is basically obsolete. +#:default:mailname badlands.org +#cowboy:mailname cowboy@vnet.ibm.com diff --git a/debian/examples/dhcp3/dhclient-exit-hooks.d/sendmail.1.old b/debian/examples/dhcp3/dhclient-exit-hooks.d/sendmail.1.old new file mode 100644 index 0000000..ba6b98c --- /dev/null +++ b/debian/examples/dhcp3/dhclient-exit-hooks.d/sendmail.1.old @@ -0,0 +1,158 @@ +#!/bin/sh +# +# This script is called when dhcp connects to the network. +# +# Here is where we'll start sendmail if needed, and will +# run the queue in either case. +# +# Written By Richard Nelson <cowboy@debian.org> +# +# NOTE: The following lines (without the #) must be in /etc/mail/sendmail.mc: +# include(`/etc/mail/dialup.m4')dnl +# include(`/etc/mail/provider.m4')dnl +# +# NOTE: The dhcp DNS name is used as the peer name in /etc/mail/peers. +# +# Exit by default, check for validity before commenting out the next line: +exit 0; + +provider_m4='/etc/mail/provider.m4'; +#provider_m4='provider.m4'; +dialup_m4='/etc/mail/dialup.m4'; +#dialup_m4='dialup.m4'; + +update_sendmail() { + # Build a new sendmail.cf from sendmail.mc, including our address. + m4 /etc/mail/sendmail.mc \ + > /etc/mail/sendmail.cf.pnew; + chmod 0644 /etc/mail/sendmail.cf.pnew; + chown mail:mail /etc/mail/sendmail.cf.pnew; + mv -f /etc/mail/sendmail.cf.pnew /etc/mail/sendmail.cf; + + # Purge any latent host status that might cause us to *NOT* send mail + AM='-Am'; + if [ ! -f /usr/share/sendmail/cf/feature/msp.m4 ]; then + AM=''; + fi; + sendmail $AM -bH -O Timeout.hoststatus=1s; + + # Start/reload sendmail as needed + /etc/init.d/sendmail reload; # may be up, or down + + # Process the sendmail queue + # (background so as to not defer other ip-up work) + runq & + }; + +update_provider() { + # Add smarthost information (if any)... + # But not if provider.m4 is a link ! + local domain; + domain="$1"; + if [ -f /etc/mail/peers/$domain -a ! -L $provider_m4 ]; then + cat <<-EOT > $provider_m4; + LOCAL_CONFIG + #------------------------------------------------------------ + # + # Dynamic provider updates from $0 + # + # NOTE: the following line *MUST* be in /etc/mail/sendmail.mc + dnl include(\`/etc/mail/provider.m4')dnl + # + # Provider information from /etc/mail/peers/$domain + EOT + cat /etc/mail/peers/$domain >> $provider_m4; + cat <<-EOT >> $provider_m4; + #------------------------------------------------------------ + EOT + fi; + }; + +find_host() { + # Determine our fqdn from our ISP + local addr; + addr="$1"; + maxloop=20; + cntr=0; + host=''; + until (test ! -z "$host"); do + cntr=$(($cntr+1)); + rev=$(host $addr); + host=$(echo "$rev" | grep '^Name:' | awk '{print $2}'); + if [ -z "$host" ]; then + host=${rev##*domain name pointer }; + host=${host%.}; + fi; + test=$(echo $host | cut -d ' ' -f 1); + if [ "$host" != "**" ]; then + break; + elif (($cntr > $maxloop)); then + host=''; + break; + fi; + done; + echo "addr=$addr, name=$host"; + }; + +update_host() { + local host ip; + ip="$1"; + find_host "$ip"; + if [ ! -z "$host" ]; then + cat <<-EOT > $dialup_m4; + LOCAL_CONFIG + #------------------------------------------------------------ + # + # Dynamic host/ip updates from $0 + # + # NOTE: the following line *MUST* be in /etc/mail/sendmail.mc + dnl include(\`/etc/mail/dialup.m4')dnl + # + # Chose one of the following two options: + # * Add our true hostname as a Virtual Host (we'll accept + # mail for it, but keep our local name for SMTP AUTH, etc) + C{VirtHost}$host + # + # * Define our true hostname (from our ISP) - becomes \$j + dnl define(\`confDOMAIN_NAME', \`$host')dnl + # + # Make sure we accept mail as this name (for bounces, etc) + Cw$host + Cw$ip + # Add our hostname to class G for genericstable support + CG$host + #------------------------------------------------------------ + EOT + fi; + }; + +# No need to continue if we're called with an unsupported option +if [ "$reason" != BOUND ] && [ "$reason" != RENEW ] \ + && [ "$reason" != REBIND ] && [ "$reason" != REBOOT ] \ + && [ "$reason" != EXPIRE ] && [ "$reason" != FAIL ] + then + return; + fi; + +# Flag to denote changed have been made; +changed=0; + +# If the domain name has changed, update the provider information +if [ "$new_domain_name" != "$old_domain_name" ]; then + changed=1; + update_provider "$new_domain_name"; + fi; + +# If the ip address has changed, update the host information +if [ "$new_ip_address" != "$oldnew_ip_address" ]; then + changed=1; + update_host "$new_ip_address"; + fi; + +# If anything has been changed, update sendmail.cf and reload +if [ $changed -eq 1 ]; then + update_sendmail; + fi; + +exit 0; + diff --git a/debian/examples/dhcp3/dhclient-exit-hooks.d/sendmail.in b/debian/examples/dhcp3/dhclient-exit-hooks.d/sendmail.in new file mode 100644 index 0000000..0afc701 --- /dev/null +++ b/debian/examples/dhcp3/dhclient-exit-hooks.d/sendmail.in @@ -0,0 +1,49 @@ +#!/bin/sh +# +# This script is called when a dhcp event occurs. +# +# Here is where we'll start/stop sendmail if needed. +# +# Written By Richard Nelson <cowboy@debian.org> +# +# NOTE: The following lines (without the #) must be in /etc/mail/sendmail.mc: +# include(`/etc/mail/dialup.m4')dnl +# include(`/etc/mail/provider.m4')dnl +# +# NOTE: The dhcp DNS name is used as the peer name in /etc/mail/peers. +# + +# No need to continue if we're called with an unsupported option +case "$reason" in + EXPIRE|FAIL|RELEASE|STOP) # and TIMEOUT too ?? + ;; + BOUND|RENEW|REBIND|REBOOT|TIMEOUT) + ;; + *) + return; + ;; + esac; + +# Bring in some script functions to handle dynamic configuration +. @datadir@/sendmail/dynamic; + +# Note the interface that just changed +update_interface "$interface" "$reason"; + +# If the domain name has changed, update the provider information +if [ "$new_domain_name" != "$old_domain_name" ]; then + update_provider "$new_domain_name"; + fi; + +# If the ip address has changed, update the host information +if [ "$new_ip_address" != "$oldnew_ip_address" ]; then + update_host "$new_ip_address"; + fi; + +# If anything has been changed, update sendmail.cf and reload +# Actually, we'll delay the reload because we'll be hit in a moment +# to handle the change in /etc/resolv.conf +update_sendmail Delayed; + +return; + diff --git a/debian/examples/dhcp3/dhclient-exit-hooks.d/sendmail.md5sum b/debian/examples/dhcp3/dhclient-exit-hooks.d/sendmail.md5sum new file mode 100644 index 0000000..d18e257 --- /dev/null +++ b/debian/examples/dhcp3/dhclient-exit-hooks.d/sendmail.md5sum @@ -0,0 +1 @@ +2adc5e32474fb128ee6c7b4425d06a58 sendmail diff --git a/debian/examples/ldap/sendmail.schema.v2 b/debian/examples/ldap/sendmail.schema.v2 index bab47e8..a532f8b 100644 --- a/debian/examples/ldap/sendmail.schema.v2 +++ b/debian/examples/ldap/sendmail.schema.v2 @@ -1,11 +1,11 @@ -# Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers. +# Copyright (c) 2000-2002 Sendmail, Inc. and its suppliers. # All rights reserved. # # By using this file, you agree to the terms and conditions set # forth in the LICENSE file which can be found at the top level of # the sendmail distribution. # -# $Id: sendmail.schema,v 8.14 2001/08/31 17:18:18 gshapiro Exp $ +# $Id: sendmail.schema,v 8.21 2002/11/20 23:13:50 gshapiro Exp $ # Note that this schema is experimental at this point as it has had little # public review. Therefore, it may change in future versions. Feedback @@ -87,6 +87,20 @@ attributetype ( 1.3.6.1.4.1.6152.10.3.1.16 EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) +# attribute sendmailMTAMapSearch cis +attributetype ( 1.3.6.1.4.1.6152.10.3.1.24 + NAME 'sendmailMTAMapSearch' + DESC 'recursive search for values of a map entry' + EQUALITY caseExactMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) + +# attribute sendmailMTAMapURL cis +attributetype ( 1.3.6.1.4.1.6152.10.3.1.25 + NAME 'sendmailMTAMapURL' + DESC 'recursive search URL for values of a map entry' + EQUALITY caseExactMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) + #objectClass sendmailMTAMap # requires # objectClass, @@ -108,18 +122,22 @@ objectclass ( 1.3.6.1.4.1.6152.10.3.2.11 # objectClass, # sendmailMTAMapName, # sendmailMTAKey, -# sendmailMTAMapValue, # allows # sendmailMTACluster, # sendmailMTAHost, +# sendmailMTAMapValue, +# sendmailMTAMapSearch, +# sendmailMTAMapURL, # Description objectclass ( 1.3.6.1.4.1.6152.10.3.2.12 NAME 'sendmailMTAMapObject' SUP sendmailMTAMap STRUCTURAL DESC 'Sendmail MTA map object' - MUST ( sendmailMTAMapName $ sendmailMTAKey $ sendmailMTAMapValue ) - MAY ( sendmailMTACluster $ sendmailMTAHost $ Description ) ) + MUST ( sendmailMTAMapName $ sendmailMTAKey ) + MAY ( sendmailMTACluster $ sendmailMTAHost $ + sendmailMTAMapValue $ sendmailMTAMapSearch $ + sendmailMTAMapURL $ Description ) ) ########################################################################### @@ -132,8 +150,8 @@ objectclass ( 1.3.6.1.4.1.6152.10.3.2.12 attributetype ( 1.3.6.1.4.1.6152.10.3.1.18 NAME 'sendmailMTAAliasGrouping' DESC 'name that identifies a particular aliases grouping' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} ) # attribute sendmailMTAAliasValue cis @@ -143,6 +161,20 @@ attributetype ( 1.3.6.1.4.1.6152.10.3.1.20 EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) +# attribute sendmailMTAAliasSearch cis +attributetype ( 1.3.6.1.4.1.6152.10.3.1.26 + NAME 'sendmailMTAAliasSearch' + DESC 'recursive search for values of an alias' + EQUALITY caseExactMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) + +# attribute sendmailMTAAliasURL cis +attributetype ( 1.3.6.1.4.1.6152.10.3.1.27 + NAME 'sendmailMTAAliasURL' + DESC 'recursive search URL for values of an alias' + EQUALITY caseExactMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) + #objectClass sendmailMTAAlias # requires # objectClass, @@ -163,20 +195,23 @@ objectclass ( 1.3.6.1.4.1.6152.10.3.2.13 # requires # objectClass, # sendmailMTAKey, -# sendmailMTAAliasValue, # allows # sendmailMTAAliasGrouping, # sendmailMTACluster, # sendmailMTAHost, +# sendmailMTAAliasValue, +# sendmailMTAAliasSearch, +# sendmailMTAAliasURL, # Description objectclass ( 1.3.6.1.4.1.6152.10.3.2.14 NAME 'sendmailMTAAliasObject' SUP sendmailMTAAlias STRUCTURAL DESC 'Sendmail MTA alias object' - MUST ( sendmailMTAKey $ sendmailMTAAliasValue ) - MAY ( sendmailMTAAliasGrouping $ - sendmailMTACluster $ sendmailMTAHost $ Description ) ) + MUST sendmailMTAKey + MAY ( sendmailMTAAliasGrouping $ sendmailMTACluster $ + sendmailMTAHost $ sendmailMTAAliasValue $ + sendmailMTAAliasSearch $ sendmailMTAAliasURL $ Description ) ) ########################################################################### # @@ -198,19 +233,37 @@ attributetype ( 1.3.6.1.4.1.6152.10.3.1.23 EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) +# attribute sendmailMTAClassSearch cis +attributetype ( 1.3.6.1.4.1.6152.10.3.1.28 + NAME 'sendmailMTAClassSearch' + DESC 'recursive search for members of a class' + EQUALITY caseExactMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) + +# attribute sendmailMTAClassURL cis +attributetype ( 1.3.6.1.4.1.6152.10.3.1.29 + NAME 'sendmailMTAClassURL' + DESC 'recursive search URL for members of a class' + EQUALITY caseExactMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) + #objectClass sendmailMTAClass # requires # objectClass, # sendmailMTAClassName, -# sendmailMTAClassValue, # allows # sendmailMTACluster, # sendmailMTAHost, +# sendmailMTAClassValue, +# sendmailMTAClassSearch, +# sendmailMTAClassURL, # Description objectclass ( 1.3.6.1.4.1.6152.10.3.2.15 NAME 'sendmailMTAClass' SUP sendmailMTA STRUCTURAL DESC 'Sendmail MTA class definition' - MUST ( sendmailMTAClassName $ sendmailMTAClassValue ) - MAY ( sendmailMTACluster $ sendmailMTAHost $ Description ) ) + MUST sendmailMTAClassName + MAY ( sendmailMTACluster $ sendmailMTAHost $ + sendmailMTAClassValue $ sendmailMTAClassSearch $ + sendmailMTAClassURL $ Description ) ) diff --git a/debian/examples/logcheck/ignore.d.paranoid/sendmail b/debian/examples/logcheck/ignore.d.paranoid/sendmail index e0781dd..e8cb7f2 100644 --- a/debian/examples/logcheck/ignore.d.paranoid/sendmail +++ b/debian/examples/logcheck/ignore.d.paranoid/sendmail @@ -1,21 +1,21 @@ -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: starting daemon -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: restarting -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: rejecting connections on daemon -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: accepting connections again for daemon -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* User unknown -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: alias database .* rebuilt -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* aliases, longest -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: from= -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: split: -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* lost input channel -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* message-id= -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* return to sender -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* stat= -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* timeout waiting -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: Milter add: -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: Milter: data, discard -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: discarded -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: AUTH= -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: (PLAIN|CRAM-MD5|DIGEST-MD5) set secret -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: DIGEST-MD5: failed .* later in exchange -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: STARTTLS=(server|client), .* verify=(OK|NO) +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: starting daemon +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: restarting +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: rejecting connections on daemon +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: accepting connections again for daemon +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* User unknown +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: alias database .* rebuilt +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* aliases, longest +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: from= +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: split: +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* lost input channel +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* message-id= +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* return to sender +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* stat= +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* timeout waiting +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: Milter add: +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: Milter: data, discard +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: discarded +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: AUTH= +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: (PLAIN|CRAM-MD5|DIGEST-MD5) set secret +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: DIGEST-MD5: failed .* later in exchange +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: STARTTLS=(server|client), .* verify=(OK|NO) diff --git a/debian/examples/logcheck/ignore.d.server/sendmail b/debian/examples/logcheck/ignore.d.server/sendmail index dfc4984..dbb6e11 100644 --- a/debian/examples/logcheck/ignore.d.server/sendmail +++ b/debian/examples/logcheck/ignore.d.server/sendmail @@ -1,21 +1,27 @@ -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: starting daemon -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: restarting -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: rejecting connections on daemon -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: accepting connections again for daemon -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* User unknown -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: alias database .* rebuilt -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* aliases, longest -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: from= -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: split: -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* lost input channel -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* message-id= -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* return to sender -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* stat= -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* timeout waiting -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: Milter add: -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: Milter: data, discard -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: discarded -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: AUTH= -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: (PLAIN|CRAM-MD5|DIGEST-MD5) set secret -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: DIGEST-MD5: failed .* later in exchange -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: STARTTLS=(server|client), .* verify=(OK|NO) +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: starting daemon +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: restarting +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: rejecting connections on daemon +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: accepting connections again for daemon +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* User unknown +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: alias database .* rebuilt +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* aliases, longest +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: from= +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: split: +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* lost input channel +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* message-id= +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* return to sender +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* stat= +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* timeout waiting +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: Milter: data, discard +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: discarded +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: AUTH= +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: (PLAIN|CRAM-MD5|DIGEST-MD5) set secret +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: DIGEST-MD5: failed .* later in exchange +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: STARTTLS=(server|client), .* verify=(OK|NO) +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: no secret in database$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: [[:alnum:]]+: [[:alnum:]]+: DSN: Return receipt$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: [[:alnum:]]+: collect: premature EOM: unexpected close$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: [[:alnum:]]+: collect: unexpected close on connection from (\[[0-9.]+\]|[._[:alnum:]-]+), sender=<[^>]+>$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: DIGEST-MD5 (server|client) step [[:alnum:]]+$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: [[:alnum:]]+ Milter (add|change|message): .*$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: [[:alnum:]]+\[[0-9]+\]:.*$ diff --git a/debian/examples/logcheck/ignore.d.workstation/sendmail b/debian/examples/logcheck/ignore.d.workstation/sendmail index 2374b71..d8bd8d0 100644 --- a/debian/examples/logcheck/ignore.d.workstation/sendmail +++ b/debian/examples/logcheck/ignore.d.workstation/sendmail @@ -1,21 +1,21 @@ -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: starting daemon -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: restarting -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: rejecting connections on daemon -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: accepting connections again for daemon -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* User unknown -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: alias database .* rebuilt -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* aliases, longest -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: from= -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: split: -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* lost input channel -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* message-id= -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* return to sender -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* stat= -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* timeout waiting -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: Milter add: -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: Milter: data, discard -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: discarded -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: AUTH= -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: (PLAIN|CRAM-MD5|DIGEST-MD5) set secret -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: DIGEST-MD5: failed .* later in exchange -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: STARTTLS= +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: starting daemon +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: restarting +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: rejecting connections on daemon +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: accepting connections again for daemon +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* User unknown +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: alias database .* rebuilt +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* aliases, longest +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: from= +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: split: +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* lost input channel +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* message-id= +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* return to sender +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* stat= +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* timeout waiting +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: Milter add: +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: Milter: data, discard +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*: discarded +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: AUTH= +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: (PLAIN|CRAM-MD5|DIGEST-MD5) set secret +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: DIGEST-MD5: failed .* later in exchange +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: STARTTLS= diff --git a/debian/examples/logcheck/violations.ignore.d/local.sendmail b/debian/examples/logcheck/violations.ignore.d/local.sendmail new file mode 100644 index 0000000..83abd67 --- /dev/null +++ b/debian/examples/logcheck/violations.ignore.d/local.sendmail @@ -0,0 +1 @@ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .* did not issue MAIL/EXPN/VRFY/ETRN during connection to MTA$ diff --git a/debian/examples/logcheck/violations.ignore.d/logcheck-sendmail b/debian/examples/logcheck/violations.ignore.d/logcheck-sendmail deleted file mode 100644 index 9518e7d..0000000 --- a/debian/examples/logcheck/violations.ignore.d/logcheck-sendmail +++ /dev/null @@ -1,12 +0,0 @@ -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: alias database .* rebuilt -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*stat=(Refused|Deferred) -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: gethostbyaddr\(.*\) failed: -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: rejecting connections on daemon -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: DIGEST-MD5: failed .* later in exchange -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*reject=450 4\.7\.1 <[^>]+>... Relaying temporarily denied. Cannot resolve PTR record for [0-9\.]+$ -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*reject=451 4\.1\.8 Domain of sender address [^ ]+ does not resolve$ -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*reject=550 5\.7\.1 Access denied$ -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*reject=550 5\.7\.1 <[^>]+>... Relaying denied. Proper authentication required.$ -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*reject=550 5\.7\.1 <[^>]+>... Relaying denied. IP name lookup failed \[[0-9\.]+\]$ -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*reject=550 5\.7\.1 <[^>]+>... Relaying denied. IP name lookup possibly forged \[[0-9\.]+\]$ -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*reject=553 5\.1\.8 <[^>]+>... Relaying temporarily denied. Cannot resolve PTR record for [0-9\.]+$ diff --git a/debian/examples/logcheck/violations.ignore.d/sendmail b/debian/examples/logcheck/violations.ignore.d/sendmail index 9518e7d..93e0f57 100644 --- a/debian/examples/logcheck/violations.ignore.d/sendmail +++ b/debian/examples/logcheck/violations.ignore.d/sendmail @@ -1,12 +1,13 @@ -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: alias database .* rebuilt -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*stat=(Refused|Deferred) -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: gethostbyaddr\(.*\) failed: -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: rejecting connections on daemon -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: DIGEST-MD5: failed .* later in exchange -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*reject=450 4\.7\.1 <[^>]+>... Relaying temporarily denied. Cannot resolve PTR record for [0-9\.]+$ -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*reject=451 4\.1\.8 Domain of sender address [^ ]+ does not resolve$ -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*reject=550 5\.7\.1 Access denied$ -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*reject=550 5\.7\.1 <[^>]+>... Relaying denied. Proper authentication required.$ -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*reject=550 5\.7\.1 <[^>]+>... Relaying denied. IP name lookup failed \[[0-9\.]+\]$ -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*reject=550 5\.7\.1 <[^>]+>... Relaying denied. IP name lookup possibly forged \[[0-9\.]+\]$ -(sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*reject=553 5\.1\.8 <[^>]+>... Relaying temporarily denied. Cannot resolve PTR record for [0-9\.]+$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: alias database .* rebuilt +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*stat=(Refused|Deferred) +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: gethostbyaddr\(.*\) failed: +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: rejecting connections on daemon +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: DIGEST-MD5: failed .* later in exchange +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*reject=450 4\.7\.1 <[^>]+>... Relaying temporarily denied. Cannot resolve PTR record for [0-9\.]+$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*reject=451 4\.1\.8 Domain of sender address [^ ]+ does not resolve$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*reject=550 5\.7\.1 (<[^>]+>... )?Access denied$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*reject=550 5\.7\.1 <[^>]+>... Relaying denied. Proper authentication required.$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*reject=550 5\.7\.1 <[^>]+>... Relaying denied. IP name lookup failed \[[0-9\.]+\]$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*reject=550 5\.7\.1 <[^>]+>... Relaying denied. IP name (lookup )?possibly forged \[[0-9\.]+\]$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: .*reject=553 5\.1\.8 <[^>]+>... Relaying temporarily denied. Cannot resolve PTR record for [0-9\.]+$ +^\w{3} [ :0-9]{11} [._[:alnum:]-]+ (sendmail|sm-(mta|msp|que))\[[0-9]+\]: [[:alnum:]]+: Milter (add|change|message):.*$ diff --git a/debian/examples/dialup/ip-down.d b/debian/examples/network/if-down.d/sendmail.1.old index 88e719e..88e719e 100644 --- a/debian/examples/dialup/ip-down.d +++ b/debian/examples/network/if-down.d/sendmail.1.old diff --git a/debian/examples/network/if-down.d/sendmail.in b/debian/examples/network/if-down.d/sendmail.in new file mode 100644 index 0000000..0f7d569 --- /dev/null +++ b/debian/examples/network/if-down.d/sendmail.in @@ -0,0 +1,42 @@ +#!/bin/sh +# +# This script is called when a network device goes down. +# +# Here is where we'll stop sendmail if needed +# +# Written By Richard Nelson <cowboy@debian.org> +# +# NOTE: The following lines (without the #) must be in /etc/mail/sendmail.mc: +# include(`/etc/mail/dialup.m4')dnl +# include(`/etc/mail/provider.m4')dnl +# + +# These variables are for the use of the scripts run by run-parts +#IFACE=; +#IF_ADDRESS=; +#IF_PROVIDER=; + +if [ ! -z "$IFACE" ]; then + addr=$IF_ADDRESS; + provider=$IF_PROVIDER; + iface=$IFACE; +else + addr=$1; + provider=$2; + iface=$3; + fi; + +if [ -z "$provider" ]; then + exit 0; + fi; + +# Bring in some script functions to handle dynamic configuration +. @datadir@/sendmail/dynamic; + +# Note the interface that just changed +update_interface "$iface" "STOP"; + +# If anything has been changed, update sendmail.cf and reload +update_sendmail; + +exit 0; diff --git a/debian/examples/network/if-down.d/sendmail.md5sum b/debian/examples/network/if-down.d/sendmail.md5sum new file mode 100644 index 0000000..6afd10a --- /dev/null +++ b/debian/examples/network/if-down.d/sendmail.md5sum @@ -0,0 +1 @@ +fb749db92b73eca0480702c59f6b09ed sendmail diff --git a/debian/examples/dialup/ip-up.d b/debian/examples/network/if-up.d/sendmail.1.old index cae3e1f..cae3e1f 100644 --- a/debian/examples/dialup/ip-up.d +++ b/debian/examples/network/if-up.d/sendmail.1.old diff --git a/debian/examples/network/if-up.d/sendmail.in b/debian/examples/network/if-up.d/sendmail.in new file mode 100644 index 0000000..f0afd8a --- /dev/null +++ b/debian/examples/network/if-up.d/sendmail.in @@ -0,0 +1,61 @@ +#!/bin/sh +# +# This script is called when a network device comes up. +# +# Here is where we'll start sendmail if needed. +# +# Written By Richard Nelson <cowboy@debian.org> +# +# NOTE: The following lines (without the #) must be in /etc/mail/sendmail.mc: +# include(`/etc/mail/dialup.m4')dnl +# include(`/etc/mail/provider.m4')dnl +# +# ALSO: make sure to use a 'provider <isp>' tag in /etc/network/interfaces +# it will be used as the name of a file in /etc/mail/peers +# + + +# These variables are for the use of the scripts run by run-parts +#IFACE=; <-- ifupdown +#IF_ADDRESS=; <-- ifupdown +#IF_PROVIDER=; <-- sendmail specific +#IF_DNS_DOMAIN=; <-- resolvconf +#IF_DNS_SEARCH=; <-- resolvconf + +if [ ! -z "$IFACE" ]; then + addr=$IF_ADDRESS; + if [ -n "$IF_PROVIDER" ]; then + provider="$IF_PROVIDER"; + elif [ -n "$IF_DNS_DOMAIN" ]; then + provider="$IF_DNS_DOMAIN"; + elif [ -n "$IF_DNS_SEARCH" ]; then + provider="$IF_DNS_SEARCH"; + fi; + iface=$IFACE; +else + addr=$1; + provider=$2; + iface=$3; + fi; + +# Bring in some script functions to handle dynamic configuration +. @datadir@/sendmail/dynamic; + +# Note the interface that just changed +update_interface "$iface" "BOUND"; + +# If the domain name has changed, update the provider information +if [ -n "$provider" ]; then + update_provider "$provider"; + fi; + +# If the ip address has changed, update the host information +if [ -n "$addr" ]; then + update_host "$addr"; + fi; + +# If anything has been changed, update sendmail.cf and reload +update_sendmail; + +exit 0; + diff --git a/debian/examples/network/if-up.d/sendmail.md5sum b/debian/examples/network/if-up.d/sendmail.md5sum new file mode 100644 index 0000000..d8e607f --- /dev/null +++ b/debian/examples/network/if-up.d/sendmail.md5sum @@ -0,0 +1 @@ +2b0ad0f52c1c7562311b6a4f49340072 sendmail diff --git a/debian/examples/pam/smtp b/debian/examples/pam.d/smtp index 645535c..50f2ebe 100644 --- a/debian/examples/pam/smtp +++ b/debian/examples/pam.d/smtp @@ -3,12 +3,14 @@ # # /etc/pam.d/smtp # -# Copyright (c) 2000-2001 Richard Nelson. All Rights Reserved. -# Version: 2.0.0 -# Time-stamp: <2001/05/29 12:00:00 cowboy> +# Copyright (c) 2000-2003 Richard Nelson. All Rights Reserved. +# Version: 2.0.1 +# Time-stamp: <2003/05/06 12:00:00 cowboy> # # PAM configuration file used by SASL to authenticate a PLAIN password. # #------------------------------------------------------------------------ #auth sufficient pam_ldap.so auth required pam_unix.so nullok try_first_pass +account required pam_unix.so +password required pam_unix.so diff --git a/debian/examples/pam.d/smtp.md5sum b/debian/examples/pam.d/smtp.md5sum new file mode 100644 index 0000000..4ceae1c --- /dev/null +++ b/debian/examples/pam.d/smtp.md5sum @@ -0,0 +1 @@ +44980f7978afc8051a84b3414e628613 smtp diff --git a/debian/examples/ppp/ip-down.d/sendmail.1.old b/debian/examples/ppp/ip-down.d/sendmail.1.old new file mode 100644 index 0000000..88e719e --- /dev/null +++ b/debian/examples/ppp/ip-down.d/sendmail.1.old @@ -0,0 +1,57 @@ +#!/bin/sh +# +# This script is called when ppp disconnects from the network. +# +# Here is where we'll stop sendmail if needed +# +# Written By Richard Nelson <cowboy@debian.org> +# +# NOTE: The following lines (without the #) must be in /etc/mail/sendmail.mc: +# include(`/etc/mail/dialup.m4')dnl +# include(`/etc/mail/provider.m4')dnl +# +# Exit by default, check for validity before commenting out the next line: +exit 0; + +# Purge any latent host status that might cause us to *NOT* send mail +AM='-Am'; +if [ ! -f /usr/share/sendmail/cf/feature/msp.m4 ]; then + AM=''; + fi; +sendmail $AM -bH -O Timeout.hoststatus=1s; + +# New mail will only be queued +file="/etc/mail/dialup.m4"; +if [ -f "$file" ]; then + cat <<-EOT > $file; + LOCAL_CONFIG + #------------------------------------------------------------ + # + # Dynamic updates from $0 + # + # NOTE: the following line *MUST* be in /etc/mail/sendmail.mc + dnl include(\`/etc/mail/dialup.m4')dnl + # + # sendmail is to only queue messages until connected again + define(\`confDELIVERY_MODE', \`deferred')dnl + # + # Allow the queue to age without carping every four hours + define(\`confTO_QUEUEWARN',\`1d')dnl + # + # Don't keep host status while the network is down + define(\`confHOST_STATUS_DIRECTORY')dnl + #------------------------------------------------------------ + EOT + fi; + +# Build a new sendmail.cf from sendmail.mc, including our address. +# NOTE: The following line (without the #) must be in /etc/mail/sendmail.mc: +# include(`/etc/mail/dialup.m4') +m4 /etc/mail/sendmail.mc \ + > /etc/mail/sendmail.cf.pnew; +chmod 0644 /etc/mail/sendmail.cf.pnew; +chown mail:mail /etc/mail/sendmail.cf.pnew; +mv -f /etc/mail/sendmail.cf.pnew /etc/mail/sendmail.cf; + +# Stop/reload sendmail daemon as needed +/etc/init.d/sendmail reload; diff --git a/debian/examples/ppp/ip-down.d/sendmail.in b/debian/examples/ppp/ip-down.d/sendmail.in new file mode 100644 index 0000000..1baa7ee --- /dev/null +++ b/debian/examples/ppp/ip-down.d/sendmail.in @@ -0,0 +1,45 @@ +#!/bin/sh +# +# This script is called when ppp disconnects from the network. +# +# Here is where we'll stop sendmail if needed +# +# Written By Richard Nelson <cowboy@debian.org> +# +# NOTE: The following lines (without the #) must be in /etc/mail/sendmail.mc: +# include(`/etc/mail/dialup.m4')dnl +# include(`/etc/mail/provider.m4')dnl +# + +# These variables are for the use of the scripts run by run-parts +#PPP_IFACE="$1"; +#PPP_TTY="$2"; +#PPP_SPEED="$3"; +#PPP_LOCAL="$4"; +#PPP_REMOTE="$5"; +#PPP_IPPARAM="$6"; + +if [ ! -z "$PPP_LOCAL" ]; then + addr=$PPP_LOCAL; + provider=$PPP_IPPARAM; + iface=$PPP_IFACE; +else + addr=$1; + provider=$2; + iface=$3; + fi; + +if [ -z "$provider" ]; then + exit 0; + fi; + +# Bring in some script functions to handle dynamic configuration +. @datadir@/sendmail/dynamic; + +# Note the interface that just changed +update_interface "$iface" "STOP"; + +# If anything has been changed, update sendmail.cf and reload +update_sendmail; + +exit 0; diff --git a/debian/examples/ppp/ip-down.d/sendmail.md5sum b/debian/examples/ppp/ip-down.d/sendmail.md5sum new file mode 100644 index 0000000..6afd10a --- /dev/null +++ b/debian/examples/ppp/ip-down.d/sendmail.md5sum @@ -0,0 +1 @@ +fb749db92b73eca0480702c59f6b09ed sendmail diff --git a/debian/examples/ppp/ip-up.d/sendmail.1.old b/debian/examples/ppp/ip-up.d/sendmail.1.old new file mode 100644 index 0000000..cae3e1f --- /dev/null +++ b/debian/examples/ppp/ip-up.d/sendmail.1.old @@ -0,0 +1,130 @@ +#!/bin/sh +# +# This script is called when ppp connects to the network. +# +# Here is where we'll start sendmail if needed, and will +# run the queue in either case. +# +# Written By Richard Nelson <cowboy@debian.org> +# +# NOTE: The following lines (without the #) must be in /etc/mail/sendmail.mc: +# include(`/etc/mail/dialup.m4')dnl +# include(`/etc/mail/provider.m4')dnl +# +# ALSO: make sure ipparam is specified somewhere in the ppp options; +# it will be used as the name of a file in /etc/mail/peers +# +# Exit by default, check for validity before commenting out the next line: +exit 0; + +# Define our domain name (from PPP) for sendmail. + +# These variables are for the use of the scripts run by run-parts +#PPP_IFACE="$1"; +#PPP_TTY="$2"; +#PPP_SPEED="$3"; +#PPP_LOCAL="$4"; +#PPP_REMOTE="$5"; +#PPP_IPPARAM="$6"; + +if [ ! -z "$PPP_LOCAL" ]; then + addr=$PPP_LOCAL; + provider=$PPP_IPPARAM; +else + addr=$1; + provider=$2; + fi; + +# Determine our fqdn from our ISP +maxloop=20; +cntr=0; +name=""; +until (test ! -z "$name"); do + cntr=$(($cntr+1)); + rev=$(host $addr); + name=$(echo "$rev" | grep '^Name:' | awk '{print $2}'); + if [ -z "$name" ]; then + name=${rev##*domain name pointer }; + name=${name%.}; + fi; + test=$(echo $name | cut -d ' ' -f 1); + if [ "$name" != "**" ]; then + break; + elif (($cntr > $maxloop)); then + name=''; + break; + fi; + done; +echo "addr=$addr, name=$name"; + +file="/etc/mail/dialup.m4"; +#file="dialup.m4"; +if [ ! -z "$name" ]; then + cat <<-EOT > $file; + LOCAL_CONFIG + #------------------------------------------------------------ + # + # Dynamic updates from $0 + # + # NOTE: the following line *MUST* be in /etc/mail/sendmail.mc + dnl include(\`/etc/mail/dialup.m4')dnl + # + # Chose one of the following options: + # * Add our true hostname as a Virtual Host (we'll accept + # mail for it, but keep our local name for SMTP AUTH, etc) + dnl C{VirtHost}$name + # * Define our true hostname (from our ISP) becomes \$j + dnl define(\`confDOMAIN_NAME', \`$name')dnl + # + # Make sure we accept mail as this name (for bounces, etc) + Cw$name + # Add our hostname to class G for genericstable support + CG$name + #------------------------------------------------------------ + EOT + fi; + +# Add smarthost information (if any)... But not if provider.m4 is a link ! +file="/etc/mail/provider.m4"; +#file="provider.m4"; +if [ -f /etc/mail/peers/$provider -a ! -L $file ]; then + cat <<-EOT > $file; + LOCAL_CONFIG + #------------------------------------------------------------ + # + # Dynamic updates from $0 + # + # NOTE: the following line *MUST* be in /etc/mail/sendmail.mc + dnl include(\`/etc/mail/provider.m4')dnl + # + # Provider information from /etc/mail/peers/$provider + EOT + cat /etc/mail/peers/$provider >> $file; + cat <<-EOT >> $file; + #------------------------------------------------------------ + EOT + fi; +#exit 0 + +# Build a new sendmail.cf from sendmail.mc, including our address. +# NOTE: The following lines (without the #) must be in /etc/mail/sendmail.mc: +# include(`/etc/mail/dialup.m4')dnl +# include(`/etc/mail/provider.m4')dnl +m4 /etc/mail/sendmail.mc \ + > /etc/mail/sendmail.cf.pnew; +chmod 0644 /etc/mail/sendmail.cf.pnew; +chown mail:mail /etc/mail/sendmail.cf.pnew; +mv -f /etc/mail/sendmail.cf.pnew /etc/mail/sendmail.cf; + +# Purge any latent host status that might cause us to *NOT* send mail +AM='-Am'; +if [ ! -f /usr/share/sendmail/cf/feature/msp.m4 ]; then + AM=''; + fi; +sendmail $AM -bH -O Timeout.hoststatus=1s; + +# Start/reload sendmail as needed +/etc/init.d/sendmail reload; # may be up, or down + +# Process the sendmail queue (background so as to not defer other ip-up work) +runq & diff --git a/debian/examples/ppp/ip-up.d/sendmail.in b/debian/examples/ppp/ip-up.d/sendmail.in new file mode 100644 index 0000000..5c26de8 --- /dev/null +++ b/debian/examples/ppp/ip-up.d/sendmail.in @@ -0,0 +1,57 @@ +#!/bin/sh +# +# This script is called when ppp connects to the network. +# +# Here is where we'll start sendmail if needed. +# +# Written By Richard Nelson <cowboy@debian.org> +# +# NOTE: The following lines (without the #) must be in /etc/mail/sendmail.mc: +# include(`/etc/mail/dialup.m4')dnl +# include(`/etc/mail/provider.m4')dnl +# +# ALSO: make sure ipparam is specified somewhere in the ppp options; +# it will be used as the name of a file in /etc/mail/peers +# + +# Define our domain name (from PPP) for sendmail. + +# These variables are for the use of the scripts run by run-parts +#PPP_IFACE="$1"; +#PPP_TTY="$2"; +#PPP_SPEED="$3"; +#PPP_LOCAL="$4"; +#PPP_REMOTE="$5"; +#PPP_IPPARAM="$6"; + +if [ ! -z "$PPP_LOCAL" ]; then + addr=$PPP_LOCAL; + provider=$PPP_IPPARAM; + iface=$PPP_IFACE; +else + addr=$1; + provider=$2; + iface=$3; + fi; + +if [ -z "$provider" ]; then + exit 0; + fi; + +# Bring in some script functions to handle dynamic configuration +. @datadir@/sendmail/dynamic; + +# Note the interface that just changed +update_interface "$iface" "BOUND"; + +# If the domain name has changed, update the provider information +update_provider "$provider"; + +# If the ip address has changed, update the host information +update_host "$addr"; + +# If anything has been changed, update sendmail.cf and reload +update_sendmail; + +exit 0; + diff --git a/debian/examples/ppp/ip-up.d/sendmail.md5sum b/debian/examples/ppp/ip-up.d/sendmail.md5sum new file mode 100644 index 0000000..d8e607f --- /dev/null +++ b/debian/examples/ppp/ip-up.d/sendmail.md5sum @@ -0,0 +1 @@ +2b0ad0f52c1c7562311b6a4f49340072 sendmail diff --git a/debian/examples/resolvconf/update-libc.d/sendmail.in b/debian/examples/resolvconf/update-libc.d/sendmail.in new file mode 100644 index 0000000..4b135a8 --- /dev/null +++ b/debian/examples/resolvconf/update-libc.d/sendmail.in @@ -0,0 +1,15 @@ +#!/bin/sh + +# Make sendmail aware of changes to resolv.conf +# so that we can reset the statistics for unresolvable hostnames + +# Purge any latent host status that might cause us to *NOT* send mail +AM='-Am'; +if [ ! -f @datadir@/sendmail/cf/feature/msp.m4 ]; then + AM=''; + fi; +@sbindir@/sendmail $AM -bH -O Timeout.hoststatus=1s; + +# Start/reload sendmail as needed +#@sysconfdir@/init.d/sendmail reload || true; + diff --git a/debian/examples/sasl/Sendmail.conf b/debian/examples/sasl/Sendmail.conf.1 index b41887b..5456864 100644 --- a/debian/examples/sasl/Sendmail.conf +++ b/debian/examples/sasl/Sendmail.conf.1 @@ -13,6 +13,8 @@ #*** For a more detailed guide on configuring SASL, please look at #doc/sysadmin.html. # +auto_transition: true #pwcheck_method: sasldb +#pwcheck_method: saslauthd +#pwcheck_method: PAM pwcheck_method: PAM -auto_transition: true diff --git a/debian/examples/sasl/Sendmail.conf.2 b/debian/examples/sasl/Sendmail.conf.2 new file mode 100644 index 0000000..e627485 --- /dev/null +++ b/debian/examples/sasl/Sendmail.conf.2 @@ -0,0 +1,23 @@ +#Currently configurable parameters: +#- srvtab (for KERBEROS_V4): [/etc/srvtab] path +# where to find the srvtab +# +#- pwcheck_method: [PAM] one of {PAM, kerberos_v4, passwd, shadow, sasldb} +# how to check plaintext passwords. +# +#- auto_transition: [false] +# if true, automatically add secrets to the secret database when +# PLAIN or check_password is used, so in the future the user can +# use the more secure mechanisms. +# +#*** For a more detailed guide on configuring SASL, please look at +#doc/sysadmin.html. +# +auto_transition: true +pwcheck_method: saslauthd +pwcheck_method: auxprop saslauthd +auxprop_plugin: sasldb +allowanonymouslogin: 0 +allowplaintext: 1 +mech_list: EXTERNAL DIGEST-MD5 CRAM-MD5 NTLM LOGIN PLAIN + diff --git a/debian/examples/sasl/sasl.m4.in b/debian/examples/sasl/sasl.m4.in new file mode 100644 index 0000000..0eb8dcc --- /dev/null +++ b/debian/examples/sasl/sasl.m4.in @@ -0,0 +1,81 @@ +divert(-1)dnl +#----------------------------------------------------------------------------- +# $Sendmail: sasl.m4,v @sm_version@ @sm_date@ @sm_time@ cowboy Exp $ +# +# Copyright (c) 2003-@SM_CPYRT@ Richard Nelson. All Rights Reserved. +# +# @configure_input@ +# +# sasl.m4 m4 file to support user->MTA, MSP->MTA, and MTA->MTA +# encryption and/or authentication. +# +# To use this file, add this line to sendmail.mc and possibly submit.mc: +# `include(`@sysconfdir@/mail/sasl/sasl.m4')dnl' +# +#----------------------------------------------------------------------------- +# +divert(0)dnl +VERSIONID(`$Id: sasl.m4, v @sm_version@@sm_revision@ @sm_date@ @sm_time@ cowboy Exp $') +dnl # +dnl #--------------------------------------------------------------------- +dnl # Bring in Autoconf results +dnl #--------------------------------------------------------------------- +ifdef(`sm_version', `dnl' , +`include(`@datadir@/sendmail/cf/debian/autoconf.m4')')dnl +dnl # +dnl #--------------------------------------------------------------------- +dnl # SMTP AUTH (SASL) support (sendmail 8.10.0 +) +dnl # PLAIN/LOGIN needed to support SASL auth via PAM ;( +dnl # if this bothers you, you allow them only in conjunction w/STARTTLS ! +dnl #--------------------------------------------------------------------- +ifelse(eval(sm_version_math >= 526848), `1', `dnl +ifelse(sm_enable_auth, `yes', `dnl +dnl # +dnl # Set a more reasonable timeout on negotiation +dnl # +define(`confTO_AUTH', `2m')dnl # , def=10m +dnl # +dnl # Do not touch anything above this line... +dnl # +dnl # Available Authentication methods +dnl # +define(`confAUTH_MECHANISMS',dnl +`DIGEST-MD5 CRAM-MD5 NTLM PLAIN LOGIN')dnl +dnl # +dnl # These, we will trust for relaying +dnl # +TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 NTLM PLAIN LOGIN') +dnl # +dnl # for 8.12.0+, add EXTERNAL as an available & trusted mech (w/STARTTLS) +dnl # and allow sharing of /etc/sasldb(2) file, allow group read/write +dnl # +ifelse(eval(sm_version_math >= 527360), `1', `dnl +define(`confAUTH_MECHANISMS',dnl +`EXTERNAL 'defn(`confAUTH_MECHANISMS'))dnl +TRUST_AUTH_MECH(`EXTERNAL') +define(`confDONT_BLAME_SENDMAIL',dnl +defn(`confDONT_BLAME_SENDMAIL')`,GroupReadableSASLDBFile,GroupWritableSASLDBFile')dnl +')dnl +dnl # +dnl # To support SMTP AUTH in `sendmail -bs' : +dnl # Sigh: SASLV1 MSP AUTH does not work in -bs mode (/etc/sasldb !o+r) +dnl # so, we have the MSP not use Auth (or ETRN) +dnl # SASLV2 (w/saslauth) chose to prohibit user authentication - it can +dnl # be made to work by: +dnl # 1) changing /etc/sasldb2 {root,sasl,smmta}:smmsp 0660 +dnl # 2) dpkg-statoverride --remove /var/run/saslauthd +dnl # 3) dpkg-statoverride --add root sasl 711 /var/run/saslauthd +dnl # +ifelse(eval(sm_auth_lib < 2), `1', `dnl +ifdef(`DEBIAN_MSP', `dnl +ifelse(defn(`_DPO_'), `', `dnl +DAEMON_OPTIONS(`Name=NoMTA, Addr=0.0.0.0, M=EA')dnl +')')')dnl +dnl # +dnl # Define the REALM passed to sasl (8.13.0+) +ifelse(eval(sm_version_math >= 527616), `1', `dnl +dnl define(`confAUTH_REALM', `')dnl # Fill this in and uncomment it +')dnl +dnl # +dnl # Do not touch anything below this line... +')')dnl diff --git a/debian/examples/sasl/saslpasswd.conf b/debian/examples/sasl/saslpasswd.conf.1 index dfcc7b7..bc9a86e 100644 --- a/debian/examples/sasl/saslpasswd.conf +++ b/debian/examples/sasl/saslpasswd.conf.1 @@ -13,5 +13,5 @@ #*** For a more detailed guide on configuring SASL, please look at #doc/sysadmin.html. # -pwcheck_method: sasldb auto_transition: true +pwcheck_method: sasldb diff --git a/debian/examples/sasl/saslpasswd.conf.2 b/debian/examples/sasl/saslpasswd.conf.2 new file mode 100644 index 0000000..e2f849b --- /dev/null +++ b/debian/examples/sasl/saslpasswd.conf.2 @@ -0,0 +1,21 @@ +#Currently configurable parameters: +#- srvtab (for KERBEROS_V4): [/etc/srvtab] path +# where to find the srvtab +# +#- pwcheck_method: [PAM] one of {PAM, kerberos_v4, passwd, shadow, sasldb} +# how to check plaintext passwords. +# +#- auto_transition: [false] +# if true, automatically add secrets to the secret database when +# PLAIN or check_password is used, so in the future the user can +# use the more secure mechanisms. +# +#*** For a more detailed guide on configuring SASL, please look at +#doc/sysadmin.html. +# +#auto_transition: true +pwcheck_method: saslauthd +#auxprop_plugin: sasldb +allowanonymouslogin: 0 +allowplaintext: 1 +mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5 diff --git a/debian/cf/debian/starttls.m4.in b/debian/examples/tls/starttls.m4.in index d9de9d0..dd45c0a 100644 --- a/debian/cf/debian/starttls.m4.in +++ b/debian/examples/tls/starttls.m4.in @@ -24,8 +24,17 @@ ifdef(`sm_version', `dnl', `include(`@datadir@/sendmail/cf/debian/autoconf.m4')dnl') dnl # dnl # Check to see if inclusion is valid (version >= 8.11.0, tls enabled) -ifelse(eval(sm_version_math >= 527104), `1', dnl -`ifelse(sm_enable_tls, `yes', `dnl +ifelse(eval(sm_version_math >= 527104), `1', `dnl +ifelse(sm_enable_tls, `yes', `dnl +dnl # +dnl # To support shared keyfiles, we need it to be group readable +dnl # +define(`confDONT_BLAME_SENDMAIL',dnl + defn(`confDONT_BLAME_SENDMAIL')`,GroupReadableKeyFile')dnl +dnl # +dnl # Set a more reasonable timeout on negotiation +dnl # +define(`confTO_STARTTLS', `2m')dnl # , def=10m dnl # dnl # Do not touch anything above this line... dnl # @@ -46,7 +55,7 @@ define(`confCLIENT_CERT', `@sysconfdir@/mail/tls/sendmail-client.crt')dnl define(`confCLIENT_KEY', `@sysconfdir@/mail/tls/sendmail-common.key')dnl dnl # dnl # Optional settings -dnl define(`confTLS_SRV_OPTIONS', `V')dnl # don't request user certs +define(`confTLS_SRV_OPTIONS', `V')dnl # do not request user certs dnl # dnl # Do not touch anything below this line... -)')dnl +')')dnl diff --git a/debian/faq.txt b/debian/faq.txt index 7907d48..840b762 100644 --- a/debian/faq.txt +++ b/debian/faq.txt @@ -4,12 +4,10 @@ Sendmail Frequently Asked Questions (FAQ) - Last updated March 3, 2003 + Last updated January 12, 2005 Comments and questions on this FAQ should be directed to sendmail+faq@sendmail.org. - General questions about sendmail should be directed to - sendmail-questions@sendmail.org. Bug reports should be directed to sendmail-bugs@sendmail.org. If you post a message to comp.mail.sendmail and send it to one of the @@ -34,7 +32,7 @@ Table of Contents + 2.1 What is this newsgroup? + 2.2 What is the scope of this FAQ? + 2.3 Where can I find the latest version of this FAQ? - + 2.4 How do I access comp.mail.sendmail by email? + + 2.4 deprecated + 2.5 Where can I ask email-related DNS questions? + 2.6 How can I subscribe to these newsgroups? + 2.7 Which version of sendmail should I run? @@ -156,6 +154,9 @@ Table of Contents recipient addresses? + 4.21 How can I send mail to all users? + 4.22 Why can't I receive external mail? + + 4.23 How do I restrict attachments with sendmail? + + 4.24 Can I get sendmail to verify an entire e-mail address + instead of just the domain? * 5. VENDOR/OS SPECIFIC SENDMAIL ISSUES + 5.1 Sun Microsystems SunOS/Solaris 1.x/2.x o 5.1.1 How can I solve "line 273: replacement $3 out of @@ -237,7 +238,7 @@ Table of Contents * 2.1 What is this newsgroup? * 2.2 What is the scope of this FAQ? * 2.3 Where can I find the latest version of this FAQ? - * 2.4 How do I access comp.mail.sendmail by email? + * 2.4 (deprecated) * 2.5 Where can I ask email-related DNS questions? * 2.6 How can I subscribe to these newsgroups? * 2.7 Which version of sendmail should I run? @@ -345,18 +346,7 @@ Q2.3 -- Where can I find the latest version of this FAQ? http://www.sendmail.org/faq/. _________________________________________________________________ -Q2.4 -- How do I access comp.mail.sendmail by email? - - Date: November 24, 1996 - - Send email to mxt@dl.ac.uk with the command "sub - comp-news.comp.mail.sendmail full-US-ordered-email-address" as the - body of the message (with your correct address in place of the - "full-US-ordered-email-address", and omitting the double quotes in all - cases of this example). - - E-mail you want posted on comp.mail.sendmail should be sent to - comp-mail-sendmail@dl.ac.uk +Q2.4 -- has been deprecated. _________________________________________________________________ Q2.5 -- Where can I ask email-related DNS questions? @@ -473,16 +463,24 @@ Q2.7 -- Which version of sendmail should I run? Q2.8 -- What is the latest release of sendmail? Date: October 24, 1997 - Updated: March 3, 2003 + Updated: January 12, 2005 - For version 8 sendmail, there are four release trees. + For version 8 sendmail, there are five release trees. For those people who, for whatever reason, are unable or unwilling to - upgrade to version 8.12.x, releases of versions 8.11, 8.10 and 8.9 - sendmail are still available but are not being updated. The last + upgrade to version 8.13.x, releases of versions 8.12, 8.11, 8.10 and + 8.9 sendmail are still available but are not being updated. The last release of version 8.9 sendmail was 8.9.3; the last release of 8.10 - was 8.10.2; the last release of 8.11 was 8.11.6 . - + was 8.10.2; the last release of 8.11 was 8.11.6; the last release of + 8.12 was 8.12.11 . + + Version 8.13.3 was released on January 11, 2005. + Version 8.13.2 was released on December 15, 2004. + Version 8.13.1 was released on July 30, 2004. + Version 8.13.0 was released on June 20, 2004. + Version 8.12.11 was released on January 18, 2004. + Version 8.12.10 was released on September 17, 2003. + Version 8.12.9 was released on March 29, 2003. Version 8.12.8 was released on March 3, 2003. Version 8.12.7 was released on December 29, 2002. Version 8.12.6 was released on August 26, 2002. @@ -508,8 +506,8 @@ Q2.8 -- What is the latest release of sendmail? Version 8.9.0 was released on May 20, 1998. On machines exposed directly to the Internet, you should either - already be running sendmail 8.12.8 or plan on upgrading in the - immediate future. 8.12.8 is considered "stable", has fixes included + already be running sendmail 8.13.3 or plan on upgrading in the + immediate future. 8.13.3 is considered "stable", has fixes included that will not be found in any previous release, and therefore supercedes all previous releases. @@ -942,6 +940,7 @@ Q3.4 -- So what was the user database feature intended for? Q3.5 -- Why the hostility toward using full names for email addresses? Date: May 12, 1997 + Updated: April 7, 2004 Because full names are not unique. For example, the computer community has two Peter Deutsches. At one time, Bell Labs had two Stephen R. @@ -949,6 +948,9 @@ Q3.5 -- Why the hostility toward using full names for email addresses? addresses (e.g., Stephen_R_Bourne_2), but that's even worse -- which one of them has to have their name desecrated in this way? And you can bet that one of them will get most of the other person's email. + Moreover, at institutions with high turnover (such as universities), a + given name may refer to different people at different times, which can + again lead to mail going to the wrong person. So called "full names" are just an attempt to create longer versions of unique names. Rather that lulling people into a sense of security, @@ -1331,6 +1333,7 @@ Q3.22 -- How do I configure sendmail not to use DNS? Date: March 24, 1997 Updated: April 6, 2000 Updated: June 4, 2002 + Updated: January 14, 2004 In situations where you're behind a firewall, or across a dial-up line, there are times when you need to make sure that programs (such @@ -1358,6 +1361,10 @@ define(`SMART_HOST', `name.of.smart.host')dnl .mc file: FEATURE(`accept_unresolvable_domains')dnl FEATURE(`accept_unqualified_senders')dnl + + And starting with 8.12, changes to submit.cf are required as well; the + following in your submit.mc can minimize the problem: +define(`confDIRECT_SUBMISSION_MODIFIERS', `C')dnl _________________________________________________________________ Q3.23 -- How do I get all my queued mail delivered to my Unix box from my ISP? @@ -1491,6 +1498,8 @@ multiple users in a virtual domain go to a single mailbox? Date: July 2, 1998 Updated: June 21, 2002 + Fixed typo: October 10, 2003 + Updated URL: April 6, 2004 Stuffing multiple user's mail into a single mail box is not a good method of distributing user mail but if you must do this, the @@ -1511,7 +1520,7 @@ ENV_TO=$1 :0f * ENV_TO ?? . -| formail -i "X-Envelope-To: "$ENV_TO@$DOMAIN +| formail -i "X-Envelope-To: $ENV_TO@$DOMAIN" :0fE | formail -i "X-Envelope-To: UNKNOWN" @@ -1819,20 +1828,33 @@ Q3.38 -- What does "may be forged" mean? Q3.39 -- How do I send using an alternate port? Date: May 5, 2002 + Updated: January 10, 2004 + + The port used for outgoing SMTP connections can be changed via the + respective *_MAILER_ARGS macros for the various SMTP mailers. In a + default configuration, sendmail uses either the relay mailer (for e.g. + SMART_HOST when no mailer is specified) or the esmtp mailer (when + sending directly to the MX of the recipient domain). - You can have Sendmail use port 2525 when sending to your domain. - define(`SMTP_MAILER_ARGS', `TCP $h 2525') + So, if you want all outgoing SMTP connections to use port 2525, you + can use this in your .mc file: + define(`RELAY_MAILER_ARGS', `TCP $h 2525') + define(`ESMTP_MAILER_ARGS', `TCP $h 2525') - or editing .cf directly, - A=TCP $h 2525 + If you want to use an alternate port only for specific destinations, + change (e.g.) only the RELAY_MAILER_ARGS, and make sure the relay + mailer is not used for anything else. E.g. you can have sendmail use + port 2525 only when sending to your domain with this in your .mc file: + FEATURE(`mailertable') + define(`confRELAY_MAILER', `esmtp') + define(`RELAY_MAILER_ARGS', `TCP $h 2525') - will force sendmail to use port 2525. But, this will be for all SMTP - connections. To do it only for your domain, use /etc/mail/mailertable, - yourdomain.com mysmtp:mail.yourdomain.com + and then in your mailertable: + yourdomain.com relay:mail.yourdomain.com - where 'mysmtp' is an exact duplicate of the 'esmtp' mailer definition, - except for the port number in 'A=...'. Of course, change 2525 to - whatever alternate port number you wish to use. + This will force sendmail to use port 2525 for connections to + yourdomain.com. Of course, change 2525 to whatever alternate port + number you wish to use. _________________________________________________________________ Q3.40 -- Why can't I use BerkeleyDB 4.1.x? @@ -1971,6 +1993,9 @@ FEATURE(`msp', `[127.0.0.1]')dnl recipient addresses? * 4.21 How can I send mail to all users? * 4.22 Why can't I receive external mail? + * 4.23 How do restrict attachments with sendmail? + * 4.24 Can I get sendmail to verify an entire e-mail address instead + of just the domain? _________________________________________________________________ Q4.1 -- Should I use a wildcard MX for my domain? @@ -2293,6 +2318,7 @@ delivering local mail immediately? Date: October 14, 1997 Updated: February 9, 1999 + Updated: May 19, 2004 First, you need to get sendmail not to use DNS on your local machine so your host doesn't trying to connect to your ISP for a DNS query. @@ -2313,6 +2339,9 @@ delivering local mail immediately? Finally, you need to run a program periodically to check in with your ISP and get them to deliver any mail they may have queued for you. See Q3.23. + + Andrzej Filip offers a different solution based on use of the dsmtp + mailer (introduced in 8.10) instead of expensive mailers. _________________________________________________________________ Subject: Q4.13 -- What does "unknown mailer error 1" mean? @@ -2333,6 +2362,7 @@ Subject: Q4.14 -- How do I queue mail for another domain? Date: April 28, 1999 Updated: December 21, 2000 + Updated: May 19, 2004 Situation: Your system mailserver.my.domain should act as a backup mailserver for mailserver.destination.domain. The client wants to @@ -2356,6 +2386,11 @@ mailserver.destination.domain. IN MX 20 mailserver.my.domain. destination.domain to the required files (8.9) (or for 8.8). Don't add destination.domain or mailserver.destination.domain to class w on your system! + If you want finer-grained control, then instead of updating + /etc/mail/relay-domains, add the following to /etc/mail/access, as + the access map entries allows relaying only "To:" a domain, while + relay-domains allows both directions. +To:destination.domain RELAY 3. sendmail on your system will try to deliver mail during queue runs, however, the client may trigger delivery by using the ETRN command. @@ -2516,6 +2551,7 @@ alluser: :include:/etc/mail/allusers Subject: Q4.22 -- Why can't I receive external mail? Date: December 4, 2002 + Updated: August 16, 2004 Several vendors have changed the way that sendmail is run. They decided that most people need a client-only version of sendmail. So it @@ -2524,7 +2560,8 @@ Subject: Q4.22 -- Why can't I receive external mail? of where some vendors ship their sendmail configuration hierarchy: sendmail distribution ./cf - Solaris /usr/lib/mail + Solaris 7,8,9 /usr/lib/mail + Solaris 10 /etc/mail/cf Red Hat 6.2 /usr/lib/sendmail-cf Red Hat 7 /usr/share/sendmail-cf Slackware 7.1 /usr/src/sendmail/cf @@ -2536,6 +2573,38 @@ Subject: Q4.22 -- Why can't I receive external mail? See also 5.3.1.3 for discussion about this problem as it relates specifically to Red Hat 7.1 and later. + _________________________________________________________________ + +Subject: Q4.23 -- How do I restrict attachments with sendmail? + + Date: May 19, 2004 + + sendmail itself does not look at the content of a message, so it is + not in a position to strip attachments. You need a filtering package + that works with sendmail. You might want to look at www.milter.org for + some open source solutions that use our "milter" facility. There's + also something called MIMEDefang that can do it. You can also get + commercial products to do it (see www.sendmail.com for example). + _________________________________________________________________ + +Subject: Q4.24 -- Can I get sendmail to verify an entire e-mail address instead +of just the domain? + + Date: May 19, 2004 + + If the e-mail comes from example.com, you have to look up the MX or A + records for example.com to figure out which mail server to ask if the + user is valid. The DNS could be slow or unresponsive. The remote + server could be slow or unresponsive. + + If you were to make such checks, a bad guy could bombard you with mail + claiming to come from hotmail.com users, and then suddenly you would + be connection-bombing Hotmail's mail servers asking them about the + recipients the bad guy is claiming to be. + + The only safe way to do this is to verify that the sender exists when + the sender claims to be in your domain. Naturally you are then in a + position to confirm or deny the sender is valid. sendmail.org diff --git a/debian/libmilter-dev.dirs.in b/debian/libmilter-dev.dirs.in deleted file mode 100644 index 2a5f027..0000000 --- a/debian/libmilter-dev.dirs.in +++ /dev/null @@ -1,3 +0,0 @@ -@includedir@/libmilter -@libdir@/libmilter -@docdir@/libmilter-dev diff --git a/debian/libmilter-dev.links b/debian/libmilter-dev.links new file mode 100644 index 0000000..9038370 --- /dev/null +++ b/debian/libmilter-dev.links @@ -0,0 +1,3 @@ +usr/share/bug/sendmail usr/share/bug/libmilter-dev +usr/lib/libmilter.so.0 usr/lib/libmilter/libmilter.so.0 +usr/lib/libmilter.so usr/lib/libmilter/libmilter.so diff --git a/debian/libmilter-dev.postinst b/debian/libmilter-dev.postinst deleted file mode 100644 index bf0ac2a..0000000 --- a/debian/libmilter-dev.postinst +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/sh -e -# -# Debian post installation script -# -# Install of already installed package: -# 1) old-prerm upgrade new-version -# *) new-prerm failed-upgrade old-version -# *) old-postinst abort-upgrade new-version -# -# If a `conflicting' package is being removed at the same time: -# 1) forall packages depending on conflicting package and --auto-deconfigure -# deconfigured's-prerm deconfigure \ -# in-favour package-being-installed version \ -# removing conflicting-package version -# *) deconfigured's-postinst abort-deconfigure \ -# in-favour package-being-installed-but-failed version \ -# removing conflicting-package version -# 2) To prepare for removal of the conflicting package -# conflictor's-prerm remove \ -# in-favour package new-version -# *) conflictor's-postinst abort-remove \ -# in-favour package new-version -# -# Configuration of package: -# postinst configure most-recently-configured-version -# -set -e; - -PACKAGE=`echo "$(basename $0)" | sed -e 's/\.postinst$//'`; - -case "$1" in - configure) - # continue below - ;; - - abort-upgrade|abort-remove|abort-deconfigure) - exit 0; - ;; - - *) - echo "$PACKAGE postinst called with unknown argument \`$1'" >&2; - exit 1; - ;; - esac; - -#DEBHELPER# -exit 0; diff --git a/debian/libmilter-dev.prerm b/debian/libmilter-dev.prerm deleted file mode 100644 index 966dfdd..0000000 --- a/debian/libmilter-dev.prerm +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/sh -e -# -# Debian pre removal script -# -# Install of already installed package: -# 1) old-prerm upgrade new-version -# *) new-prerm failed-upgrade old-version -# *) old-postinst abort-upgrade new-version -# -# If a `conflicting' package is being removed at the same time: -# 1) forall packages depending on conflicting package and --auto-deconfigure -# deconfigured's-prerm deconfigure \ -# in-favour package-being-installed version \ -# removing conflicting-package version -# *) deconfigured's-postinst abort-deconfigure \ -# in-favour package-being-installed-but-failed version \ -# removing conflicting-package version -# 2) To prepare for removal of the conflicting package -# conflictor's-prerm remove \ -# in-favour package new-version -# *) conflictor's-postinst abort-remove \ -# in-favour package new-version -# -# Removal of a package: -# 1) prerm remove -# 2) The package's files are removed (except conffiles). -# 3) postrm remove -# 4) All the maintainer scripts except the postrm are removed. -# -set -e; - -PACKAGE=`echo "$(basename $0)" | sed -e 's/\.prerm$//'`; - -case "$1" in - remove) - ;; - - upgrade) - ;; - - failed-upgrade) - ;; - - deconfigure) - ;; - - *) - echo "$PACKAGE prerm called with unknown argument \`$1'" >&2; - exit 1; - ;; - esac; - -#DEBHELPER# -exit 0; diff --git a/debian/libmilter0.links b/debian/libmilter0.links new file mode 100644 index 0000000..8584867 --- /dev/null +++ b/debian/libmilter0.links @@ -0,0 +1,2 @@ +usr/share/bug/sendmail usr/share/bug/libmilter0 +usr/lib/libmilter.so.0 usr/lib/libmilter.so diff --git a/debian/local/Makefile.in b/debian/local/Makefile.in index be8f93f..59a51c5 100644 --- a/debian/local/Makefile.in +++ b/debian/local/Makefile.in @@ -1,3 +1,275 @@ +# Makefile.in generated by automake 1.9.4 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = local +DIST_COMMON = $(dist_man_MANS) $(dist_pkgdata_SCRIPTS) \ + $(dist_sbin_SCRIPTS) $(nobase_dist_data_DATA) \ + $(nobase_dist_sysconf_DATA) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/Parse_conf.pm.in \ + $(srcdir)/Parse_mc.pm.in $(srcdir)/dynamic.in \ + $(srcdir)/parse_mc.in $(srcdir)/sendmail.in \ + $(srcdir)/sendmailconfig.in $(srcdir)/update_auth.in \ + $(srcdir)/update_authm4.in $(srcdir)/update_conf.in \ + $(srcdir)/update_db.in $(srcdir)/update_ldap.in \ + $(srcdir)/update_mc.in $(srcdir)/update_mk.in \ + $(srcdir)/update_smrsh.in $(srcdir)/update_sys.in \ + $(srcdir)/update_tls.in $(srcdir)/update_tlsm4.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/./build/mkinstalldirs +CONFIG_CLEAN_FILES = Parse_conf.pm Parse_mc.pm dynamic parse_mc \ + sendmailconfig sendmail update_auth update_authm4 update_conf \ + update_db update_ldap update_mc update_mk update_smrsh \ + update_sys update_tls update_tlsm4 +am__installdirs = "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(sbindir)" \ + "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(datadir)" \ + "$(DESTDIR)$(sysconfdir)" +dist_pkgdataSCRIPT_INSTALL = $(INSTALL_SCRIPT) +dist_sbinSCRIPT_INSTALL = $(INSTALL_SCRIPT) +SCRIPTS = $(dist_pkgdata_SCRIPTS) $(dist_sbin_SCRIPTS) +SOURCES = +DIST_SOURCES = +man8dir = $(mandir)/man8 +NROFF = nroff +MANS = $(dist_man_MANS) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +nobase_dist_dataDATA_INSTALL = $(install_sh_DATA) +nobase_dist_sysconfDATA_INSTALL = $(install_sh_DATA) +DATA = $(nobase_dist_data_DATA) $(nobase_dist_sysconf_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBIAN = @DEBIAN@ +DEBIAN_DH = @DEBIAN_DH@ +DEB_BUILD_ARCH = @DEB_BUILD_ARCH@ +DEB_BUILD_GNU_CPU = @DEB_BUILD_GNU_CPU@ +DEB_BUILD_GNU_SYSTEM = @DEB_BUILD_GNU_SYSTEM@ +DEB_BUILD_GNU_TYPE = @DEB_BUILD_GNU_TYPE@ +DEB_HOST_ARCH = @DEB_HOST_ARCH@ +DEB_HOST_GNU_CPU = @DEB_HOST_GNU_CPU@ +DEB_HOST_GNU_SYSTEM = @DEB_HOST_GNU_SYSTEM@ +DEB_HOST_GNU_TYPE = @DEB_HOST_GNU_TYPE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SM_CPYRT = @SM_CPYRT@ +SM_DATE = @SM_DATE@ +SM_ENABLE_AUTH_FALSE = @SM_ENABLE_AUTH_FALSE@ +SM_ENABLE_AUTH_TRUE = @SM_ENABLE_AUTH_TRUE@ +SM_ENABLE_LDAP_FALSE = @SM_ENABLE_LDAP_FALSE@ +SM_ENABLE_LDAP_TRUE = @SM_ENABLE_LDAP_TRUE@ +SM_ENABLE_TLS_FALSE = @SM_ENABLE_TLS_FALSE@ +SM_ENABLE_TLS_TRUE = @SM_ENABLE_TLS_TRUE@ +SM_MAXVERS = @SM_MAXVERS@ +SM_MINVERS = @SM_MINVERS@ +SM_VERS = @SM_VERS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_STRIP = @ac_ct_STRIP@ +ac_version = @ac_version@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +am_version = @am_version@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +buildtree = @buildtree@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sm_auth_lib = @sm_auth_lib@ +sm_badepends = @sm_badepends@ +sm_build_arch = @sm_build_arch@ +sm_custom = @sm_custom@ +sm_databases = @sm_databases@ +sm_date = @sm_date@ +sm_depends = @sm_depends@ +sm_dist_name = @sm_dist_name@ +sm_dist_vers = @sm_dist_vers@ +sm_editmap_envdef = @sm_editmap_envdef@ +sm_editmap_libs = @sm_editmap_libs@ +sm_enable_auth = @sm_enable_auth@ +sm_enable_bind = @sm_enable_bind@ +sm_enable_dev = @sm_enable_dev@ +sm_enable_doc = @sm_enable_doc@ +sm_enable_hesiod = @sm_enable_hesiod@ +sm_enable_ipv6 = @sm_enable_ipv6@ +sm_enable_ldap = @sm_enable_ldap@ +sm_enable_maillock = @sm_enable_maillock@ +sm_enable_milter = @sm_enable_milter@ +sm_enable_ndbm = @sm_enable_ndbm@ +sm_enable_newdb = @sm_enable_newdb@ +sm_enable_nis = @sm_enable_nis@ +sm_enable_nisplus = @sm_enable_nisplus@ +sm_enable_regex = @sm_enable_regex@ +sm_enable_sfio = @sm_enable_sfio@ +sm_enable_shm = @sm_enable_shm@ +sm_enable_tcpd = @sm_enable_tcpd@ +sm_enable_tls = @sm_enable_tls@ +sm_envdef = @sm_envdef@ +sm_features = @sm_features@ +sm_ffr = @sm_ffr@ +sm_hesiod_parms = @sm_hesiod_parms@ +sm_host_arch = @sm_host_arch@ +sm_incdirs = @sm_incdirs@ +sm_ldap_lib = @sm_ldap_lib@ +sm_libmilter_envdef = @sm_libmilter_envdef@ +sm_libmilter_libs = @sm_libmilter_libs@ +sm_libs = @sm_libs@ +sm_libsm_envdef = @sm_libsm_envdef@ +sm_libsm_libs = @sm_libsm_libs@ +sm_libsmdb_envdef = @sm_libsmdb_envdef@ +sm_libsmdb_libs = @sm_libsmdb_libs@ +sm_libsmutil_envdef = @sm_libsmutil_envdef@ +sm_libsmutil_libs = @sm_libsmutil_libs@ +sm_m4_ffr = @sm_m4_ffr@ +sm_mail_local_envdef = @sm_mail_local_envdef@ +sm_mail_local_libs = @sm_mail_local_libs@ +sm_mailstats_envdef = @sm_mailstats_envdef@ +sm_mailstats_libs = @sm_mailstats_libs@ +sm_makemap_envdef = @sm_makemap_envdef@ +sm_makemap_libs = @sm_makemap_libs@ +sm_mapdef = @sm_mapdef@ +sm_newdb_lib = @sm_newdb_lib@ +sm_praliases_envdef = @sm_praliases_envdef@ +sm_praliases_libs = @sm_praliases_libs@ +sm_recommends = @sm_recommends@ +sm_revision = @sm_revision@ +sm_rmail_envdef = @sm_rmail_envdef@ +sm_rmail_libs = @sm_rmail_libs@ +sm_sendmail_envdef = @sm_sendmail_envdef@ +sm_sendmail_libs = @sm_sendmail_libs@ +sm_smrsh_envdef = @sm_smrsh_envdef@ +sm_smrsh_libs = @sm_smrsh_libs@ +sm_suggests = @sm_suggests@ +sm_time = @sm_time@ +sm_utc = @sm_utc@ +sm_vacation_envdef = @sm_vacation_envdef@ +sm_vacation_libs = @sm_vacation_libs@ +sm_version = @sm_version@ +sm_version_beta = @sm_version_beta@ +sm_version_major = @sm_version_major@ +sm_version_math = @sm_version_math@ +sm_version_minor = @sm_version_minor@ +sm_version_r = @sm_version_r@ +sm_version_v = @sm_version_v@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ + #!/usr/bin/make -f #------------------------------------------------------------------------------ # vim: syntax=make @@ -18,126 +290,394 @@ # # Richard Nelson <cowboy@debian.org> @sm_date@ @sm_time@ (@sm_utc@) #------------------------------------------------------------------------------ -#SHELL=/bin/sh -x - -# Include Debian Autoconf settings --include ../build/autoconf.mk +# +# Shipped programs +# +nobase_dist_data_DATA = \ + bug/sendmail/control \ + bug/sendmail/script -SCRIPTS := \ - parse_mc \ +dist_pkgdata_SCRIPTS = \ + Parse_conf.pm \ Parse_mc.pm \ - sendmailconfig \ - sendmail \ - update_auth \ - update_conf \ - update_db \ - update_mc \ + dynamic \ + parse_mc \ + sendmail \ + update_auth update_authm4 \ + update_conf \ + update_db \ update_ldap \ - update_mk \ - update_notices \ - update_sendmail \ - update_smrsh \ - update_sys \ - update_tcpd \ - update_tls \ - -all: ; - -clean: - rm -rf core *~ qtool.new; - -setup: - for file in $${SCRIPTS}; do \ - chmod ug+x $$file; \ - done; - -build-indep: setup -build-arch: setup - -install-indep: build-indep -install-arch: build-arch - # - # Debian Local additions / changes - # - # ${sysconfdir}/mail - unconditional - # - $(INSTALL) -d -o mail -g mail ${sysconfdir}/mail/peers; - $(INSTALL_DATA) -o mail -g mail provider \ - ${sysconfdir}/mail/peers/provider; - $(INSTALL_DATA) -o mail -g mail service.switch* ${sysconfdir}/mail/; - # - # ${bindir} - unconditional - # - $(INSTALL) -d ${bindir}; - ln -sf ../share/sendmail/sendmail ${bindir}/mailq; - # - # ${sbindir} - unconditional - # - $(INSTALL) -d ${sbindir}; - $(INSTALL) -d ${mandir}/man8; - ln -sf ../share/sendmail/sendmail ${sbindir}/mailstats; - ln -sf ../share/sendmail/sendmail ${sbindir}/purgestat; - ln -sf ../share/sendmail/sendmail ${sbindir}/runq; - $(INSTALL_DATA) runq.8 ${mandir}/man8; - $(INSTALL_SCRIPT) sendmailconfig ${sbindir}; - $(INSTALL_DATA) sendmailconfig.8 ${mandir}/man8; - # - # ${datadir} - conditional - # - if (grep -qEe "^#LDAP:[[:space:]]*yes" ../build/site.config.m4); then \ - $(INSTALL_SCRIPT) update_ldap ${datadir}/sendmail; \ - fi; - if (grep -qEe "^#AUTH:[[:space:]]*yes" ../build/site.config.m4); then \ - $(INSTALL_SCRIPT) update_auth ${datadir}/sendmail; \ - fi; - if (grep -qEe "^#TLS:[[:space:]]*yes" ../build/site.config.m4); then \ - $(INSTALL_SCRIPT) update_tls ${datadir}/sendmail; \ - fi; - # - # ${datadir}/sendmail - unconditional - # - $(INSTALL) -d ${datadir}/sendmail; - $(INSTALL_SCRIPT) parse_mc ${datadir}/sendmail; - $(INSTALL_SCRIPT) Parse_mc.pm ${datadir}/sendmail; - $(INSTALL_SCRIPT) sendmail ${datadir}/sendmail; - $(INSTALL_SCRIPT) update_conf ${datadir}/sendmail; - $(INSTALL_SCRIPT) update_db ${datadir}/sendmail; - $(INSTALL_SCRIPT) update_mc ${datadir}/sendmail; - $(INSTALL_SCRIPT) update_mk ${datadir}/sendmail; - $(INSTALL_SCRIPT) update_notices ${datadir}/sendmail; - $(INSTALL_SCRIPT) update_sendmail ${datadir}/sendmail; - $(INSTALL_SCRIPT) update_smrsh ${datadir}/sendmail; - $(INSTALL_SCRIPT) update_sys ${datadir}/sendmail; - $(INSTALL_SCRIPT) update_tcpd ${datadir}/sendmail; - # - # ${datadir}/sendmail - conditional - # - $(INSTALL) -d ${datadir}/sendmail; - if [ ! -f ${datadir}/sendmail/qtool.pl ]; then \ - sed -e 's?/usr/bin/env perl?/usr/bin/perl?g' \ - qtool.pl > qtool.new; \ - $(INSTALL_SCRIPT) qtool.new ${datadir}/sendmail/qtool.pl; \ - $(INSTALL_DATA) qtool.8 ${mandir}/man8; \ - fi; - # - # ${datadir}/sendmail/cf/feature - conditional - # - $(INSTALL) -d ${datadir}/sendmail/cf/feature; - if [ ! -e ${datadir}/sendmail/cf/feature/local_no_masquerade.m4 ]; then \ - $(INSTALL_DATA) local_no_masquerade.m4 \ - ${datadir}/sendmail/cf/feature; \ - fi; - -#------------- -# Below here is fairly generic really - -source diff: - @echo >&2 'source and diff are obsolete - use dpkg-source -b'; false - -build: build-indep build-arch -install: install-indep install-arch -.PHONY: all -.PHONY: setup -.PHONY: clean build build-indep build-arch -.PHONY: install install-indep install-arch -.PHONY: source diff + update_mc \ + update_mk \ + update_notices \ + update_sendmail \ + update_smrsh \ + update_sys \ + update_tcpd \ + update_tls update_tlsm4 + +dist_sbin_SCRIPTS = \ + sendmailconfig + +# +# Shipped manpages +# +dist_man_MANS = \ + runq.sendmail.8 \ + sendmailconfig.8 + +# +# Shipped data +# +nobase_dist_sysconf_DATA = \ + mail/service.switch \ + mail/service.switch-nodns \ + mail/peers/provider + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu local/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu local/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +Parse_conf.pm: $(top_builddir)/config.status $(srcdir)/Parse_conf.pm.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +Parse_mc.pm: $(top_builddir)/config.status $(srcdir)/Parse_mc.pm.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +dynamic: $(top_builddir)/config.status $(srcdir)/dynamic.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +parse_mc: $(top_builddir)/config.status $(srcdir)/parse_mc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +sendmailconfig: $(top_builddir)/config.status $(srcdir)/sendmailconfig.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +sendmail: $(top_builddir)/config.status $(srcdir)/sendmail.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +update_auth: $(top_builddir)/config.status $(srcdir)/update_auth.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +update_authm4: $(top_builddir)/config.status $(srcdir)/update_authm4.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +update_conf: $(top_builddir)/config.status $(srcdir)/update_conf.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +update_db: $(top_builddir)/config.status $(srcdir)/update_db.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +update_ldap: $(top_builddir)/config.status $(srcdir)/update_ldap.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +update_mc: $(top_builddir)/config.status $(srcdir)/update_mc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +update_mk: $(top_builddir)/config.status $(srcdir)/update_mk.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +update_smrsh: $(top_builddir)/config.status $(srcdir)/update_smrsh.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +update_sys: $(top_builddir)/config.status $(srcdir)/update_sys.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +update_tls: $(top_builddir)/config.status $(srcdir)/update_tls.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +update_tlsm4: $(top_builddir)/config.status $(srcdir)/update_tlsm4.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +install-dist_pkgdataSCRIPTS: $(dist_pkgdata_SCRIPTS) + @$(NORMAL_INSTALL) + test -z "$(pkgdatadir)" || $(mkdir_p) "$(DESTDIR)$(pkgdatadir)" + @list='$(dist_pkgdata_SCRIPTS)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f $$d$$p; then \ + f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ + echo " $(dist_pkgdataSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgdatadir)/$$f'"; \ + $(dist_pkgdataSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgdatadir)/$$f"; \ + else :; fi; \ + done + +uninstall-dist_pkgdataSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(dist_pkgdata_SCRIPTS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ + echo " rm -f '$(DESTDIR)$(pkgdatadir)/$$f'"; \ + rm -f "$(DESTDIR)$(pkgdatadir)/$$f"; \ + done +install-dist_sbinSCRIPTS: $(dist_sbin_SCRIPTS) + @$(NORMAL_INSTALL) + test -z "$(sbindir)" || $(mkdir_p) "$(DESTDIR)$(sbindir)" + @list='$(dist_sbin_SCRIPTS)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f $$d$$p; then \ + f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ + echo " $(dist_sbinSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(sbindir)/$$f'"; \ + $(dist_sbinSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(sbindir)/$$f"; \ + else :; fi; \ + done + +uninstall-dist_sbinSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(dist_sbin_SCRIPTS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ + echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \ + rm -f "$(DESTDIR)$(sbindir)/$$f"; \ + done +uninstall-info-am: +install-man8: $(man8_MANS) $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man8dir)" || $(mkdir_p) "$(DESTDIR)$(man8dir)" + @list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.8*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 8*) ;; \ + *) ext='8' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst"; \ + done +uninstall-man8: + @$(NORMAL_UNINSTALL) + @list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.8*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 8*) ;; \ + *) ext='8' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f '$(DESTDIR)$(man8dir)/$$inst'"; \ + rm -f "$(DESTDIR)$(man8dir)/$$inst"; \ + done +install-nobase_dist_dataDATA: $(nobase_dist_data_DATA) + @$(NORMAL_INSTALL) + test -z "$(datadir)" || $(mkdir_p) "$(DESTDIR)$(datadir)" + @$(am__vpath_adj_setup) \ + list='$(nobase_dist_data_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + $(am__vpath_adj) \ + echo " $(nobase_dist_dataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(datadir)/$$f'"; \ + $(nobase_dist_dataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(datadir)/$$f"; \ + done + +uninstall-nobase_dist_dataDATA: + @$(NORMAL_UNINSTALL) + @$(am__vpath_adj_setup) \ + list='$(nobase_dist_data_DATA)'; for p in $$list; do \ + $(am__vpath_adj) \ + echo " rm -f '$(DESTDIR)$(datadir)/$$f'"; \ + rm -f "$(DESTDIR)$(datadir)/$$f"; \ + done +install-nobase_dist_sysconfDATA: $(nobase_dist_sysconf_DATA) + @$(NORMAL_INSTALL) + test -z "$(sysconfdir)" || $(mkdir_p) "$(DESTDIR)$(sysconfdir)" + @$(am__vpath_adj_setup) \ + list='$(nobase_dist_sysconf_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + $(am__vpath_adj) \ + echo " $(nobase_dist_sysconfDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(sysconfdir)/$$f'"; \ + $(nobase_dist_sysconfDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(sysconfdir)/$$f"; \ + done + +uninstall-nobase_dist_sysconfDATA: + @$(NORMAL_UNINSTALL) + @$(am__vpath_adj_setup) \ + list='$(nobase_dist_sysconf_DATA)'; for p in $$list; do \ + $(am__vpath_adj) \ + echo " rm -f '$(DESTDIR)$(sysconfdir)/$$f'"; \ + rm -f "$(DESTDIR)$(sysconfdir)/$$f"; \ + done +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + $(mkdir_p) $(distdir)/bug/sendmail $(distdir)/mail $(distdir)/mail/peers + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(SCRIPTS) $(MANS) $(DATA) +installdirs: + for dir in "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(datadir)" "$(DESTDIR)$(sysconfdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-dist_pkgdataSCRIPTS install-man \ + install-nobase_dist_dataDATA + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook + +install-exec-am: install-dist_sbinSCRIPTS \ + install-nobase_dist_sysconfDATA + +install-info: install-info-am + +install-man: install-man8 + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-dist_pkgdataSCRIPTS uninstall-dist_sbinSCRIPTS \ + uninstall-info-am uninstall-man uninstall-nobase_dist_dataDATA \ + uninstall-nobase_dist_sysconfDATA + +uninstall-man: uninstall-man8 + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-data-hook install-dist_pkgdataSCRIPTS \ + install-dist_sbinSCRIPTS install-exec install-exec-am \ + install-info install-info-am install-man install-man8 \ + install-nobase_dist_dataDATA install-nobase_dist_sysconfDATA \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \ + uninstall-dist_pkgdataSCRIPTS uninstall-dist_sbinSCRIPTS \ + uninstall-info-am uninstall-man uninstall-man8 \ + uninstall-nobase_dist_dataDATA \ + uninstall-nobase_dist_sysconfDATA + +# +# Local customisation... not automake friendly (should all be SCRIPTS) :( +# +install-data-hook: + chmod a+x ${DESTDIR}${datadir}/bug/sendmail/script; + ${LN_S} sendmail ${DESTDIR}${pkgdatadir}/hoststat; + ${LN_S} sendmail ${DESTDIR}${pkgdatadir}/mailstats; + ${LN_S} sendmail ${DESTDIR}${pkgdatadir}/mailq; + ${LN_S} sendmail ${DESTDIR}${pkgdatadir}/newaliases; + ${LN_S} sendmail ${DESTDIR}${pkgdatadir}/purgestat; + ${LN_S} sendmail ${DESTDIR}${pkgdatadir}/runq; + ${LN_S} sendmail ${DESTDIR}${pkgdatadir}/status; +# +# Debian targets, phase out +# +.PHONY: build-indep build-arch +.PHONY: install-indep install-arch +build-indep: +build-arch: +install-indep: install +install-arch: +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/debian/local/Parse_conf.pm.in b/debian/local/Parse_conf.pm.in new file mode 100644 index 0000000..ec1da84 --- /dev/null +++ b/debian/local/Parse_conf.pm.in @@ -0,0 +1,961 @@ +#!/usr/bin/perl -w +#------------------------------------------------------------------------ +# +# $Sendmail: Parse_conf.pm,v @sm_version@ @sm_date@ @sm_time@ cowboy Exp $ +# +# Parse and update /etc/mail/sendmail.conf +# +# Copyright (c) 2001-@SM_CPYRT@ Richard Nelson. All Rights Reserved. +# +# Notes (to all): +# +# Notes (to self): +# +#------------------------------------------------------------------------ +# +# Package/Module declaration +package Parse_conf; +require Exporter; +@ISA = qw(Exporter); +#@EXPORT = qw(read_conf write_conf); +@EXPORT_OK = qw(read_conf write_conf get_value); +$VERSION = '2.0000'; +# +# Initialization of the perl environment +use strict; # be kosher +#use warnings; # Not needed here +use Cwd; # provide cwd() +use Env; # A few environmental references +use integer; # Peformance +use Sys::Hostname; # make sure we have a valid hostname +use Getopt::Long; # parameter handling +use FileHandle; # I/O + +# Local libraries - for Debian Sendmail Perl helper functions +# BEGIN { $main::my_path = substr($0,$[,rindex($0,'/')) }; +use lib ('.', substr($0,$[,rindex($0,'/')), "@datadir@/sendmail"); +require Parse_mc; + +# Version of this program +#($main::MYNAME = $main::0) =~ s|.*/||; +#$main::Author = "Richard Nelson"; +#$main::AuthorMail = "cowboy\@debian.org"; +#$main::Version = '$Revision: 1.00 $ '; +$Parse_conf::program_name = 'Parse_conf.pm'; +$Parse_conf::program_version = '@sm_version@'; +$Parse_conf::program_date = '@sm_date@ @sm_time@ cowboy'; +$Parse_conf::debug = 0; + +my $interp_pgm = "$^X"; +my $interp_vrm = $]; +$interp_vrm = ("$^V" | '000') if (defined $^V); +my $current_time = scalar localtime; +my $user = getlogin || (getpwuid($<))[0] || "Unknown!!"; +my $hostname = hostname(); +my $directory = getcwd(); + +$Parse_conf::Conffile = "@sysconfdir@/mail/sendmail.conf"; +my $debug; + +# +#------------------------------------------------------------------------------ +# Global variables +#------------------------------------------------------------------------------ +my %parm_def = ( + 'DAEMON_NETMODE' => 'Static' + ,'DAEMON_NETIF' => 'lo' + ,'DAEMON_MODE' => 'Daemon' + ,'DAEMON_RUNASUSER' => 'No' + ,'DAEMON_PARMS' => '' + ,'DAEMON_HOSTSTATS' => 'No' + ,'DAEMON_MAILSTATS' => 'No' + ,'QUEUE_MODE' => '${DAEMON_MODE}' + ,'QUEUE_INTERVAL' => '10m' + ,'QUEUE_PARMS' => '' + ,'MSP_MODE' => 'Cron' + ,'MSP_INTERVAL' => '20m' + ,'MSP_PARMS' => '' + ,'MSP_MAILSTATS' => '${DAEMON_MAILSTATS}' + ,'MISC_PARMS' => '' + ,'CRON_MAILTO' => 'root' + ,'CRON_PARMS' => '' + ,'HANDS_OFF' => 'No' + ,'LOG_CMDS' => 'No' + ,'AGE_DATA' => '' + ); + +my %parameter = %parm_def; + +my %parm_kw = ( + 'DAEMON_NETMODE' => ['static', 'dynamic'] + ,'DAEMON_MODE' => ['daemon', 'inetd','none'] + ,'QUEUE_MODE' => ['daemon', 'cron', 'none'] + ,'MSP_MODE' => ['daemon', 'cron', 'none'] + ); + +my %parm_bool = ( + 'HANDS_OFF' => 1 + ,'DAEMON_RUNASUSER' => 1 + ,'DAEMON_HOSTSTATS' => 1 + ,'DAEMON_MAILSTATS' => 1 + ,'MSP_MAILSTATS' => 1 + ,'LOG_CMDS' => 1 + ); + +my %parm_dependant = ( + ); + +my %parm_deprecated = ( + 'DAEMON_STATS' => 'DAEMON_MAILSTATS' + ,'MSP_STATS' => 'MSP_MAILSTATS' + ); + +my %parm_hidden = ( + 'DAEMON_RUNASUSER' => 1 + ,'prefix' => 1 + ,'exec_prefix' => 1 + ,'bindir' => 1 + ,'sbindir' => 1 + ,'libexecdir' => 1 + ,'datadir' => 1 + ,'sysconfdir' => 1 + ,'sharedstatedir' => 1 + ,'localstatedir' => 1 + ,'libdir' => 1 + ,'MTA_DAEMON' => 1 + ,'MTA_COMMAND' => 1 + ,'MTA_L' => 1 + ,'MTA_L_QUEUE' => 1 + ,'MTA_ROOT' => 1 + ,'MTA_PIDFILE' => 1 + ,'MSP_DAEMON' => 1 + ,'MSP_COMMAND' => 1 + ,'MSP_L' => 1 + ,'MSP_L_QUEUE' => 1 + ,'MSP_ROOT' => 1 + ,'MSP_PIDFILE' => 1 + ); + +# +#------------------------------------------------------------------------------ +# Finally, some code (almost) +#------------------------------------------------------------------------------ +1; # return (true); + + +# +#------------------------------------------------------------------------------ +# Read /etc/mail/sendmail.conf +#------------------------------------------------------------------------------ +sub read_conf { + my ($input_file) = @_ || $Parse_conf::Conffile; + + $debug = $main::debug || $Parse_conf::debug; + + # Update defaults according to current environment + &update_defaults; + + # Read /etc/mail/sendmail.conf (if extant) + &read_config($input_file); + + # Update old values to new format + &update_values; + + # Make sure things are kosher + my $ok = &validate_config; + if (! $ok) { + die "Terminating due to configuration error."; + }; + }; + +# +#------------------------------------------------------------------------------ +# [Re]write /etc/mail/sendmail.conf +#------------------------------------------------------------------------------ +sub write_conf { + my ($output_file) = @_; + + $debug = $main::debug || $Parse_conf::debug; + + &write_config($output_file); + }; + +# +#------------------------------------------------------------------------ +# Update default settings according to current environment +#------------------------------------------------------------------------ +sub update_defaults { + my ($class, $flags, $files, $options); + my ($ok, $stats); + my $file; + + # Read the mc/m4 files + &Parse_mc::read_dbs('', ''); + + # Obtain entry for HOST_STATUS_DIRECTORY + ($class, $flags, $files, $options) = + &Parse_mc::entry_dbs('confHOST_STATUS_DIRECTORY'); + $file = @{$files}[0]; + if ( $file ne '-' and -d $file ) { + $parameter{'DAEMON_HOSTSTATS'} = 'Yes'; + } + else { + $parameter{'DAEMON_HOSTSTATS'} = 'No'; + }; + + # Obtain entry for STATUS_FILE + ($class, $flags, $files, $options) = + &Parse_mc::entry_dbs('STATUS_FILE'); + $file = @{$files}[0]; + if ( $file ne '-' and -e $file ) { + $parameter{'DAEMON_MAILSTATS'} = 'Yes'; + } + else { + $parameter{'DAEMON_MAILSTATS'} = 'No'; + }; + + # Obtain entry for MSP_STATUS_FILE + ($class, $flags, $files, $options) = + &Parse_mc::entry_dbs('MSP_STATUS_FILE'); + $file = @{$files}[0]; + if ( $file ne '-' and -e $file ) { + $parameter{'MSP_MAILSTATS'} = 'Yes'; + } + else { + $parameter{'MSP_MAILSTATS'} = 'No'; + }; + + }; + +# +#------------------------------------------------------------------------ +# Update old settings according to current format +#------------------------------------------------------------------------ +sub update_values { + my ($ok, $var); + + # Add m(inutes) to {queue,msp}_interval if needed + $parameter{'QUEUE_INTERVAL'} =~ s/^(\d+)$/$1m/; + $parameter{'MSP_INTERVAL'} =~ s/^(\d+)$/$1m/; + + # Also update the queue aging data + ($ok, $var) = &get_value('AGE_DATA'); + my $tmpval = eval $var; + if ($@) { + warn $@; + } + else { + $var = $tmpval; + }; + if (not defined $var) { + $tmpval = '""'; + } + elsif (not ref $var) { + $tmpval = "$var"; + } + elsif (@{$var} == 0) { + $tmpval = '""'; + } + else { + $tmpval = '['; + foreach my $entry (@{$var}) { + foreach my $ndx ($[ .. $#{@{$entry}}) { + @{$entry}[$ndx] =~ s/'/\\'/g; + }; + @{$entry}[0] =~ s/^(\d+)$/$1m/; + $tmpval .= "['" . join("', '", @{$entry}) . "'],"; + }; + $tmpval .= ']'; + $parameter{'AGE_DATA'} = $tmpval; + }; + + # Set any dependant fields here... + }; + +# +#------------------------------------------------------------------------ +# Obtain parameter name +#------------------------------------------------------------------------ +sub get_name { + my ($name, $quiet) = @_; + + # Handle deprecated/renamed variables + if ( exists($parm_deprecated{$name}) ) { + print STDERR "$name is deprecated." + if ($debug and ! $quiet); + if ( $parm_deprecated{$name} ) { + print STDERR " Please use $parm_deprecated{$name} instead.\n" + if ($debug and ! $quiet); + $name = $parm_deprecated{$name}; + } + else { + print STDERR " It will be ignored.\n" + if ($debug and ! $quiet); + }; + }; + + return $name; + }; + +# +#------------------------------------------------------------------------ +# Obtain value directly, or indirectly +#------------------------------------------------------------------------ +sub get_value { + my ($name) = @_; + my $ok = 1; + my $value = ''; + if ( ! exists($parameter{$name}) ) { + print STDERR "Variable $name not defined...\n"; + return ($ok, $value); + }; + + $name = get_name($name, ''); + $value = $parameter{$name}; + + my $tval = $value; + $tval =~ s/^\s*//; + my $default = 0; + + # Dereference loop... keep original value if we get any errors... + Dereference:; + if ($tval =~ /^\$/) { + my @ref_stack = ($name); + my %ref_hash = ($name => 1); + while ($tval =~ /^\$/ and $ok) { + my $start = 1; + my $del = 1; + my $char = substr($tval, 1, 1); + if ( $char eq '{' or $char eq '(' ) { + $start += 1; $del += 2; + }; + my $ref = get_name(substr($tval, $start, + length($tval)-$del), ''); + push @ref_stack, $ref; + if (exists($ref_hash{$ref})) { + print STDERR "Go directly to jail; do not pass go, ", + "do not collect \$200\n"; + print STDERR " Reference loop: ", + join('->', @ref_stack, '...'),"\n"; + $ok = 0; + } + else { + $ref_hash{$ref} = 1; + if (lc $ref eq 'default') { + $tval = $parm_def{$name}; + print STDERR + "Setting $name to default value: ", + "$parm_def{$name}.\n" + if ($debug); + } + elsif (exists($parameter{$ref})) { + $tval = $parameter{$ref}; + print STDERR + "Setting $name to value of $ref: $tval.\n" + if ($debug); + } + else { + print STDERR + "Can not deference $ref, it doesn't exist.\n"; + $ok = 0; + }; + }; + }; + }; + + if ( $ok ) { + # Check keyword parms for valid values + if (exists $parm_kw{$name}) { + my @ltval = split(/\s/,$tval); + my $ltval = lc(@ltval[$[]); + my $found = ""; + foreach my $value (@{$parm_kw{$name}}) { + if ($value eq $ltval) { + $found = 1; $tval = ucfirst($ltval); }; + }; + if ( ! $found ) { + $default += 1; + if ( $default > 1 ) { + print STDERR + "Can not resolve $name, value=$value.\n"; + $ok = 0; + } + else { + print STDERR "Illegal value($tval) for $name.\n", + " Valid values are: ", + join(', ', @{$parm_kw{$name}}), + "\n", + " Set to default: $parm_def{$name}.\n"; + $tval = $parm_def{$name}; + goto Dereference; + }; + }; + } + + # Check boolean parms for valid values + elsif (exists $parm_bool{$name}) { + my @ltval = split(/\s/,$tval); + my $ltval = lc(@ltval[$[]); + $ltval =~ s/^[ty1].*/1/; + $ltval =~ s/^[fn0].*/0/; + if ($ltval eq '0' or $ltval eq '1') { + $tval = ucfirst($ltval); } + else { + $default += 1; + if ( $default > 1 ) { + print STDERR + "Can not resolve $name, value=$value.\n"; + $ok = 0; + } + else { + print STDERR "Illegal value($tval) for $name.\n", + " Valid values are: T[rue],Y[es],1,", + " F[alse],N[o],0\n", + " Set to default: $parm_def{$name}.\n"; + $tval = $parm_def{$name}; + goto Dereference; + }; + }; + }; + }; + + $value = $tval if $ok; + + print STDERR "get_value : $name => $value\n" + if ($debug); + + return ($ok, $value); + }; + +# +#------------------------------------------------------------------------ +# Read input configuration file (if no input, just use defaults) +#------------------------------------------------------------------------ +sub read_config { + my ($input_file) = @_; + @ARGV = split(' ', $input_file); + return if (! -r $input_file); + + my $savename = ''; + my $parmname = ''; + my $parmval = ''; + my $parmref = ''; + my $defname = ''; + my $defval = ''; + my $tmpval = ''; + + print STDOUT "Reading configuration from ", join(',',@ARGV), ".\n"; + + line: while (<ARGV>) { + next line if /^$/; # skip empty lines + chomp; # drop tailing \n + if (s/\\$//) { + $_ .= <>; + redo unless eof(); + }; + + # check commented lines for default parameter values + # a bit of a kluge, but it works out nicely + if (/^#\s*([\w_]+)="([^"]*)"/) { + $defname = get_name($1, 1); + $defval = $2; + print STDERR "Default: $defname => $defval.\n" + if ($debug); + next line; + }; + # Skip any comments + next line if /^#/; # skip comments + + # Process assignment statements + if (/^\s*([\w_]+)="([^"]*)"/) { + $savename = $1; + $parmname = get_name($savename, ''); + $parmval = $2; + print STDERR "Value : $savename => $parmval.\n" + if ($debug); + + # Do we know about this parameter? + # NOTE: keep, even if we don't know about it to prevent + # problems with up/down grades (not loose anything) + if ( ! exists($parm_def{$parmname}) and + ! exists($parm_hidden{$parmname}) ) { + print STDERR "$parmname is a user defined parameter.\n" + if ($debug); + }; + + # Note if value is default, if so, we'll change it to + # the current default - maybe counterintuitive, oh well + # it does help with migration + if ($parmname eq $defname and $parmval eq $defval) { + print STDERR "$parmname is the default value: $defval.\n" + if ($debug); + $parmval = $parm_def{$parmname}; + }; + + # Finally, assign value + if (exists $parm_kw{$savename} or + exists $parm_bool{$savename}) { + $parmval = ucfirst($parmval); + }; + + if ($savename eq $parmname) { + $parameter{$parmname} = $parmval; + } + else { + $parameter{$savename} = $parmval; + }; + }; + }; + }; + +# +#------------------------------------------------------------------------ +# Validate current configuration +#------------------------------------------------------------------------ +sub validate_config { + + my $valid = 1; + + print STDOUT "Validating configuration.\n"; + + # Really, we only care about the some of the variables - those + # that have defaults... the rest, well, so what ! + foreach my $val (sort keys %parm_def) { + my ($ok, $value) = &get_value($val, 1); + if (! $ok) { $valid = 0; }; + }; + + if (! $valid ) { + print STDERR "\nOne or more errors were encountered!\n\n"; + }; + + return ($valid); + }; + +# +#------------------------------------------------------------------------ +# Write updated configuration file +#------------------------------------------------------------------------ +sub write_config { + my ($database_file) = @_; + my $ofh = new FileHandle; + + # Make sure things are kosher + my $result = &validate_config; + if (! $result) { + die "Terminating due to configuration error."; + }; + + $database_file = $database_file || $Parse_conf::Conffile; + my $caller = "$main::program_name" if ($main::program_name); + $caller .= " $main::program_version" if ($main::program_version); + $caller .= " $main::program_date" if ($main::program_date); + + print STDOUT "Writing configuration to $database_file.\n"; + $database_file = '&STDOUT' if ($database_file eq '-'); + unless ( open($ofh, ">$database_file") ) { + warn("Could not open $database_file($!), using STDOUT\n"); + open($ofh, ">&STDOUT"); + }; + $database_file = '-' if ($database_file eq '&STDOUT'); + +# print $ofh <<"EOT"; +#################################################################### +##### This file is automagically generated -- edit at your own risk +##### +##### file: ${database_file} +##### generated via: (${interp_pgm} ${interp_vrm}) +##### ${caller} +##### ${Parse_conf::program_name} ${Parse_conf::program_version} ${Parse_conf::program_date} +##### by: ${user}\@${hostname} +##### on: ${current_time} +##### in: ${directory} +##### input files: +#EOT +# foreach my $file ( split(' ', $input_file) ) { +# print $ofh <<"EOT"; +##### ${file} +#EOT +# }; +# print $ofh <<"EOT"; +##### +#################################################################### + print $ofh <<"EOT"; +#------------------------------------------------------------------------------ +# +# $database_file +# +# Copyright (c) 2001-@SM_CPYRT@ Richard Nelson. All Rights Reserved. +# Version: ${main::program_version} +# Time-stamp: <${main::program_date}> +# +# Parameter file for sendmail (sourced by /usr/share/sendmail/sendmail) +# Make all changes herein, instead of altering /etc/init.d/sendmail. +# +# After making changes here, you'll need to run /usr/sbin/sendmailconfig +# or ${main::program_name} to have the changes take effect - +# If you change DAEMON_MODE, QUEUE_MODE, or QUEUE_INTERVAL, you'll also +# need to run /etc/init.d/sendmail restart. +# +# Changes made herein will be kept across upgrades - except for comments! +# Some comment lines have special significance ... +# +# **** **** **** **** DO NOT EDIT THE COMMENTS **** **** **** **** +# +# Supported parameters (and defaults) are listed herein. +# +# Notes: +# * This setup allows sendmail to run in several modes: +# - listener and queue runner..DAEMON_MODE="daemon".QUEUE_MODE="daemon" +# - listener only..............DAEMON_MODE="daemon".QUEUE_MODE="none" +# - queue runner only..........DAEMON_MODE="none"...QUEUE_MODE="daemon" +# - *NOTHING* ?!?..............DAEMON_MODE="none"...QUEUE_MODE="none" +# +# * You can also run the listener from inetd: +# - listener and queue runner..DAEMON_MODE="inetd"..QUEUE_MODE="daemon" +# - listener only..............DAEMON_MODE="inetd"..QUEUE_MODE="none" +# +# * You can also run the queue runner from cron: +# - listener and queue runner..DAEMON_MODE="....."..QUEUE_MODE="cron" +# - queue runner only..........DAEMON_MODE="none"...QUEUE_MODE="cron" +# +# * _PARMS entries herein are shown in precedence order, any later _PARMS +# field will, if applicable, override any previous _PARMS fields. +# +# * Values *MUST* be surrounded with double quotes ("), single quotes +# will *NOT* work ! +# +#------------------------------------------------------------------------------ +# SMTP Listener Configuration +# +# DAEMON_NETMODE="$parm_def{'DAEMON_NETMODE'}"; Keyword SMTP network mode +# static: Do not monitor any network interfaces for changes +# dynamic: Monitor one or more interfaces for changes +# +DAEMON_NETMODE="$parameter{'DAEMON_NETMODE'}"; +# +# DAEMON_NETIF="$parm_def{'DAEMON_NETIF'}"; string SMTP interface(s) +# This parameter defines the network interface(s) that the daemon +# will monitor for status changes (via ppp, dhcp, ifup/down hooks). +# +# NOTES: +# 1) Only list more than one interfaces if they only used for fallback, +# otherwise the daemon will wind up ping-ponging between interfaces. +# 2) Do not use 'lo' unless your daemon only listens on the localhost. +# +DAEMON_NETIF="$parameter{'DAEMON_NETIF'}"; +# +# DAEMON_MODE="$parm_def{'DAEMON_MODE'}"; Keyword SMTP listener +# daemon: Run as standalone daemon +# inetd: Run from inet supervisor (forks for each mail) +# none: No listener (ie, nullclient/smarthost) +# +# NOTE: If you choose "none", mail will build up in the MSP queues +# and you will not receive any mail from external sites. +# +DAEMON_MODE="$parameter{'DAEMON_MODE'}"; +# +# DAEMON_PARMS="$parm_def{'DAEMON_PARMS'}"; String Listener parms +# Any parameters here will be ignored when run from cron. +# Note that {QUEUE,MISC,CRON}_PARMS, if applicable, will override +# anything declared herein. +# +DAEMON_PARMS="$parameter{'DAEMON_PARMS'}"; +# +# DAEMON_HOSTSTATS="$parm_def{'DAEMON_HOSTSTATS'}"; Boolean Listener stats +# This parameter determines whether or not host stats are collected +# and available for the \`hoststat\` command to display. There will +# be a (minor) performance hit, as files will be created/updated for each +# sendmail delivery attempt. The files are fixed in size, and small, +# but there can be many of them. +# +DAEMON_HOSTSTATS="$parameter{'DAEMON_HOSTSTATS'}"; +# +# DAEMON_MAILSTATS="$parm_def{'DAEMON_MAILSTATS'}"; Boolean Listener stats +# This parameter determines whether or not mailer stats are collected +# and available for the \`mailstats\` command to display. There will +# be a (minor) performance hit, as this file will be updated for each +# item coming into, or out of, sendmail. The file is fixed in size, +# and small, so there's no need to rotate it. +# +DAEMON_MAILSTATS="$parameter{'DAEMON_MAILSTATS'}"; +# +#------------------------------------------------------------------------------ +# SMTP MTA Queue Runner Configuration +# +# QUEUE_MODE="$parm_def{'QUEUE_MODE'}"; Keyword SMTP queue runner +# daemon: Run as standalone daemon +# cron: Run from crontab +# none: No queue runner (ie, nullclient/smarthost) +# +QUEUE_MODE="$parameter{'QUEUE_MODE'}"; +# +# QUEUE_INTERVAL="$parm_def{'QUEUE_INTERVAL'}"; Timespec (digits+w|d|h|m|s) +# Interval at which to run the MTA queues. What interval should you use? +# The amount of time that is acceptable before retrying delivery on +# mail that couldn't be delivered in one run, or how long an item can +# set in the queue before having the first delivery attempt done. +# +# NOTE: If you leave this field blank, You get *NO* queue runners !!! +# +QUEUE_INTERVAL="$parameter{'QUEUE_INTERVAL'}"; +# +# QUEUE_PARMS="$parm_def{'QUEUE_PARMS'}"; String queue parameters +# Any parameters here are also used when run from cron. +# Note that MISC_PARMS and CRON_PARMS, if applicable, will override +# anything declared herein. +# +QUEUE_PARMS="$parameter{'QUEUE_PARMS'}"; +# +#------------------------------------------------------------------------------ +# SMTP - MSP Queue Runner Configuration +# +# MSP_MODE="$parm_def{'MSP_MODE'}"; Keyword MSP queue runner mode +# daemon: Run as standalone daemon +# cron: Run from crontab +# none: No queue runner (ie, nullclient/smarthost) +# +# NOTE: If QUEUE_MODE="cron" & MSP_MODE="none", the MSP queue will +# be run as part of the MTA queue running process. +# +MSP_MODE="$parameter{'MSP_MODE'}"; +# +# MSP_INTERVAL="$parm_def{'MSP_INTERVAL'}"; Timespec (digits+w|d|h|m|s) +# Interval at which to run the MSP queues. What interval should you use? +# The amount of time that is acceptable before retrying delivery on +# mail that couldn't be accepted by the MTA, and was therefore left +# in the message submission queue. The MTA shouldn't be down that often +# so this can be larger than QUEUE_INTERVAL. +# +# NOTE: If you leave this field blank, The MSP queue will *NOT* be run !!! +# +MSP_INTERVAL="$parameter{'MSP_INTERVAL'}"; +# +# MSP_PARMS="$parm_def{'MSP_PARMS'}"; String queue parameters +# Any parameters here are also used when run from cron. +# Note that MISC_PARMS and CRON_PARMS, if applicable, will override +# anything declared herein. +# +MSP_PARMS="$parameter{'MSP_PARMS'}"; +# +# MSP_MAILSTATS="$parm_def{'MSP_MAILSTATS'}"; Boolean Listener stats +# This parameter determines whether or not mailer stats are collected +# and available for the \`mailstats\` command to display. There will +# be a (minor) performance hit, as this file will be updated for each +# item coming into, or out of, sendmail. The file is fixed in size, +# and small, so there's no need to rotate it. +# +MSP_MAILSTATS="$parameter{'MSP_MAILSTATS'}"; +# +#------------------------------------------------------------------------------ +# Miscellaneous Confguration +# +# MISC_PARMS="$parm_def{'MISC_PARMS'}"; String miscellaneous parameters +# Miscellaneous parameters - applied to any sendmail invocation. +# Any parameters here are also used when run from cron. +# Applied after {DAEMON,QUEUE}_PARMS, and can therefore override them +# if need be (in which case why did use them?) +# Note that CRON_PARMS, if applicable, will override anything +# declared herein. +# +# Here is where'd you setup and debugging or special parms that you +# want shared betwixt the possibly separate listener/queue-runner +# processes. +# +MISC_PARMS="$parameter{'MISC_PARMS'}"; +# +#------------------------------------------------------------------------------ +# Cron Job Configuration +# +# CRON_MAILTO="$parm_def{'CRON_MAILTO'}"; String cronjob output +# Recipient of *rare* cronjob output. Some cronjobs will be running +# under user `mail`, so any problems encountered would probably be missed +# so define a user who actually (hopefully) checks email now and again. +# +CRON_MAILTO="$parameter{'CRON_MAILTO'}"; +# +# CRON_PARMS="$parm_def{'CRON_PARMS'}"; String cron specific parmeters +# Cron parameters - applied *only* when sendmail queue running is done +# via a cronjob. Applied after QUEUE_PARMS and MISC_PARMS, and can +# therefore override them if need be. +# +CRON_PARMS="$parameter{'CRON_PARMS'}"; +# +#------------------------------------------------------------------------------ +# Other stuff +# LOG_CMDS="$parm_def{'LOG_CMDS'}"; Binary command logging flag +# Will cause syslog entries for many of the sendmail related commands +# like runq, mailq, etc - you'll also see cron jobs (if enabled). +# +LOG_CMDS="$parameter{'LOG_CMDS'}"; +# +# HANDS_OFF="$parm_def{'HANDS_OFF'}"; Binary Do *NOT* touch the configuration +# Set this *ONLY* if you are going to be fully responsible for the entire +# setup of sendmail - the directories, permissions, databases, etc. With +# this variable set to "Yes", nothing will be done for you during updates. +# +# In other words, "The blood be upon your hands" if you set this... +# My ability to help with problems will be greatly reduced ! +# +# "Well, a pet peeve of mine is people who directly edit the +# .cf file instead of using the m4 configuration files. +# Don't do it! [laughs] I treat the .cf file as a binary +# file - you should too." +# -- Eric Allman 1999/10/18 +# +HANDS_OFF="$parameter{'HANDS_OFF'}"; +# +#------------------------------------------------------------------------------ +# Queue Aging Configuration +# +# Why would you want to age your queues? On every queue-run interval, +# sendmail will try *every* file in the queue... If a site is down +# for a while, considerable time can be wasted each interval in retrying +# it. The scheme supported allows aging by time, and can move the older +# files to another (less frequently run queue), thereby reducing overal +# system impact - and providing better mail throughput. +# +# Note that this support is completely separate from QUEUE_MODE=cron, +# you can age queues even if you're running QUEUE_MODE=daemon. +# +# There are four parts to the queue aging support, and these parts +# may be repeated, to operate on multiple queues. +# +# 1. Interval at which to age the queues (in minutes). +# What interval should you use? Roughly twice the normal queue +# interval, so that messages are tried twice in each successively +# slower queue. +# +# 2. Criteria (optional and defaults to interval). This is the +# specification of which files to move. It defaults moving +# files whose age in the queues exceeds the interval. +# This field, if specified can be very complex - supporting +# aging by just about anything! see qtool(8) for details. +# +# 3. To queue. This is the queue to which files will be moved. +# It may be fully qualified, or relative to /var/spool/mqueue. +# +# 4. From queue. This is the queue from which files will be moved. +# It may be fully qualified, or relative to /var/spool/mqueue. +# +# Samples: +# AGE_DATA="[['25m', '', 'hourly', 'main']]"; +# Every 25 minutes, move any file older than 25 minutes from +# /var/spool/mqueue/main to /var/spool/mqueue/hourly +# +# AGE_DATA="[['25m', '', 'hourly', 'main'],\\ +# ['125', '', 'daily', 'hourly']]"; +# Same as the above, but also move files from the hourly queue +# to the daily queue after 125 minutes in the hourly queue. +# +# AGE_DATA="[['25m',\\ +# '-e \\'\$msg{message}[0] == /Deferred: 452 4.2.2 Over quota/\\'',\\ +# 'overquota', 'main']]"; +# Every 25 minutes, move all files deferred because of quota +# violations from /var/spool/mqueue/main to +# /var/spool/mqueue/overquota where they can be processed on +# a different interval, or by some other means. +# +# If the above samples suggest Perl arrays, well, they are... +# +# AGE_DATA="$parm_def{'AGE_DATA'}"; Perl array Queue aging data +# +EOT + my ($ok, $var) = &get_value('AGE_DATA'); + my $tmpval = eval $var; + if ($@) { + warn $@; + } + else { + $var = $tmpval; + }; + if (not defined $var) { + print $ofh 'AGE_DATA="";',"\n"; + } + elsif (not ref $var) { + print $ofh 'AGE_DATA="',$var,'";',"\n"; + } + elsif (@{$var} == 0) { + print $ofh 'AGE_DATA="";',"\n"; + } + else { + print $ofh 'AGE_DATA="[\\',"\n"; + foreach my $entry (@{$var}) { + foreach my $ndx ($[ .. $#{@{$entry}}) { + @{$entry}[$ndx] =~ s/'/\\'/g; + }; + print $ofh "['",join("', '",@{$entry}),"'],\\\n"; + }; + print $ofh ']";',"\n"; + }; + print $ofh <<"EOT"; +# +#------------------------------------------------------------------------------ +# Dependant variables (set according to other variables) +# +EOT + foreach my $key (sort keys %parm_dependant) { + my ($ok, $value); + # Don't evaluate value, just stuff it... + next if ( ! $parameter{$key} ); + ($ok, $value) = (1, $parameter{$key}); + print $ofh "$key=",'"',$value,'";',"\n"; + }; + print $ofh <<"EOT"; +# +#------------------------------------------------------------------------------ +# Hidden variables (the blood be upon your hands) +# +EOT + foreach my $key (sort keys %parm_hidden) { + my ($ok, $value); + # Don't evaluate value, just stuff it... + next if ( ! $parameter{$key} ); + ($ok, $value) = (1, $parameter{$key}); + print $ofh "$key=",'"',$value,'";',"\n"; + }; + print $ofh <<"EOT"; +# +#------------------------------------------------------------------------------ +# Deprecated variables (kept for reference) +# +EOT + foreach my $key (sort keys %parm_deprecated) { + my ($ok, $value); + # Don't evaluate value, just stuff it... + if ( $parm_deprecated{$key} ) { + ($ok, $value) = (1, join('','${', $parm_deprecated{$key}, '}')); + } + elsif ( $parameter{$key} ) { + ($ok, $value) = (1, $parameter{$key}); + }; + print $ofh "$key=",'"',$value,'";',"\n"; + }; + print $ofh <<"EOT"; +# +#------------------------------------------------------------------------------ +# Unknown variables (kept for reference) +# +EOT + foreach my $key (sort keys %parameter) { + if (! exists($parm_def{$key}) and + ! exists($parm_deprecated{$key})) { + # Don't evaluate value, just stuff it... + my ($ok, $value) = (1, $parameter{$key}); + print $ofh "$key=",'"',$value,'";',"\n"; + }; + }; + print $ofh <<"EOT"; +#------------------------------------------------------------------------------ +# + +EOT + + close($ofh); + if ( $database_file eq $Parse_conf::Conffile ) { + chown '0', '0', "$database_file"; + chmod 0644, "$database_file"; + }; + }; + +__END__ diff --git a/debian/local/Parse_mc.pm.in b/debian/local/Parse_mc.pm.in index a80b754..e21d61d 100644 --- a/debian/local/Parse_mc.pm.in +++ b/debian/local/Parse_mc.pm.in @@ -16,7 +16,6 @@ # * changes made herein *must* be reflected in # parse_mc,update_mk,update_db,debian.m4 # * userdb can also have multiple databases and then a forward! -# * Cert support # * undefine support # * include support (also for OSTYPE, DOMAIN, SITE, etc) # * F and K lines @@ -29,7 +28,7 @@ require Exporter; @ISA = qw(Exporter); #@EXPORT = qw(read_mc write_dbs read_dbs); @EXPORT_OK = qw(read_mc write_dbs read_dbs - names_dbs restart_dbs entry_dbs); + names_dbs restart_dbs entry_dbs format_dbs); $VERSION = '2.0002'; # # Initialization of the perl environment @@ -50,6 +49,7 @@ use FileHandle; # I/O $Parse_mc::program_name = 'Parse_mc.pm'; $Parse_mc::program_version = '@sm_version@'; $Parse_mc::program_date = '@sm_date@ @sm_time@ cowboy'; +$Parse_mc::debug = 0; my $interp_pgm = "$^X"; my $interp_vrm = $]; @@ -59,6 +59,7 @@ my $user = getlogin || (getpwuid($<))[$[] || "Unknown!!"; my $hostname = hostname(); my $directory = getcwd(); +$Parse_mc::Conffile = "@sysconfdir@/mail/databases"; $Parse_mc::input_files = "@sysconfdir@/mail/sendmail.mc"; $Parse_mc::database_file = "@sysconfdir@/mail/databases"; @@ -114,10 +115,12 @@ my %smdb_classes = ( my $smdb_loc = "@sysconfdir@/mail/"; my $smdb_type = 'hash'; my %smdb_hash = ( +# ----------- Database defaults 'MAIL_SETTINGS_DIR' => ['-','-',["${smdb_loc}"],'-'] ,'DATABASE_MAP_TYPE' => ["${smdb_type}",'-',['-'],'-'] +# ----------- General stuff ,'sendmail.cf' => ['m4','-',["${smdb_loc}sendmail.mc"],'-'] @@ -145,7 +148,6 @@ my %smdb_hash = ( ['-','-',["@localstatedir@/lib/sendmail/sendmail.st"],'-'] # ,'VIRTUSER_DOMAIN_FILE' => # ['-','-',["${smdb_loc}virtual-domains"],'%[^\\#]'] - ,'confCONTROL_SOCKET_NAME' => ['-','-',["@localstatedir@/run/sendmail/smcontrol"],'-'] ,'confCR_FILE' => @@ -172,6 +174,35 @@ my %smdb_hash = ( ['-','-',["${smdb_loc}service.switch"],'-'] # ,'confUSERDB_SPEC' => # ['btree','-o',["${smdb_loc}userdb"],'-'] +# ----------- STARTTLS + ,'confTO_STARTTLS' => + ['-','-',["2m"],'-'] + ,'confCACERT' => + ['-','-',["${smdb_loc}tls/sendmail-server.crt"],'-'] + ,'confCACERT_PATH' => + ['-','-',["@sysconfdir@/ssl/certs"],'-'] + ,'confCRL' => + ['-','-',[""],'-'] + ,'confCLIENT_CERT' => + ['-','-',["${smdb_loc}tls/sendmail-client.crt"],'-'] + ,'confCLIENT_KEY' => + ['-','-',["${smdb_loc}tls/sendmail-common.key"],'-'] + ,'confSERVER_CERT' => + ['-','-',["${smdb_loc}tls/sendmail-server.crt"],'-'] + ,'confSERVER_KEY' => + ['-','-',["${smdb_loc}tls/sendmail-common.key"],'-'] + ,'confTLS_SRV_OPTIONS' => + ['-','-',["V"],'-'] +# ----------- SMTP AUTH (SASL) + ,'confTO_AUTH' => + ['-','-',["2m"],'-'] + ,'confAUTH_MECHANISMS' => + ['-','-',["DIGEST-MD5 CRAM-MD5 NTLM LOGIN PLAIN"],"-"] + ,'TRUST_AUTH_MECH' => + ['-','-',["DIGEST-MD5 CRAM-MD5 NTLM LOGIN PLAIN"],"-"] + ,'confAUTH_REALM' => + ['-','-',[""],'-'] + , ); # # @@ -179,6 +210,9 @@ my %smdb_hash = ( $smdb_hash{'databases'} = ['parse_mc','-',["${smdb_loc}sendmail.mc"],'-']; $smdb_hash{'Makefile'} = ['update_mk','-',["${smdb_loc}databases"],'-']; $smdb_hash{'crontab'} = ['update_conf','-',["${smdb_loc}sendmail.conf"],'-']; +$smdb_hash{'auth'} = ['update_auth','-',["${smdb_loc}sasl/sasl.m4"],'-']; +$smdb_hash{'tls'} = ['update_tls','-',["${smdb_loc}tls/starttls.m4"],'-']; +$smdb_hash{'include'} = ['-','-',[""],'-']; # # Conditional entries if ( -s "${smdb_loc}submit.mc" ) { @@ -201,6 +235,7 @@ my %smdb_restart = ( ,'confCR_FILE' => 1 ,'use_ct_file' => 1 ,'use_cw_file' => 1 + ,'crontab' => 1 ); $smdb_restart{'sendmail.cf'} = 1; @@ -221,6 +256,9 @@ my $smdb_flags = ''; my $smdb_options = ''; my $smdb_default = ''; +my $QUEUE_GROUPS = 0; +my $INCLUDES = 0; + #------------------------------------------------------------------------------ # Finally, some code (almost) #------------------------------------------------------------------------------ @@ -232,27 +270,22 @@ my $smdb_default = ''; #------------------------------------------------------------------------------ sub read_mc { my ($input_files) = @_; - @ARGV = split(' ', $input_files); - if ($#ARGV == -1) { - my @files = ( - '/usr/share/sendmail/cf/ostype/linux.m4' - ,'/usr/share/sendmail/cf/ostype/debian.m4' - ,'/usr/share/sendmail/cf/domain/debian-mta.m4' - ,"@sysconfdir@/mail/sendmail.mc" - ); - foreach my $file ( @files ) { - push @ARGV, $file if ( -s $file ); - }; - }; - $input_files = join(' ', @ARGV); + my $ifh = new FileHandle; + + $input_files = $input_files || $Parse_mc::input_files; $Parse_mc::input_files = $input_files; - die "No input files" if ($#ARGV == -1); $debug = $main::debug || ''; + unless ( open($ifh, "<$input_files") ) { + warn("Could not open $input_files($!)\n"); + return; + }; +#print "Reading files:",$input_files,"\n"; + #------------------------------------------------------------------ # Main loop, iterate over all input lines #------------------------------------------------------------------ - line: while (<ARGV>) { + line: while (<$ifh>) { next line if /^#/; # skip comments next line if /^$/; # skip empty lines chomp; # drop tailing \n @@ -260,6 +293,7 @@ sub read_mc { $_ .= <>; redo unless eof(); }; +#print "=>",$_,"\n"; #-------------------------------------------------------------- # Look for default database location @@ -405,9 +439,72 @@ sub read_mc { @smdb_file = ($2); $smdb_options = '-'; # Pull out other options? - &put_entry($ARGV, '', 1); + if ( $QUEUE_GROUPS == 0 ) { + &put_entry($ARGV, '', 0); + $QUEUE_GROUPS = 1; + } + else { + &put_entry($ARGV, '', 1); + }; } + #-------------------------------------------------------------- + # Look for all AUTH specifications + # define(confAUTH_MECHANISMS ...)dnl + # define(confAUTH_REALM ...)dnl + # TRUST_AUTH_MECH( ...)dnl + #-------------------------------------------------------------- + elsif (/^\s*`?define\(\s*`?confAUTH_(MECHANISMS|REALM)/ .. + /[^\)]*\)/) { + &parse_string($_, 'define'); + next line if ($smdb_state != $smdb_state_done); + + next line if ($smdb_string =~ /.*defn\(/); + + &get_flags_name_opts; + + push(@smdb_file, split(' ',$smdb_options)) + if ($smdb_options ne '-'); + $smdb_options = '-'; + + &put_entry($ARGV, 'define'); + } + elsif (/^\s*`?TRUST_AUTH_MECH\(/ .. + /[^\)]*\)/) { + &parse_string($_, '('); + next line if ($smdb_state != $smdb_state_done); + + next line if ($smdb_string eq ' EXTERNAL'); + + &get_flags_name_opts; + + push(@smdb_file, split(' ',$smdb_options)); + $smdb_options = '-'; + + &put_entry($ARGV, ''); + } + + #-------------------------------------------------------------- + # Look for all TLS specifications + # define(confCACERT, ...)dnl + # define(confCACERT_PATH, ...)dnl + # define(confCRL, ...)dnl + # define(confCLIENT_CERT, ...)dnl + # define(confCLIENT_KEY, ...)dnl + # define(confSERVER_CERT, ...)dnl + # define(confSERVER_KEY, ...)dnl + # define(confTLS_SRV_OPTIONS, ...)dnl + #-------------------------------------------------------------- + elsif (/^\s*`?define\(\s*`?conf(TO_STARTTLS|CACERT|CRL|((SERVER|CLIENT)_(KEY|CERT))|TLS_SRV_OPTIONS)/ .. + /[^\)]*\)/) { + &parse_string($_, 'define'); + next line if ($smdb_state != $smdb_state_done); + + &get_flags_name_opts; + + &put_entry($ARGV, 'define'); + } + # #-------------------------------------------------------------- # Locate all non-commented FEATURE macros @@ -432,12 +529,46 @@ sub read_mc { @smdb_file = ("${smdb_loc}$smdb_features{$smdb_name}") if ($smdb_file[$[] eq '-' - and $smdb_class ne 'ldap'); + and $smdb_class ne 'ldap'); $smdb_class = $smdb_type if ($smdb_class eq '-'); }; &put_entry($ARGV, 'FEATURE'); + } + + elsif (/^\s*`?(OSTYPE|DOMAIN|include)\(/ .. /[^\)]*/) { + &parse_string($_, '('); + next line if ($smdb_state != $smdb_state_done); + + next line if ($smdb_name eq 'include' + and $smdb_string =~ /^\s*`?_CF_DIR/); + + $smdb_string =~ /\s*`?([^'\)\s]+)/; + $smdb_string = $1; + if ($smdb_name eq 'OSTYPE') { + $smdb_string = + "@datadir@/sendmail/cf/ostype/$smdb_string.m4"; + } + elsif ($smdb_name eq 'DOMAIN') { + $smdb_string = + "@datadir@/sendmail/cf/domain/$smdb_string.m4"; + }; + + $smdb_name = 'include'; + $smdb_class = '-'; # $1 + $smdb_flags = '-'; + @smdb_file = ($smdb_string); + $smdb_options = '-'; # Pull out other options? + + if ($INCLUDES == 0) { + &put_entry($ARGV, 'include', 0); + $INCLUDES = 1; + } + else { + &put_entry($ARGV, 'include', 1); + }; + &read_mc("$smdb_string"); }; }; }; @@ -526,7 +657,7 @@ EOT }; close($ofh); - if ($database_file eq "@sysconfdir@/mail/databases") { + if ($database_file eq $Parse_mc::Conffile) { chown '0', '0', "$database_file"; chmod 0644, "$database_file"; }; @@ -718,6 +849,24 @@ sub get_entry { }; # +# +sub format_dbs { + my ($name) = @_; + my $string = ''; + + &get_entry($name); + $string .= " $smdb_class" + if ($smdb_class ne '-' and $smdb_class ne ' '); + $string .= " $smdb_flags" + if ($smdb_flags ne '-' and $smdb_flags ne ' '); + $string .= join(',', @smdb_file); + $string .= " $smdb_options" + if ($smdb_options ne '-' and $smdb_options ne ' '); + + return $string; + }; + +# #------------------------------------------------------------------------------ # This function does most of the work in parsing a series of lines to # construct a database entry - it manages the state machine and assorted @@ -773,7 +922,7 @@ sub parse_string { $smdb_state = $pending_state || $smdb_state_start; $smdb_string = ''; $count = (@entry = split(' ', $str)); - ($smdb_name = $entry[$[]) =~ tr/'//d; + ($smdb_name = $entry[$[]) =~ tr/`'//d; shift(@entry); $str = join(' ', @entry); } @@ -786,7 +935,9 @@ sub parse_string { $str =~ tr/`'//d; # FEATURE( is the only one allowed to have only one argument - if ($type ne 'FEATURE' and $count == 1) { + if ( ($type ne 'FEATURE' + and $type ne '(') + and $count == 1) { $str = ''; }; diff --git a/debian/local/bug/sendmail/control b/debian/local/bug/sendmail/control new file mode 100644 index 0000000..5167d2d --- /dev/null +++ b/debian/local/bug/sendmail/control @@ -0,0 +1 @@ +report-with: sensible-mda rmail libmilter0 diff --git a/debian/local/bug/sendmail/script.in b/debian/local/bug/sendmail/script.in new file mode 100644 index 0000000..71a2c1b --- /dev/null +++ b/debian/local/bug/sendmail/script.in @@ -0,0 +1,53 @@ +#!/bin/sh +#----------------------------------------------------------------------------- +# $Sendmail: sendmail.bug,v @sm_version@ @sm_date@ @sm_time@ cowboy Exp $ +# +# Copyright (c) 1998-@SM_CPYRT@ Richard Nelson. All Rights Reserved. +# +# Debian helper function script for Debian Sendmail bug reporting +# Note: this file supports @SM_MINVERS@ - @SM_MAXVERS@ +# +# Notes (to all): +# * +# +# Notes (to self): +# * +# +#----------------------------------------------------------------------------- +# +#set -e; +DEBUG=0; + +# reportbug #169495 +if [ -z "$YESNO" ]; then + YESNO=$"yYnN"; + fi; + +# Announce +printf "Ouput of $0:\n" >&3; + +# Show files in /etc/mail +printf "\nls -alR /etc/mail:\n" >&3; +ls -alR /etc/mail | grep -Eve '~$' >&3; + +# Extract the relevant portion of sendmail.conf +if [ -e @sysconfdir@/mail/sendmail.conf ]; then + printf "\nsendmail.conf:\n" >&3; + grep -ve '^#' "@sysconfdir@/mail/sendmail.conf" >&3; + fi; + +# Extract the relevant portion of sendmail.mc +if [ -e @sysconfdir@/mail/sendmail.mc ]; then + printf "\nsendmail.mc:\n" >&3; + grep -Eve '^(#|dnl|$)' "@sysconfdir@/mail/sendmail.mc" >&3; + fi; + +# Extract the relevant portion of submit.mc +if [ -e @sysconfdir@/mail/submit.mc ]; then + printf "\nsubmit.mc...\n" >&3; + grep -Eve '^(#|dnl|$)' "@sysconfdir@/mail/submit.mc" >&3; + fi; + +printf "\n" >&3; + +# vim:set ai et sts=4 sw=4 tw=0: diff --git a/debian/local/dynamic.in b/debian/local/dynamic.in new file mode 100644 index 0000000..ce96cef --- /dev/null +++ b/debian/local/dynamic.in @@ -0,0 +1,299 @@ +#!/bin/sh +#------------------------------------------------------------------------ +# +# $Sendmail: dynamic,v @sm_version@ @sm_date@ @sm_time@ cowboy Exp $ +# +# Shell functions to handle dynamic network updates. +# Supports ppp, dhcp, ifup/down, etc. +# +# Copyright (c) 2004-@SM_CPYRT@ Richard Nelson. All Rights Reserved. +# +#------------------------------------------------------------------------ +# + +provider_m4='@sysconfdir@/mail/m4/provider.m4'; +dialup_m4='@sysconfdir@/mail/m4/dialup.m4'; + +# Default values +SM_ignore=1; +SM_changed=0; +SM_delay=0; +SM_interface=''; +SM_state='down'; +SM_provider=''; +SM_ip=''; +SM_host=''; +SM_debug=1; + +# Path to other sendmail helpers +if [ -x ./update_sendmail ]; then + sm_path='.'; +elif [ -x $(dirname $0)/update_sendmail ]; then + sm_path=$(dirname $0); +else + sm_path=@datadir@/sendmail; + fi; +# Bring in sendmail.conf for the network definitions +if [ ! -f @sysconfdir@/mail/sendmail.conf ]; then + if [ -x $sm_path/update_conf ]; then + $sm_path/update_conf; + fi; + fi; +DAEMON_NETMODE='Static'; +DAEMON_NETIF=''; +HANDS_OFF='No'; +LOG_CMDS='No'; +if [ -f @sysconfdir@/mail/sendmail.conf ]; then + . @sysconfdir@/mail/sendmail.conf; + fi; + +# Record information on an interface and its status +update_interface() { + SM_interface="$1"; + SM_reason="$2"; + # Do absolutely nothing if they say so... + if [ "$HANDS_OFF" != 'No' ]; then + return; + fi; + if [ -z "$SM_interface" ]; then + SM_ignore=1; + return; + fi; + + # Check to see if we care about this interface + for if in "$DAEMON_NETIF"; do + if [ "$if" = "$SM_interface" ]; then + SM_ignore=0; + break; + fi; + done; + + case "$SM_reason" in + DOWN|EXPIRE|FAIL|RELEASE|STOP) # and TIMEOUT too ?? + SM_state='down'; + ;; + UP|BOUND|RENEW|REBIND|REBOOT|TIMEOUT) + SM_state='up'; + if [ "$SM_reason" = "BOUND" ]; then + SM_changed=1; + fi; + ;; + esac; + + # Mark what we're doing... + local msg="$SM_interface $SM_state $SM_provider $SM_ip $SM_host"; + if [ "$LOG_CMDS" != 'No' ]; then + logger -i -p mail.debug -- "$0 update_interface: $msg"; + fi; + }; + +# Record information about the upstream provider +update_provider() { + SM_provider="$1"; + # Mark what we're doing... + local msg="$SM_interface $SM_state $SM_provider $SM_ip $SM_host"; + if [ "$LOG_CMDS" != 'No' ]; then + logger -i -p mail.debug -- "$0 update_provider: $msg"; + fi; + + # Do absolutely nothing if they say so... + if [ "$HANDS_OFF" != 'No' ]; then + return; + fi; + if [ $SM_ignore != 0 ]; then + return; + fi; + # Add smarthost information (if any)... + # But not if provider.m4 is a link ! + if [ -z "$SM_provider" ]; then + return; + fi; + if [ ! -e "@sysconfdir@/mail/peers/$SM_provider" ]; then + SM_provider='default'; + fi; + if [ -e "@sysconfdir@/mail/peers/$SM_provider" ] \ + && [ ! -L "$provider_m4" ]; then + SM_changed=1; + cat <<-EOT > "$provider_m4"; + LOCAL_CONFIG + #------------------------------------------------------------ + # + # Dynamic provider updates from $0 + # + # NOTE: the following line *MUST* be in @sysconfdir@/mail/sendmail.mc + dnl include(\`@sysconfdir@/mail/provider.m4')dnl + # You may also need to include this file in submit.mc ! + # + # Provider information from @sysconfdir@/mail/peers/$SM_provider + EOT + cat "@sysconfdir@/mail/peers/$SM_provider" >> "$provider_m4"; + cat <<-EOT >> "$provider_m4"; + #------------------------------------------------------------ + EOT + fi; + }; + +# Record information on an ip/host +update_host() { + SM_ip="$1"; + # Mark what we're doing... + local msg="$SM_interface $SM_state $SM_provider $SM_ip $SM_host"; + if [ "$LOG_CMDS" != 'No' ]; then + logger -i -p mail.debug -- "$0 update_host: $msg"; + fi; + + # Do absolutely nothing if they say so... + if [ "$HANDS_OFF" != 'No' ]; then + return; + fi; + if [ $SM_ignore != 0 ]; then + return; + fi; + if [ -z "$SM_ip" ]; then + return; + fi; + find_host; + # Add ip related information (if any)... + # But not if dialup.m4 is a link ! + if [ ! -L "$dialup_m4" ]; then + SM_changed=1; + cat <<-EOT > "$dialup_m4"; + LOCAL_CONFIG + #------------------------------------------------------------ + # + # Dynamic host/ip updates from $0 + # + # NOTE: the following line *MUST* be in @sysconfdir@/mail/sendmail.mc + dnl include(\`@sysconfdir@/mail/dialup.m4')dnl + # This should *NOT* be included in submit.mc ! + # + # Make sure we accept mail as this ip (for bounces, etc) + Cw$SM_ip + EOT + if [ -n "$SM_host" ]; then + cat <<-EOT >> "$dialup_m4"; + # + # Define our true hostname (from our ISP) - becomes \$j + define(\`confDOMAIN_NAME', \`$SM_host')dnl + # + # Make sure we accept mail as this name (for bounces, etc) + Cw$SM_host + # + # Add our hostname to class G for genericstable support + CG$SM_host + #------------------------------------------------------------ + EOT + fi; + fi; + }; + +find_host() { + # Determine our fqdn from our ISP + maxloop=30; + cntr=0; + SM_host=''; + until (test ! -z "$SM_host"); do + cntr=`expr $cntr + 1`; + if [ $cntr -gt $maxloop ]; then + SM_host=''; + break; + fi; + rev=$(host $SM_ip); + SM_host=$(echo "$rev" | grep '^Name:' | awk '{print $2}'); + if [ -z "$SM_host" ]; then + test=$(echo "$rev" | egrep -e 'not found:'); + if [ -n "$test" ]; then + continue; + else + SM_host=${rev##*domain name pointer }; + SM_host=${SM_host%.}; + fi; + fi; + test=$(echo $SM_host | cut -d ' ' -f 1); + if [ "$test" = ";;" ]; then + :; + elif [ "$test" != "**" ]; then + break; + fi; + sleep 1s; + done; + echo "addr=$SM_ip, name=$SM_host"; + }; + +update_sendmail() { + # Mark what we're doing... + local msg="$SM_interface $SM_state $SM_provider $SM_ip $SM_host"; + if [ "$LOG_CMDS" != 'No' ]; then + logger -i -p mail.debug -- "$0 update_sendmail: $msg"; + fi; + + # Do absolutely nothing if they say so... + if [ "$HANDS_OFF" != 'No' ]; then + return; + fi; + if [ $SM_ignore != 0 ]; then + return; + fi; + + # Check for a delayed restart (for DHCP) + case "$1" in + [Dd]*) + if [ "$SM_state" = 'up' ]; then + SM_delay=1; + fi; + ;; + esac; + + if [ "$SM_state" = 'down' ]; then + SM_changed=1; + cat <<-EOT > "$dialup_m4"; + LOCAL_CONFIG + #------------------------------------------------------------ + # + # $SM_interface is $SM_state + # + # NOTE: the following line *MUST* be in @sysconfdir@/mail/sendmail.mc + dnl include(\`@sysconfdir@/mail/dialup.m4')dnl + # This should *NOT* be included in submit.mc ! + # + # sendmail is to only queue messages until connected again + define(\`confDELIVERY_MODE', \`deferred')dnl + # + # Allow the queue to age without carping every four hours + define(\`confTO_QUEUEWARN',\`1d')dnl + # + # Don't keep host status while the network is down + define(\`confHOST_STATUS_DIRECTORY')dnl + #------------------------------------------------------------ + EOT + fi; + + if [ $SM_changed = 1 ]; then + # Build a new sendmail.cf from sendmail.mc, including our address. + make -f @sysconfdir@/mail/Makefile sendmail.cf; + make -f @sysconfdir@/mail/Makefile; + + # Purge any latent host status that might cause us to *NOT* send mail + if [ "$SM_state" = "up" ]; then + AM='-Am'; + if [ ! -f @datadir@/sendmail/cf/feature/msp.m4 ]; then + AM=''; + fi; + if [ -x @libexecdir@/sendmail ]; then + @libexecdir@/sendmail $AM -bH -O Timeout.hoststatus=1s; + fi; + fi; + + # reload (but don't start) sendmail as needed + if [ $SM_delay = 0 ]; then + if [ -x @sysconfdir@/init.d/sendmail ]; then + @sysconfdir@/init.d/sendmail reload-if-running; # up, or down + fi; + fi; + fi; + + # Process the sendmail queue + # (background so as to not defer other ip-up work) + # runq & + }; + diff --git a/debian/local/local_no_masquerade.m4 b/debian/local/local_no_masquerade.m4 deleted file mode 100644 index 5c8a693..0000000 --- a/debian/local/local_no_masquerade.m4 +++ /dev/null @@ -1,25 +0,0 @@ -divert(-1) -#----------------------------------------------------------------------------- -# $Sendmail: ./local_no_masquerade,v 8.9.3 1999/10/20 12:00:00 cowboy Exp $ -# -# Copyright (c) 1999-2001 Richard Nelson. All Rights Reserved. -# -# feature(local_no_masquerade) config file for building Sendmail -# -# Prevent masquerading of local senders when sending to local recipients -# used by: mailer/local.m4 -# -# Note: I originally called this `dont_masquerade_local', but have since -# changed the name to correspond with what Sendmail 8.12.0 supports. -# The local patches to cf/mailer/local.m4 remain unaltered. -# -#----------------------------------------------------------------------------- -# -divert(0) -VERSIONID(`@(#)local_no_masquerade.m4 1.0 (Debian) 1999-10-20') -divert(-1) - -ifdef(`_MAILER_local_', - `errprint(`*** FEATURE(local_no_masquerade) must occur before MAILER(local)')')dnl - -define(`_DONT_MASQUERADE_LOCAL_', 1)dnl diff --git a/debian/local/provider b/debian/local/mail/peers/provider index b9bc496..b9bc496 100644 --- a/debian/local/provider +++ b/debian/local/mail/peers/provider diff --git a/debian/local/service.switch b/debian/local/mail/service.switch index 2a64668..2a64668 100644 --- a/debian/local/service.switch +++ b/debian/local/mail/service.switch diff --git a/debian/local/service.switch-nodns b/debian/local/mail/service.switch-nodns index 583b238..583b238 100644 --- a/debian/local/service.switch-nodns +++ b/debian/local/mail/service.switch-nodns diff --git a/debian/local/parse_mc.in b/debian/local/parse_mc.in index 569e355..c1a5e15 100644 --- a/debian/local/parse_mc.in +++ b/debian/local/parse_mc.in @@ -8,9 +8,9 @@ # Copyright 2000-@SM_CPYRT@ Richard Nelson. All Rights Reserved. # # Notes (to all): -# * for "define(xxx,...)"; "define(xxx," must be on same line, but the -# rest may be split across multiple lines -# * assumes makemap dbtype /etc/mail/database < /etc/mail/database +# * for "define(xxx,...)"; "define(xxx," must be on same line, but the +# rest may be split across multiple lines +# * assumes makemap dbtype /etc/mail/database < /etc/mail/database # # Notes (to self): # * @@ -28,12 +28,13 @@ use Getopt::Long; # parameter handling # BEGIN { $main::my_path = substr($0,$[,rindex($0,'/')) }; use lib ('.', substr($0,$[,rindex($0,'/')), "@datadir@/sendmail"); require Parse_mc; +require Parse_conf; # Version of this program -#($main::MYNAME = $main::0) =~ s|.*/||; -#$main::Author = "Richard Nelson"; -#$main::AuthorMail = "cowboy\@debian.org"; -#$main::Version = '$Revision: 2.00 $ '; +#($main::MYNAME = $main::0) =~ s|.*/||; +#$main::Author = "Richard Nelson"; +#$main::AuthorMail = "cowboy\@debian.org"; +#$main::Version = '$Revision: 2.00 $ '; $main::program_name = $0; $main::program_version = '@sm_version@'; $main::program_date = '@sm_date@ @sm_time@ cowboy'; @@ -62,10 +63,10 @@ if ( ! $result ) { if ( $main::opt_help ) { warn "$main::program_name $main::program_version $main::program_date\n"; warn "$0 \n"; - warn " -help\n" if $main::opt_help; - warn " -debug\n" if $main::opt_debug; - warn " -o $main::opt_output_file\n" if $main::opt_output_file; - warn " -i $main::opt_input_file\n" if $main::opt_input_file; + warn " -help\n" if $main::opt_help; + warn " -debug\n" if $main::opt_debug; + warn " -o $main::opt_output_file\n" if $main::opt_output_file; + warn " -i $main::opt_input_file\n" if $main::opt_input_file; exit 0; }; @@ -75,6 +76,14 @@ my $input_files = join(' ', @main::opt_input_file); # $main::debug is used in parse_mc ! $main::debug = $main::opt_debug || $main::debug; +# Pull in some configuration data +&Parse_conf::read_conf(); +my ($ok, $value) = &Parse_conf::get_value('HANDS_OFF'); +if ($value ne '0') { + unlink "${Parse_mc::database_file}"; + exit; + }; + # Let them know wtf is going on... print STDOUT "Creating ${Parse_mc::database_file}...\n"; diff --git a/debian/local/qtool.8 b/debian/local/qtool.8 deleted file mode 100644 index e40644d..0000000 --- a/debian/local/qtool.8 +++ /dev/null @@ -1,213 +0,0 @@ -.\" Copyright (c) 1999 Sendmail, Inc. and its suppliers. -.\" All rights reserved. -.\" -.\" By using this file, you agree to the terms and conditions set -.\" forth in the LICENSE file which can be found at the top level of -.\" the sendmail distribution. -.\" -.\" -.\" $Id: qtool.8,v 8.12 2000/12/15 19:53:35 gshapiro Exp $ -.\" -.TH QTOOL 8 "$Date: 2000/12/15 19:53:35 $" -.SH NAME -qtool -\- manipulate sendmail queues -.SH SYNOPSIS -.B qtool.pl -.RB [options] -target_directory source [source ...] -.PP -.B qtool.pl [-d|-b] -.RB [options] -source [source ...] -.SH DESCRIPTION -.B Qtool -moves the queue files used by sendmail between queues. It uses the same -locking mechanism as sendmail so can be safely used while sendmail is -running. -.PP -With no options, -.B qtool -will move any queue files as specified by \fIsource\fP into -\fItarget_directory\fP. \fISource\fP can be either an individual -queue control file, a queue file id, or a queue directory. -.PP -If the -d option is specified, qtool will delete the messages specified by -source instead of moving them. -.PP -If the -b option is specified, the selected messages will be bounced by -running sendmail with the -OTimeout.queuereturn=now option. -.SS Options -.TP -\fB\-b\fP -Bounce all of the messages specified by source. The messages will be bounced -immediately. No attempt will be made to deliver the messages. -.TP -\fB\-C\fP configfile -Specify the sendmail config file. -Defaults to /etc/mail/sendmail.cf. -.TP -\fB\-d\fP -Delete all of the messages specified by source. -.TP -\fB\-e\fP \fIperl_expression\fP -Evalute \fIperl_expression\fP for each queue file as specified -by \fIsource\fP. If \fIperl_expression\fP evaluates to true, then that -queue file is moved. See below for more detail on \fIperl_expression\fP. -.TP -\fB\-s\fP \fIseconds\fP -Move only the queue files specified by \fIsource\fP that have a -modification time older than \fIseconds\fP. -.SS Perl Expressions -You can use any valid perl expression. Inside the expression you have -access to a hash that contains many of the fields in the control file as -well as some other data about that queued message. The hash is called -\fI%msg\fP. If a field has multiple values (e.g. 'Recipient'), it will be -returned as an array, otherwise it will be returned as a scalar. Through -\fI%msg\fP, you can access the following variables: -.TP -\fBauth\fP -AUTH= parameter. -.TP -\fBbody_type\fP -Body type (\fB8BITMIME\fP, \fB7BIT\fP, or undefined). -.TP -\fBbody_last_mod_time\fP -The last time the body was modified since the epoch in seconds. -.TP -\fBbody_size\fP -The size of the body file in bytes. -.TP -\fBcharset\fP -Character set (for future use). -.TP -\fBcontent-length\fP -Content-Length: header value (Solaris sendmail only). -.TP -\fBcontrolling_user\fP -The controlling user. -.TP -\fBcontrol_last_mod_time\fP -The last time the body was modified since the epoch in seconds. -.TP -\fBcontrol_size\fP -The size of the control file in bytes. -.TP -\fBcreation_time\fP -The time when the control file was created. -.TP -\fBdata_file_name\fP -The data file name (deprecated). -.TP -\fBenvid\fP -Original envelope id form ESMTP. -.TP -\fBerror_recipient\fP -The error recipient (deprecated). -.TP -\fBflags\fP -Array of characters that can be the following values: -.PD 0 -.RS +8 -.TP 8 -w -warning message has been sent -.TP 8 -r -This is an error respone or DSN -.TP 8 -8 -has 8 bit data in body -.TP 8 -b -delete Bcc: headers -.TP 8 -d -envelope has DSN RET= parameter -.TP 8 -n -don't return body -.PD -.RE -.TP -\fBheaders\fP -This is a Perl hash where the keys are rfc822 field names and the values -are rfc822 field values. If a field has only one value it will be returned -as a string. If a field has more than one value (e.g. 'Received') it will -be returned as a list of strings. -.TP -\fBinode_number\fP -The inode number for the data (body) file. -.TP -\fBnext_delivery_time\fP -Earliest time of next delivery attempt. -.TP -\fBnum_delivery_attempts\fP -Number of delivery attempts that have been made. -.TP -\fBmacro\fP -Defined macro. -.TP -\fBmessage\fP -Envelope status message. -.TP -\fBoriginal_recipient\fP -Original recipient (ORCPT= parameter). -.TP -\fBpriority\fP -Adjusted priority of message. -.TP -\fBrecipient\fP -Array of character flags followed by colon and recipient name. Flags: -.PD 0 -.RS +8 -.TP 8 -N -Has NOTIFY= parameter. -.TP 8 -S -Success DSN requested. -.TP 8 -F -Failure DSN requested. -.TP 8 -D -Delay DSN requested. -.TP 8 -P -Primary address (not the result of alias/forward expansion). -.PD -.RE -.TP -\fBsender\fP -Sender -.TP -\fBversion\fP -Version of control file. -.SH EXAMPLES -.TP -\fBqtool.pl q2 q1\fP -Moves all of the queue files in queue q1 to queue q2. -.TP -\fBqtool.pl q2 q1/d6CLQh100847\fP -Moves the message with id d6CLQh100847 in queue q1 to queue q2. -.TP -\fBqtool.pl q2 q1/qfd6CLQh100847\fP -Moves the message with id d6CLQh100847 in queue q1 to queue q2. -.TP -\fBqtool.pl -e '$msg{num_delivery_attempts} == 3' /q2 /q1\fP -Moves all of the queue files that have had three attempted deliveries from -queue q1 to queue q2. -.SH BUGS -In sendmail 8.12, it is possible for a message's qf and df files -to be stored in different queues. -In this situation, you must give qtool the pathname of the qf file, -not of the df file. -To be safe, never feed qtool the pathname of a df file. -.SH SEE ALSO -sendmail(8) -.SH HISTORY -The -.B qtool -command appeared in -sendmail 8.10. diff --git a/debian/local/qtool.pl b/debian/local/qtool.pl deleted file mode 100644 index aa25fb2..0000000 --- a/debian/local/qtool.pl +++ /dev/null @@ -1,1234 +0,0 @@ -#!/usr/bin/env perl -## -## Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. -## All rights reserved. -## -## $Id: qtool.pl,v 8.20 2000/12/05 16:10:07 dmoen Exp $ -## -use strict; -use File::Basename; -use File::Copy; -use File::Spec; -use Fcntl qw(:flock :DEFAULT); -use Getopt::Std; - -## -## QTOOL -## This program is for moving files between sendmail queues. It is -## pretty similar to just moving the files manually, but it locks the files -## the same way sendmail does to prevent problems. -## -## The syntax is the reverse of mv (ie. the target argument comes -## first). This lets you pick the files you want to move using find and -## xargs. -## -## Since you cannot delete queues while sendmail is running, QTOOL -## assumes that when you specify a directory as a source, you mean that you -## want all of the queue files within that directory moved, not the -## directory itself. -## -## There is a mechanism for adding conditionals for moving the files. -## Just create an Object with a check_move(source, dest) method and add it -## to the $conditions object. See the handling of the '-s' option for an -## example. -## - -## -## OPTION NOTES -## -## The -e option: -## The -e option takes any valid perl expression and evaluates it -## using the eval() function. Inside the expression the variable -## '$msg' is bound to the ControlFile object for the current source -## queue message. This lets you check for any value in the message -## headers or the control file. Here's an example: -## -## ./qtool.pl -e '$msg->{num_delivery_attempts} >= 2' /q1 /q2 -## -## This would move any queue files whose number of delivery attempts -## is greater than or equal to 2 from the queue 'q2' to the queue 'q1'. -## -## See the function ControlFile::parse for a list of available -## variables. -## - -my %opts; -my %sources; -my $dst_name; -my $destination; -my $source_name; -my $source; -my $result; -my $action; -my $new_condition; -my $conditions = new Compound(); - -Getopt::Std::getopts('bC:de:s:', \%opts); - -sub move_action -{ - my $source = shift; - my $destination = shift; - - $result = $destination->add($source); - if ($result) - { - print("$result.\n"); - } -} - -sub delete_action -{ - my $source = shift; - - return $source->delete(); -} - -sub bounce_action -{ - my $source = shift; - - return $source->bounce(); -} - -$action = \&move_action; -if (defined $opts{d}) -{ - $action = \&delete_action; -} -elsif (defined $opts{b}) -{ - $action = \&bounce_action; -} - -if (defined $opts{s}) -{ - $new_condition = new OlderThan($opts{s}); - $conditions->add($new_condition); -} - -if (defined $opts{e}) -{ - $new_condition = new Eval($opts{e}); - $conditions->add($new_condition); -} - -if ($action == \&move_action) -{ - $dst_name = shift(@ARGV); - if (!-d $dst_name) - { - print("The destination '$dst_name' must be an existing " . - "directory.\n"); - usage(); - exit; - } - $destination = new Queue($dst_name); -} - -# determine queue_root by reading config file -my $queue_root; -{ - my $config_file = "/etc/mail/sendmail.cf"; - if (defined $opts{C}) - { - $config_file = $opts{C}; - } - - my $line; - open(CONFIG_FILE, $config_file) or die "$config_file: $!"; - while ($line = <CONFIG_FILE>) - { - chomp $line; - if ($line =~ m/^O QueueDirectory=(.*)/) - { - $queue_root = $1; - if ($queue_root =~ m/(.*)\/[^\/]+\*$/) - { - $queue_root = $1; - } - last; - } - } - close(CONFIG_FILE); - if (!defined $queue_root) - { - die "QueueDirectory option not defined in $config_file"; - } -} - -while (@ARGV) -{ - $source_name = shift(@ARGV); - $result = add_source(\%sources, $source_name); - if ($result) - { - print("$result.\n"); - exit; - } -} - -if (keys(%sources) == 0) -{ - exit; -} - -while (($source_name, $source) = each(%sources)) -{ - $result = $conditions->check_move($source, $destination); - if ($result) - { - $result = &{$action}($source, $destination); - if ($result) - { - print("$result\n"); - } - } -} - -sub usage -{ - print("Usage: $0 [options] directory source ...\n"); - print(" $0 [-d|-b] source ...\n"); - print("options:\n"); - print(" -b Bounce the messages specified by source.\n"); - print(" -C configfile Specify sendmail config file.\n"); - print(" -d Delete the messages specified by source.\n"); - print(" -e [perl expression] Move only messages for which perl expression returns true.\n"); - print(" -s [seconds] Move only messages whose qf file is older than seconds.\n"); -} - -## -## ADD_SOURCE -- Adds a source to the source hash. -## -## Determines whether source is a file, directory, or id. Then it -## creates a QueuedMessage or Queue for that source and adds it to the -## list. -## -## Parameters: -## sources -- A hash that contains all of the sources. -## source_name -- The name of the source to add -## -## Returns: -## error_string -- Undef if ok. Error string otherwise. -## -## Notes: -## If a new source comes in with the same ID as a previous -## source, the previous source gets overwritten in the sources -## hash. This lets the user specify things like * and it still -## works nicely. -## - -sub add_source -{ - my $sources = shift; - my $source_name = shift; - my $source_base_name; - my $source_dir_name; - my $data_dir_name; - my $source_id; - my $source_prefix; - my $queued_message; - my $queue; - my $result; - - ($source_base_name, $source_dir_name) = File::Basename::fileparse($source_name); - $data_dir_name = $source_dir_name; - - $source_prefix = substr($source_base_name, 0, 2); - if (!-d $source_name && $source_prefix ne 'qf' && - $source_prefix ne 'df') - { - $source_base_name = "qf$source_base_name"; - $source_name = File::Spec->catfile("$source_dir_name", - "$source_base_name"); - } - $source_id = substr($source_base_name, 2); - - if (!-e $source_name) - { - $source_name = File::Spec->catfile("$source_dir_name", "qf", - "qf$source_id"); - if (!-e $source_name) - { - return "'$source_name' does not exist"; - } - $data_dir_name = File::Spec->catfile("$source_dir_name", "df"); - if (!-d $data_dir_name) - { - $data_dir_name = $source_dir_name; - } - $source_dir_name = File::Spec->catfile("$source_dir_name", - "qf"); - } - - if (-f $source_name) - { - $queued_message = new QueuedMessage($source_dir_name, - $source_id, - $data_dir_name); - $sources->{$source_id} = $queued_message; - return undef; - } - - if (!-d $source_name) - { - return "'$source_name' is not a plain file or a directory"; - } - - $queue = new Queue($source_name); - $result = $queue->read(); - if ($result) - { - return $result; - } - - while (($source_id, $queued_message) = each(%{$queue->{files}})) - { - $sources->{$source_id} = $queued_message; - } - - return undef; -} - -## -## LOCK_FILE -- Opens and then locks a file. -## -## Opens a file for read/write and uses flock to obtain a lock on the -## file. The flock is Perl's flock which defaults to flock on systems -## that support it. On systems without flock it falls back to fcntl -## locking. -## -## Parameters: -## file_name -- The name of the file to open and lock. -## -## Returns: -## (file_handle, error_string) -- If everything works then -## file_handle is a reference to a file handle and -## error_string is undef. If there is a problem then -## file_handle is undef and error_string is a string -## explaining the problem. -## - -sub lock_file -{ - my $file_name = shift; - my $result; - - $result = sysopen(FILE_TO_LOCK, $file_name, Fcntl::O_RDWR); - if (!$result) - { - return (undef, "Unable to open '$file_name': $!"); - } - - $result = flock(FILE_TO_LOCK, Fcntl::LOCK_EX | Fcntl::LOCK_NB); - if (!$result) - { - return (undef, "Could not obtain lock on '$file_name': $!"); - } - - return (\*FILE_TO_LOCK, undef); -} - -## -## UNLOCK_FILE -- Unlocks a file. -## -## Unlocks a file using Perl's flock. -## -## Parameters: -## file -- A file handle. -## -## Returns: -## error_string -- If undef then no problem. Otherwise it is a -## string that explains problem. -## - -sub unlock_file -{ - my $file = shift; - my $result; - - $result = flock($file, Fcntl::LOCK_UN); - if (!$result) - { - return "Unlock failed on '$result': $!"; - } - - return undef; -} - -## -## MOVE_FILE -- Moves a file. -## -## Moves a file. -## -## Parameters: -## src_name -- The name of the file to be move. -## dst_nome -- The name of the place to move it to. -## -## Returns: -## error_string -- If undef then no problem. Otherwise it is a -## string that explains problem. -## - -sub move_file -{ - my $src_name = shift; - my $dst_name = shift; - my $result; - - $result = File::Copy::move($src_name, $dst_name); - if (!$result) - { - return "File move from '$src_name' to '$dst_name' failed: $!"; - } - - return undef; -} - - -## -## CONTROL_FILE - Represents a sendmail queue control file. -## -## This object represents represents a sendmail queue control file. -## It can parse and lock its file. -## - - -package ControlFile; - -sub new -{ - my $this = shift; - my $class = ref($this) || $this; - my $self = {}; - bless $self, $class; - $self->initialize(@_); - return $self; -} - -sub initialize -{ - my $self = shift; - my $queue_dir = shift; - $self->{id} = shift; - - $self->{file_name} = $queue_dir . '/qf' . $self->{id}; - $self->{headers} = {}; -} - -## -## PARSE - Parses the control file. -## -## Parses the control file. It just sticks each entry into a hash. -## If a key has more than one entry, then it points to a list of -## entries. -## - -sub parse -{ - my $self = shift; - if ($self->{parsed}) - { - return; - } - my %parse_table = - ( - 'A' => 'auth', - 'B' => 'body_type', - 'C' => 'controlling_user', - 'D' => 'data_file_name', - 'd' => 'data_file_directory', - 'E' => 'error_recipient', - 'F' => 'flags', - 'H' => 'parse_header', - 'I' => 'inode_number', - 'K' => 'next_delivery_time', - 'L' => 'content-length', - 'M' => 'message', - 'N' => 'num_delivery_attempts', - 'P' => 'priority', - 'Q' => 'original_recipient', - 'R' => 'recipient', - 'S' => 'sender', - 'T' => 'creation_time', - 'V' => 'version', - 'X' => 'charset', - 'Z' => 'envid', - '$' => 'macro' - ); - my $line; - my $line_type; - my $line_value; - my $member_name; - my $member; - my $last_type; - - open(CONTROL_FILE, "$self->{file_name}"); - while ($line = <CONTROL_FILE>) - { - $line_type = substr($line, 0, 1); - if ($line_type eq "\t" && $last_type eq 'H') - { - $line_type = 'H'; - $line_value = $line; - } - else - { - $line_value = substr($line, 1); - } - $member_name = $parse_table{$line_type}; - $last_type = $line_type; - if (!$member_name) - { - $member_name = 'unknown'; - } - if ($self->can($member_name)) - { - $self->$member_name($line_value); - } - $member = $self->{$member_name}; - if (!$member) - { - $self->{$member_name} = $line_value; - next; - } - if (ref($member) eq 'ARRAY') - { - push(@{$member}, $line_value); - next; - } - $self->{$member_name} = [$member, $line_value]; - } - close(CONTROL_FILE); - - $self->{parsed} = 1; -} - -sub parse_header -{ - my $self = shift; - my $line = shift; - my $headers = $self->{headers}; - my $last_header = $self->{last_header}; - my $header_name; - my $header_value; - my $first_char; - - $first_char = substr($line, 0, 1); - if ($first_char eq "?") - { - $line = substr($line, 3); - } - elsif ($first_char eq "\t") - { - if (ref($headers->{$last_header}) eq 'ARRAY') - { - $headers->{$last_header}[-1] = - $headers->{$last_header}[-1] . $line; - } - else - { - $headers->{$last_header} = $headers->{$last_header} . - $line; - } - return; - } - ($header_name, $header_value) = split(/:/, $line, 2); - $self->{last_header} = $header_name; - if (exists $headers->{$header_name}) - { - $headers->{$header_name} = [$headers->{$header_name}, - $header_value]; - } - else - { - $headers->{$header_name} = $header_value; - } -} - -sub is_locked -{ - my $self = shift; - - return (defined $self->{lock_handle}); -} - -sub lock -{ - my $self = shift; - my $lock_handle; - my $result; - - if ($self->is_locked()) - { - # Already locked - return undef; - } - - ($lock_handle, $result) = ::lock_file($self->{file_name}); - if (!$lock_handle) - { - return $result; - } - - $self->{lock_handle} = $lock_handle; - - return undef; -} - -sub unlock -{ - my $self = shift; - my $result; - - if (!$self->is_locked()) - { - # Not locked - return undef; - } - - $result = ::unlock_file($self->{lock_handle}); - - $self->{lock_handle} = undef; - - return $result; -} - -sub do_stat -{ - my $self = shift; - my $result; - my @result; - - $result = open(QUEUE_FILE, $self->{file_name}); - if (!$result) - { - return "Unable to open '$self->{file_name}': $!"; - } - @result = stat(QUEUE_FILE); - if (!@result) - { - return "Unable to stat '$self->{file_name}': $!"; - } - $self->{control_size} = $result[7]; - $self->{control_last_mod_time} = $result[9]; -} - -sub DESTROY -{ - my $self = shift; - - $self->unlock(); -} - -sub delete -{ - my $self = shift; - my $result; - - $result = unlink($self->{file_name}); - if (!$result) - { - return "Unable to delete $self->{file_name}: $!"; - } - return undef; -} - - -## -## DATA_FILE - Represents a sendmail queue data file. -## -## This object represents represents a sendmail queue data file. -## It is really just a place-holder. -## - -package DataFile; - -sub new -{ - my $this = shift; - my $class = ref($this) || $this; - my $self = {}; - bless $self, $class; - $self->initialize(@_); - return $self; -} - -sub initialize -{ - my $self = shift; - my $data_dir = shift; - $self->{id} = shift; - my $control_file = shift; - - $self->{file_name} = $data_dir . '/df' . $self->{id}; - return if -e $self->{file_name}; - $control_file->parse(); - return if !defined $control_file->{data_file_directory}; - $data_dir = $queue_root . '/' . $control_file->{data_file_directory}; - chomp $data_dir; - if (-d ($data_dir . '/df')) - { - $data_dir .= '/df'; - } - $self->{file_name} = $data_dir . '/df' . $self->{id}; -} - -sub do_stat -{ - my $self = shift; - my $result; - my @result; - - $result = open(QUEUE_FILE, $self->{file_name}); - if (!$result) - { - return "Unable to open '$self->{file_name}': $!"; - } - @result = stat(QUEUE_FILE); - if (!@result) - { - return "Unable to stat '$self->{file_name}': $!"; - } - $self->{body_size} = $result[7]; - $self->{body_last_mod_time} = $result[9]; -} - -sub delete -{ - my $self = shift; - my $result; - - $result = unlink($self->{file_name}); - if (!$result) - { - return "Unable to delete $self->{file_name}: $!"; - } - return undef; -} - - -## -## QUEUED_MESSAGE - Represents a queued sendmail message. -## -## This keeps track of the files that make up a queued sendmail -## message. -## Currently it has 'control_file' and 'data_file' as members. -## -## You can tie it to a fetch only hash using tie. You need to -## pass a reference to a QueuedMessage as the third argument -## to tie. -## - -package QueuedMessage; - -sub new -{ - my $this = shift; - my $class = ref($this) || $this; - my $self = {}; - bless $self, $class; - $self->initialize(@_); - return $self; -} - -sub initialize -{ - my $self = shift; - my $queue_dir = shift; - my $id = shift; - my $data_dir = shift; - - $self->{id} = $id; - $self->{control_file} = new ControlFile($queue_dir, $id); - if (!$data_dir) - { - $data_dir = $queue_dir; - } - $self->{data_file} = new DataFile($data_dir, $id, $self->{control_file}); -} - -sub last_modified_time -{ - my $self = shift; - my @result; - @result = stat($self->{data_file}->{file_name}); - return $result[9]; -} - -sub TIEHASH -{ - my $this = shift; - my $class = ref($this) || $this; - my $self = shift; - return $self; -} - -sub FETCH -{ - my $self = shift; - my $key = shift; - - if (exists $self->{control_file}->{$key}) - { - return $self->{control_file}->{$key}; - } - if (exists $self->{data_file}->{$key}) - { - return $self->{data_file}->{$key}; - } - - return undef; -} - -sub lock -{ - my $self = shift; - - return $self->{control_file}->lock(); -} - -sub unlock -{ - my $self = shift; - - return $self->{control_file}->unlock(); -} - -sub move -{ - my $self = shift; - my $destination = shift; - my $df_dest; - my $qf_dest; - my $result; - - $result = $self->lock(); - if ($result) - { - return $result; - } - - $qf_dest = File::Spec->catfile($destination, "qf"); - if (-d $qf_dest) - { - $df_dest = File::Spec->catfile($destination, "df"); - if (!-d $df_dest) - { - $df_dest = $destination; - } - } - else - { - $qf_dest = $destination; - $df_dest = $destination; - } - - if (-e File::Spec->catfile($qf_dest, "qf$self->{id}")) - { - $result = "There is already a queued message with id '$self->{id}' in '$destination'"; - } - - if (!$result) - { - $result = ::move_file($self->{data_file}->{file_name}, - $df_dest); - } - - if (!$result) - { - $result = ::move_file($self->{control_file}->{file_name}, - $qf_dest); - } - - $self->unlock(); - - return $result; -} - -sub parse -{ - my $self = shift; - - return $self->{control_file}->parse(); -} - -sub do_stat -{ - my $self = shift; - - $self->{control_file}->do_stat(); - $self->{data_file}->do_stat(); -} - -sub setup_vars -{ - my $self = shift; - - $self->parse(); - $self->do_stat(); -} - -sub delete -{ - my $self = shift; - my $result; - - $result = $self->{control_file}->delete(); - if ($result) - { - return $result; - } - $result = $self->{data_file}->delete(); - if ($result) - { - return $result; - } - - return undef; -} - -sub bounce -{ - my $self = shift; - my $command; - - $command = "sendmail -qI$self->{id} -O Timeout.queuereturn=now"; -# print("$command\n"); - system($command); -} - -## -## QUEUE - Represents a queued sendmail queue. -## -## This manages all of the messages in a queue. -## - -package Queue; - -sub new -{ - my $this = shift; - my $class = ref($this) || $this; - my $self = {}; - bless $self, $class; - $self->initialize(@_); - return $self; -} - -sub initialize -{ - my $self = shift; - - $self->{queue_dir} = shift; - $self->{files} = {}; -} - -## -## READ - Loads the queue with all of the objects that reside in it. -## -## This reads the queue's directory and creates QueuedMessage objects -## for every file in the queue that starts with 'qf'. -## - -sub read -{ - my $self = shift; - my @control_files; - my $queued_message; - my $file_name; - my $id; - my $result; - my $control_dir; - my $data_dir; - - $control_dir = File::Spec->catfile($self->{queue_dir}, 'qf'); - - if (-e $control_dir) - { - $data_dir = File::Spec->catfile($self->{queue_dir}, 'df'); - if (!-e $data_dir) - { - $data_dir = $self->{queue_dir}; - } - } - else - { - $data_dir = $self->{queue_dir}; - $control_dir = $self->{queue_dir}; - } - - $result = opendir(QUEUE_DIR, $control_dir); - if (!$result) - { - return "Unable to open directory '$control_dir'"; - } - - @control_files = grep { /^qf.*/ && -f "$control_dir/$_" } readdir(QUEUE_DIR); - closedir(QUEUE_DIR); - foreach $file_name (@control_files) - { - $id = substr($file_name, 2); - $queued_message = new QueuedMessage($control_dir, $id, - $data_dir); - $self->{files}->{$id} = $queued_message; - } - - return undef; -} - - -## -## ADD_QUEUED_MESSAGE - Adds a QueuedMessage to this Queue. -## -## Adds the QueuedMessage object to the hash and moves the files -## associated with the QueuedMessage to this Queue's directory. -## - -sub add_queued_message -{ - my $self = shift; - my $queued_message = shift; - my $result; - - $result = $queued_message->move($self->{queue_dir}); - if ($result) - { - return $result; - } - - $self->{files}->{$queued_message->{id}} = $queued_message; - - return $result; -} - -## -## ADD_QUEUE - Adds another Queue's QueuedMessages to this Queue. -## -## Adds all of the QueuedMessage objects in the passed in queue -## to this queue. -## - -sub add_queue -{ - my $self = shift; - my $queue = shift; - my $id; - my $queued_message; - my $result; - - while (($id, $queued_message) = each %{$queue->{files}}) - { - $result = $self->add_queued_message($queued_message); - if ($result) - { - print("$result.\n"); - } - } -} - -## -## ADD - Adds an item to this queue. -## -## Adds either a Queue or a QueuedMessage to this Queue. -## - -sub add -{ - my $self = shift; - my $source = shift; - my $type_name; - my $result; - - $type_name = ref($source); - - if ($type_name eq "QueuedMessage") - { - return $self->add_queued_message($source); - } - - if ($type_name eq "Queue") - { - return $self->add_queue($source); - } - - return "Queue does not know how to add a '$type_name'" -} - -sub delete -{ - my $self = shift; - my $id; - my $queued_message; - - while (($id, $queued_message) = each %{$self->{files}}) - { - $result = $queued_message->delete(); - if ($result) - { - print("$result.\n"); - } - } -} - -sub bounce -{ - my $self = shift; - my $id; - my $queued_message; - - while (($id, $queued_message) = each %{$self->{files}}) - { - $result = $queued_message->bounce(); - if ($result) - { - print("$result.\n"); - } - } -} - -## -## Condition Class -## -## This next section is for any class that has an interface called -## check_move(source, dest). Each class represents some condition to -## check for to determine whether we should move the file from -## source to dest. -## - - -## -## OlderThan -## -## This Condition Class checks the modification time of the -## source file and returns true if the file's modification time is -## older than the number of seconds the class was initialzed with. -## - -package OlderThan; - -sub new -{ - my $this = shift; - my $class = ref($this) || $this; - my $self = {}; - bless $self, $class; - $self->initialize(@_); - return $self; -} - -sub initialize -{ - my $self = shift; - - $self->{age_in_seconds} = shift; -} - -sub check_move -{ - my $self = shift; - my $source = shift; - - if ((time() - $source->last_modified_time()) > $self->{age_in_seconds}) - { - return 1; - } - - return 0; -} - -## -## Compound -## -## Takes a list of Move Condition Classes. Check_move returns true -## if every Condition Class in the list's check_move function returns -## true. -## - -package Compound; - -sub new -{ - my $this = shift; - my $class = ref($this) || $this; - my $self = {}; - bless $self, $class; - $self->initialize(@_); - return $self; -} - -sub initialize -{ - my $self = shift; - - $self->{condition_list} = []; -} - -sub add -{ - my $self = shift; - my $new_condition = shift; - - push(@{$self->{condition_list}}, $new_condition); -} - -sub check_move -{ - my $self = shift; - my $source = shift; - my $dest = shift; - my $condition; - my $result; - - foreach $condition (@{$self->{condition_list}}) - { - if (!$condition->check_move($source, $dest)) - { - return 0; - } - } - - return 1; -} - -## -## Eval -## -## Takes a perl expression and evaluates it. The ControlFile object -## for the source QueuedMessage is avaliable through the name '$msg'. -## - -package Eval; - -sub new -{ - my $this = shift; - my $class = ref($this) || $this; - my $self = {}; - bless $self, $class; - $self->initialize(@_); - return $self; -} - -sub initialize -{ - my $self = shift; - - $self->{expression} = shift; -} - -sub check_move -{ - my $self = shift; - my $source = shift; - my $dest = shift; - my $result; - my %msg; - - $source->setup_vars(); - tie(%msg, 'QueuedMessage', $source); - $result = eval($self->{expression}); - - return $result; -} diff --git a/debian/local/runq.8 b/debian/local/runq.sendmail.8 index 2e639e4..2e639e4 100644 --- a/debian/local/runq.8 +++ b/debian/local/runq.sendmail.8 diff --git a/debian/local/sendmail.in b/debian/local/sendmail.in index f1dcb61..234b5ed 100644 --- a/debian/local/sendmail.in +++ b/debian/local/sendmail.in @@ -16,6 +16,7 @@ #----------------------------------------------------------------------------- # set -e; +DEBUG=0; #------------------------------------------------------------------------------ # Parameters for the sendmail daemon @@ -27,37 +28,45 @@ Get_Parameters () { # Main configuration parameters in /etc/mail/sendmail.conf DAEMON_MODE='Daemon'; DAEMON_PARMS=''; + DAEMON_UID='root'; QUEUE_MODE="$DAEMON_MODE"; - QUEUE_INTERVAL='10'; + QUEUE_INTERVAL='10m'; QUEUE_PARMS=''; MSP_MODE="$QUEUE_MODE"; MSP_INTERVAL="$QUEUE_INTERVAL"; - MSP_PARMS="$QUEUE_PARMS"; + MSP_PARMS=""; MISC_PARMS=''; CRON_PARMS=''; + LOG_CMDS='Yes'; # Secondary (non-documented) parameters in /etc/mail/sendmail.conf # Caveat Emptor: change these at your own risk - they impact several # disjoint pieces parts... SENDMAIL_ROOT='@localstatedir@/run/sendmail'; - MTA_DAEMON='@sbindir@/sendmail'; - MTA_COMMAND='@sbindir@/sendmail'; + MTA_DAEMON='@sbindir@/sendmail-mta'; + MTA_COMMAND='@sbindir@/sendmail-mta'; MTA_A='-Am'; MTAL_L='-L sm-mta'; MTAL_L_QUEUE='-L sm-mta-queue'; MTAL_L_RUNQ='-L sm-mta-runq'; MTA_ROOT="${SENDMAIL_ROOT}/mta"; MTAL_PIDFILE="${MTA_ROOT}/sendmail.pid"; + MTAL_SOCKET="${MTA_ROOT}/smsocket"; + MTAL_CNTL="${MTA_ROOT}/smcontrol"; MTAQ_L='-L sm-que'; MTAQ_L_RUNQ='-L sm-que-runq'; MTAQ_PIDFILE="${MTA_ROOT}/queue.pid"; - MSP_DAEMON='@sbindir@/sendmail'; - MSP_COMMAND='@sbindir@/sendmail'; + MTAQ_SOCKET="${MTA_ROOT}/qusocket"; + MTAQ_CNTL="${MTA_ROOT}/qucontrol"; + MSP_DAEMON='@sbindir@/sendmail-msp'; + MSP_COMMAND='@sbindir@/sendmail-msp'; MSP_A='-Ac'; MSP_L='-L sm-msp'; MSP_L_QUEUE='-L sm-msp-queue'; MSP_ROOT="${SENDMAIL_ROOT}/msp"; MSP_PIDFILE="${MSP_ROOT}/sendmail.pid"; + MSP_SOCKET="${MSP_ROOT}/smsocket"; + MSP_CNTL="${MSP_ROOT}/smcontrol"; # Pull in any user modified variables if [ -f @sysconfdir@/mail/sendmail.conf ]; then @@ -80,9 +89,11 @@ Get_Parameters () { --start"; STOP_MTAL_CMD="start-stop-daemon \ --pidfile $MTAL_PIDFILE \ + --name sendmail-mta \ --stop"; SIGNAL_MTAL_CMD="start-stop-daemon \ --pidfile $MTAL_PIDFILE \ + --name sendmail-mta \ --stop"; START_MTAQ_CMD="start-stop-daemon \ --pidfile $MTAQ_PIDFILE \ @@ -92,22 +103,25 @@ Get_Parameters () { --start"; STOP_MTAQ_CMD="start-stop-daemon \ --pidfile $MTAQ_PIDFILE \ + --name sendmail-mta \ --stop"; SIGNAL_MTAQ_CMD="start-stop-daemon \ --pidfile $MTAQ_PIDFILE \ + --name sendmail-mta \ --stop"; START_MSP_CMD="start-stop-daemon \ --pidfile $MSP_PIDFILE \ - --make-pidfile \ --exec $MSP_DAEMON \ --startas $MSP_COMMAND \ --chuid smmsp \ --start"; STOP_MSP_CMD="start-stop-daemon \ --pidfile $MSP_PIDFILE \ + --name sendmail-msp \ --stop"; SIGNAL_MSP_CMD="start-stop-daemon \ --pidfile $MSP_PIDFILE \ + --name sendmail-msp \ --stop"; NAME='sendmail'; FLAGS='defaults 50'; @@ -119,8 +133,12 @@ Get_Parameters () { # * Both must be in daemon mode # * They must have the same (possibly empty) parameters if [ "$DAEMON_MODE" = "daemon" \ - -a "$QUEUE_MODE" = "daemon" \ - -a "$DAEMON_PARMS" = "$QUEUE_PARMS" ]; then + -a \( \( "$QUEUE_MODE" = "cron" -o "$QUEUE_MODE" = "none" \) \ + -o \( "$QUEUE_MODE" != "cron" \ + -a "$QUEUE_MODE" != "none" \ + -a "$DAEMON_PARMS" = "$QUEUE_PARMS" \ + \) \ + \) ]; then SPLIT_DAEMON=0; else SPLIT_DAEMON=1; @@ -160,26 +178,44 @@ start_mta () { # Mark restarted for communication betwixt here and /etc/mail/Makefile touch $STAMP_DIR/reload; # - # Allow Unix (local) connections betwixt MSP/MTA: - touch $MTA_ROOT/smsocket; - # - # We can only afford to clean the MTA queues if running daemon mode, - # otherwise, there is a chance that a cronjob might still be using - # the queue... Thats also why we don't clean the MSP queues herein. - clean_queues; - # - # cd to a safe place to stash core files... - cd $MTA_ROOT; - $START_MTAL_CMD -- $MTAL_PARMS & - # - # Update permissions on smsocket - sleep 2; - chown root:root $MTA_ROOT/smsocket; - chmod 0666 $MTA_ROOT/smsocket; + if [ "$DAEMON_MODE" = "daemon" ]; then + # + # Allow Unix (local) connections betwixt MSP/MTA: + touch $MTAL_SOCKET; + # + # We can only afford to clean the MTA queues if running daemon mode, + # otherwise, there is a chance that a cronjob might still be using + # the queue... Thats also why we don't clean the MSP queues herein. + clean_queues; + # + # cd to a safe place to stash core files... + cd $MTA_ROOT; + $START_MTAL_CMD -- $MTAL_PARMS & + # + # Update permissions on smsocket + sleep 2; + chown $DAEMON_UID:smmsp $MTAL_SOCKET; + chmod 0666 $MTAL_SOCKET; + fi; # # Check for split daemon mode (separate listener/queue runner) if [ "$SPLIT_DAEMON" -eq 1 ]; then $START_MTAQ_CMD -- $MTAQ_PARMS & + sleep 2; + qp=`expr "${MTAQ_PARMS}" : '.*\(-qp[0-9]*[smhdw]\)'` || true; + if [ -z "$qp" ]; then + chmod 0664 $MTAQ_PIDFILE; + else + qc=`ps --no-headers -fCsendmail \ + | egrep -e 'Queue control' \ + | awk '{print $2}'`; + if [ -z "$qc" ]; then + rm -f $MTAQ_PIDFILE; + else + chmod 0664 $MTAQ_PIDFILE; + printf "$qc\n$MTA_COMMAND $MTAQ_PARMS" > $MTAQ_PIDFILE; + fi; + fi; fi; # # if running split service, run the client queues (just to make sure) @@ -217,7 +253,7 @@ start_msp () { # cd to a safe place to stash core files... cd $MSP_ROOT; $START_MSP_CMD -- \ - $MSP_A $MSP_L -q${MSP_INTERVAL}m $MSP_PARMS $MISC_PARMS & + $MSP_A $MSP_L -q${MSP_INTERVAL} $MSP_PARMS $MISC_PARMS & }; start_sendmail () { @@ -250,8 +286,8 @@ reload_mta () { # Is running, must signal it... $SIGNAL_MTAL_CMD --signal HUP --oknodo --quiet || true; sleep 2; - chown root:root $MTA_ROOT/smsocket; - chmod 0666 $MTA_ROOT/smsocket; + chown $DAEMON_UID:smmta $MTAL_SOCKET; + chmod 0666 $MTAL_SOCKET; # # Check for split daemon mode (separate listener/queue runner) if [ "$SPLIT_DAEMON" -eq 1 ]; then @@ -306,7 +342,7 @@ stop_mta () { # sleep 2; if $STOP_MTAL_CMD --signal TERM --quiet > /dev/null; then - echo -n 'Waiting .'; + echo -n ' Waiting .'; cnt=0; while $STOP_MTAL_CMD --signal TERM --quiet > /dev/null; do cnt=`expr $cnt + 1`; @@ -348,7 +384,7 @@ stop_queue () { # sleep 2; if $STOP_MTAQ_CMD --signal TERM --quiet > /dev/null; then - echo -n 'Waiting .'; + echo -n ' Waiting .'; cnt=0; while $STOP_MTAQ_CMD --signal TERM --quiet > /dev/null; do cnt=`expr $cnt + 1`; @@ -434,8 +470,8 @@ is_running () { check_dirs; # # Determine proper pidfile to check - PIDFILE=$(echo "$1" | tr '[:upper:]' '[:lower:]'); - case $PIDFILE in + who=$(echo "$1" | tr '[:upper:]' '[:lower:]'); + case $who in mta) PIDFILE="$MTAL_PIDFILE"; ;; @@ -453,6 +489,7 @@ is_running () { # If no pidfile, not running # Extract pid/command and see if still running # Remove pidfile if app didn't + # Also remove any control sockets if [ -s $PIDFILE ]; then PID=`head -n 1 $PIDFILE 2>/dev/null`; COMMAND=`tail -n 1 $PIDFILE`; @@ -460,6 +497,16 @@ is_running () { result=0; else rm -f $PIDFILE; + case $who in + mta) + rm -f $MTAL_SOCKET $MTAL_CNTL; + ;; + queue) + rm -f $MTAQ_SOCKET $MTAQ_CNTL; + ;; + msp) + rm -f $MSP_SOCKET $MSP_CNTL; + esac; fi; fi; return $result; @@ -476,8 +523,8 @@ check_msp () { result=1; if [ ! -f @datadir@/sendmail/cf/feature/msp.m4 ]; then result=1; - elif [ -s @sysconfdir@/mail/submit.cf \ - -a -s @sysconfdir@/mail/submit.mc ]; then + elif [ -s @sysconfdir@/mail/submit.cf ] \ + && [ -s @sysconfdir@/mail/submit.mc ]; then if grep -qEe "^[[:space:]]*\`?FEATURE\([[:space:]]*\`?msp" \ @sysconfdir@/mail/submit.mc; then result=0; @@ -649,12 +696,12 @@ status () { if is_running msp; then echo "MSP: $PID $COMMAND"; ps -fwp $PID; - if [ -S ${MSP_ROOT}/smcontrol ]; then + if [ -S ${MSP_CNTL} ]; then @datadir@/sendmail/smcontrol.pl \ - -f ${MSP_ROOT}/smcontrol status; + -f ${MSP_CNTL} status || true; fi; elif [ $MSP_MODE = 'cron' ]; then - echo 'MSP: is run via cron'; + echo "MSP: is run via cron ($MSP_INTERVAL)"; elif [ $MSP_MODE = 'none' ]; then echo 'MSP: is disabled'; else @@ -666,8 +713,9 @@ status () { if is_running mta; then echo "MTA: $PID $COMMAND"; ps -fwp $PID; - if [ -S ${MTA_ROOT}/smcontrol ]; then - @datadir@/sendmail/smcontrol.pl status; + if [ -S ${MTAL_CNTL} ]; then + @datadir@/sendmail/smcontrol.pl \ + -f ${MTAL_CNTL} status || true; fi; elif [ $DAEMON_MODE = 'inetd' ]; then echo 'MTA: is run via inetd'; @@ -678,15 +726,19 @@ status () { fi; # # Check for split daemon mode (separate listener/queue runner) - if [ "$SPLIT_DAEMON" -eq 0 ]; then - echo "QUE: Same as MTA"; - elif is_running queue; then + if is_running queue; then echo "QUE: $PID $COMMAND"; ps -fwp $PID; + if [ -S ${MTAQ_CNTL} ]; then + @datadir@/sendmail/smcontrol.pl \ + -f ${MTAQ_CNTL} status || true; + fi; elif [ $QUEUE_MODE = 'cron' ]; then - echo 'QUE: is run via cron'; + echo "QUE: is run via cron ($QUEUE_INTERVAL)"; elif [ $QUEUE_MODE = 'none' ]; then echo 'QUE: is disabled'; + elif [ "$SPLIT_DAEMON" -eq 0 ]; then + echo "QUE: Same as MTA"; else echo 'QUE: is not running'; fi; @@ -818,10 +870,14 @@ daemon_check () { *) # Check for split daemon mode (separate listener/queue runner) if [ $SPLIT_DAEMON -eq 0 ]; then - MTAL_PARMS="$MTAL_PARMS -q${QUEUE_INTERVAL}m"; + if [ ! -z "$QUEUE_INTERVAL" ]; then + MTAL_PARMS="$MTAL_PARMS -q${QUEUE_INTERVAL}"; + fi; MTAL_PARMS="$MTAL_PARMS $QUEUE_PARMS"; else - MTAQ_PARMS="$MTAQ_PARMS -q${QUEUE_INTERVAL}m"; + if [ ! -z "$QUEUE_INTERVAL" ]; then + MTAQ_PARMS="$MTAQ_PARMS -q${QUEUE_INTERVAL}"; + fi; MTAQ_PARMS="$MTAQ_PARMS $QUEUE_PARMS"; fi; ;; @@ -833,6 +889,7 @@ daemon_check () { # Add PidFile override for MTA queue runner MTAQ_PARMS="$MTAQ_PARMS -O PidFile=$MTAQ_PIDFILE"; + MTAQ_PARMS="$MTAQ_PARMS -O ControlSocketName=$MTAQ_CNTL"; if [ $run_daemon -lt 2 ]; then echo 'sendmail listen/queue daemon not desired.'; @@ -868,7 +925,7 @@ clean_queues () { # remove zero length qf files #for qffile in $QUEUE/qf*; do for qffile in $(find $QUEUE_ROOT -type f -name 'qf*'); do - if [ -r "$qffile" -a ! -s "$qffile" ]; then + if [ -r "$qffile" ] && [ ! -s "$qffile" ]; then if [ ! -z "$QUIET" ]; then echo -n "<zero: $qffile> "; fi rm -f "$qffile" @@ -877,7 +934,7 @@ clean_queues () { # rename tf files to be qf if the qf does not exist for tffile in $QUEUE/tf*; do qffile=`echo "$tffile" | sed 's/t/q/'` - if [ -r "$tffile" -a ! -f "$qffile" ]; then + if [ -r "$tffile" ] && [ ! -f "$qffile" ]; then if [ ! -z "$QUIET" ]; then echo -n "<recovering: $tffile> "; fi mv "$tffile" "$qffile" @@ -889,7 +946,7 @@ clean_queues () { # remove df files with no corresponding qf files for dffile in $QUEUE/df*; do qffile=`echo "$dffile" | sed 's/d/q/'` - if [ -r "$dffile" -a ! -f "$qffile" ]; then + if [ -r "$dffile" ] && [ ! -f "$qffile" ]; then if [ ! -s "$dffile" ]; then rm -f "$dffile" else @@ -915,26 +972,36 @@ clean_queues () { check_dirs () { if [ ! -d "${SENDMAIL_ROOT}" ]; then mkdir -p "${SENDMAIL_ROOT}"; - chown root:smmsp "${SENDMAIL_ROOT}"; - chmod 02750 "${SENDMAIL_ROOT}"; + chown root:smmta "${SENDMAIL_ROOT}"; + chmod 02755 "${SENDMAIL_ROOT}"; fi; if [ ! -d "${MTA_ROOT}" ]; then mkdir -p "${MTA_ROOT}"; - chown root:smmsp "${MTA_ROOT}"; - chmod 02750 "${MTA_ROOT}"; + chown $DAEMON_UID:smmta "${MTA_ROOT}"; + chmod 02755 "${MTA_ROOT}"; fi; if [ ! -d "${MSP_ROOT}" ]; then mkdir -p "${MSP_ROOT}"; chown smmsp:smmsp "${MSP_ROOT}"; - chmod 02770 "${MSP_ROOT}"; + chmod 02775 "${MSP_ROOT}"; fi; if [ ! -d "${STAMP_DIR}" ]; then mkdir -p "${STAMP_DIR}"; chown root:smmsp "${STAMP_DIR}"; - chmod 02770 "${STAMP_DIR}"; + chmod 02775 "${STAMP_DIR}"; fi; } +#------------------------------------------------------------------------------ +# Why are we here ? +#------------------------------------------------------------------------------ +# Some requisite initialization +if [ -z "$SM_Get_Parameters" ]; then + Get_Parameters; + fi; +if [ "$LOG_CMDS" = "Yes" ]; then + logger -i -p mail.debug -- "$0 $@"; + fi; #------------------------------------------------------------------------------ # Handle being called via an alias @@ -968,6 +1035,10 @@ case $(basename $0) in control $*; exit $?; ;; + status) + status $* + exit $? + ;; *) ;; esac; @@ -975,10 +1046,6 @@ case $(basename $0) in #------------------------------------------------------------------------------ # Handle being called via /etc/init.d/sendmail or directly #------------------------------------------------------------------------------ - -# Some requisite initialization -Get_Parameters; - # Ok, why are we here... case "$1" in @@ -1000,7 +1067,10 @@ case "$1" in restart) echo -n 'Restarting Transport Agent: sendmail'; # reload is equivalent (but faster) than stop/start ! - reload_sendmail; + # but... it doesn't honor changes to /etc/mail/sendmail.conf + #reload_sendmail; + stop_sendmail; + start_sendmail; echo '.'; ;; @@ -1011,6 +1081,14 @@ case "$1" in $0 restart; fi; ;; + + reload-if-running) + if ! is_running mta && ! is_running msp; then + echo 'Mail Transport Agent: sendmail is not running'; + else + $0 reload; + fi; + ;; reload|force-reload) echo -n 'Reloading Mail Transport Agent configuration: sendmail'; @@ -1111,7 +1189,7 @@ case "$1" in echo "Usage: $0 <command>"; echo ' Where <command> is one of the following'; echo ' start|stop|restart|restart-if-running'; - echo ' reload|force-reload'; + echo ' reload-if-running|reload|force-reload'; echo ' newaliases|hoststat|purgestat|mailstats|mailq|runq|control'; echo ' status|debug|clean'; exit 1; diff --git a/debian/local/sendmailconfig.in b/debian/local/sendmailconfig.in index 1c2cf1e..2e980ad 100644 --- a/debian/local/sendmailconfig.in +++ b/debian/local/sendmailconfig.in @@ -20,10 +20,19 @@ SUBMIT_MC="@sysconfdir@/mail/submit.mc"; if [ -x ./update_sendmail ]; then sm_path='.'; elif [ -x $(dirname $0)/update_sendmail ]; then - sm_path=$(dirname $0); + sm_path=$(dirname $0); else - sm_path=@datadir@/sendmail; - fi; + sm_path=@datadir@/sendmail; + fi; +# Bring in sendmail.conf for the network definitions +if [ ! -f @sysconfdir@/mail/sendmail.conf ]; then + if [ -x $sm_path/update_conf ]; then + $sm_path/update_conf; + fi; + fi; +if [ -f @sysconfdir@/mail/sendmail.conf ]; then + . @sysconfdir@/mail/sendmail.conf; + fi; set +e; reload="yes"; @@ -32,75 +41,75 @@ umask 022; #------------------------------------------------------------------------------ while [ $# -gt 0 ]; do - case "$1" in + case "$1" in --no-reload) reload=""; - shift; + shift; ;; *) - echo "Usage: $0 [--no-reload]" >&2; + echo "Usage: $0 [--no-reload]" >&2; exit 1; ;; - esac; + esac; done; #------------------------------------------------------------------------------ descrip() { - echo ''; - echo "$1"; - echo "$1" | sed -e 's/./-/g'; - cat -; - echo ''; + echo ''; + echo "$1"; + echo "$1" | sed -e 's/./-/g'; + cat -; + echo ''; }; yesno() { - local N='N' Y='Y'; - local q="$1" def=$(eval "echo -n \$$2"); + local N='N' Y='Y'; + local q="$1" def=$(eval "echo -n \$$2"); - while :; do + while :; do echo -n "$q? [$def] "; read REPLY; REPLY=$(echo -n "$REPLY" | sed -e "s/^\ *//" -e "s/^\t*//"); test -n "$REPLY" || REPLY="$def"; case "$REPLY" in - [Yy]*) - echo yes > /dev/null; + [Yy]*) + echo yes > /dev/null; eval "$2=\"Y\""; return 0; ;; - [Nn]*) - echo no > /dev/null; + [Nn]*) + echo no > /dev/null; eval "$2=\"N\""; return 1; - ;; + ;; esac; - done; + done; }; input() { - local q="$1" def=$(eval "echo -n \$$2"); + local q="$1" def=$(eval "echo -n \$$2"); - echo -n "$q? [$def] "; - read REPLY - REPLY=$(echo "$REPLY" | sed -e 's/^[ ]*//' -e 's/[ ]*$//' | cat); - test -n "$REPLY" || REPLY="$def"; + echo -n "$q? [$def] "; + read REPLY + REPLY=$(echo "$REPLY" | sed -e 's/^[ ]*//' -e 's/[ ]*$//' | cat); + test -n "$REPLY" || REPLY="$def"; - if [ "NONE" = "$3" ]; then + if [ "NONE" = "$3" ]; then case "$REPLY" in - [NnOoNnEe]) + [Nn][Oo][Nn][Ee]*) REPLY=''; ;; esac; fi; - eval "$2=\"$REPLY\""; + eval "$2=\"$REPLY\""; }; testconfig() { - CONFIG=$(grep -Ee "^[[:space:]]*$1" $SENDMAIL_MC 2>/dev/null); + CONFIG=$(grep -Ee "^[[:space:]]*$1" $SENDMAIL_MC 2>/dev/null); }; makecf() { @@ -131,11 +140,11 @@ if [ -f $SENDMAIL_MC ]; then echo "Edit @sysconfdir@/mail/sendmail.conf and reissue $0."; exit 0; fi; - if yesno "Configure sendmail with the existing $SENDMAIL_MC" Y - then + if yesno "Configure sendmail with the existing $SENDMAIL_MC" Y + then makecf; exit 0; - fi; + fi; fi; ############################################################################### @@ -188,11 +197,16 @@ EOT nullclient="" ! testconfig "FEATURE\(\`?nullclient" || - nullclient=$(echo -n "$CONFIG" | sed -e 's/[^,]*, *\([^)]*\).*/\1/'); + nullclient=$(echo -n "$CONFIG" | sed -e 's/[^,]*, *\([^)]*\).*/\1/'); -input "Null client forward host" nullclient "" NONE; +input "Null client forward host" nullclient NONE; if [ ! -z "$nullclient" ]; then + echo "EXPOSED_USER(root uucp)dnl # users exempt from masquerading" >&3; + echo "LOCAL_USER(root)dnl" >&3; + echo "MASQUERADE_AS(\`$mailname')dnl" >&3; + echo "FEATURE(\`allmasquerade')dnl" >&3; + echo "FEATURE(\`masquerade_envelope')dnl" >&3; echo "FEATURE(\`nullclient', $nullclient)dnl" >&3; fi; @@ -201,7 +215,7 @@ if [ -z "$nullclient" ]; then ############################################################################### descrip "Smart Host" <<EOT A "Smart Host" is one that can deliver mail to external machines. By using -a "Smart Host", we don't need DNS, or good connectivity ourselves. This is +a "Smart Host", we don't need DNS, or good connectivity ourselves. This is most likely what you want if you have a dialup link, or sit behind a firewall. To enable this option, give the name of the host to which all non-local mail @@ -211,21 +225,24 @@ EOT smarthost=""; #if [ -n "$nullclient" ]; then -# smarthost="$nullclient" -# fi +# smarthost="$nullclient" +# fi ! testconfig "define\(\`?SMART_HOST" || - smarthost=$(echo -n "$CONFIG" | sed -e 's/[^:]*:*\([^)]*\).*/\1/'); -input "Smart Host:" smarthost "" NONE; + smarthost=$(echo -n "$CONFIG" | sed -e 's/[^:]*:*\([^)]*\).*/\1/'); +input "Smart Host:" smarthost NONE; -test -z "$smarthost" || echo "define(\`SMART_HOST', \`$smarthost')dnl" >&3; -#if [ -n "$nullclient" -a ! -z "$smarthost" ]; then -# echo "undefine(\`ALIAS_FILE')dnl" >&3 -# echo "define(\`confFORWARD_PATH', \`')dnl" >&3 -# echo "define(\`MAIL_HUB', \`$smarthost')dnl" >&3 -# echo "MASQUERADE_AS(\`$smarthost')dnl" >&3 -# echo "FEATURE(\`allmasquerade')dnl" >&3 -# echo "FEATURE(\`masquerade_envelope')dnl" >&3 -# fi +if [ -n "$smarthost" ]; then + echo "define(\`SMART_HOST', $smarthost)dnl" >&3; + echo "MASQUERADE_AS(\`$mailname')dnl" >&3; + fi; +#if [ -n "$nullclient" ] && [ ! -z "$smarthost" ]; then +# echo "undefine(\`ALIAS_FILE')dnl" >&3 +# echo "define(\`confFORWARD_PATH', \`')dnl" >&3 +# echo "define(\`MAIL_HUB', \`$smarthost')dnl" >&3 +# echo "MASQUERADE_AS(\`$smarthost')dnl" >&3 +# echo "FEATURE(\`allmasquerade')dnl" >&3 +# echo "FEATURE(\`masquerade_envelope')dnl" >&3 +# fi ############################################################################### descrip "Address Canonification" <<EOT @@ -248,22 +265,22 @@ nocanonify="N"; ! testconfig "FEATURE\(\`?nocanonify" || nocanonify="Y"; ! yesno "Disable address canonification" nocanonify || \ - echo "FEATURE(\`nocanonify')dnl" >&3; + echo "FEATURE(\`nocanonify')dnl" >&3; ############################################################################### -descrip "SMTP Mailer" <<EOT -If you plan to exchange mail with other computers, you should enable the -SMTP mailer. Even if you don't plan to exchange mail with other computers, -it is still a good idea to enable this so local programs can use it. -EOT +#descrip "SMTP Mailer" <<EOT +#If you plan to exchange mail with other computers, you should enable the +#SMTP mailer. Even if you don't plan to exchange mail with other computers, +#it is still a good idea to enable this so local programs can use it. +#EOT smtp="Y"; -if [ -f $SENDMAIL_MC ]; then - testconfig "MAILER\(\`?smtp" || smtp="N"; -fi; +#if [ -f $SENDMAIL_MC ]; then +# testconfig "MAILER\(\`?smtp" || smtp="N"; +#fi; -yesno "Enable the SMTP mailer" smtp || true; +#yesno "Enable the SMTP mailer" smtp || true; ############################################################################### @@ -274,11 +291,11 @@ EOT masqenvelope="Y"; if [ -f $SENDMAIL_MC ]; then - testconfig "FEATURE\(\`?masquerade_envelope" || masqenvelope="N"; + testconfig "FEATURE\(\`?masquerade_envelope" || masqenvelope="N"; fi; ! yesno "Masquerade envelopes" masqenvelope || \ - echo "FEATURE(\`masquerade_envelope')dnl" >&3; + echo "FEATURE(\`masquerade_envelope')dnl" >&3; ############################################################################### @@ -298,7 +315,7 @@ allmasquerade="N"; ! testconfig "FEATURE\(\`?allmasquerade" || allmasquerade="Y"; ! yesno "All masquerade" allmasquerade || \ - echo "FEATURE(\`allmasquerade')dnl" >&3; + echo "FEATURE(\`allmasquerade')dnl" >&3; ############################################################################### @@ -310,7 +327,7 @@ local_no_masquerade="N"; ! testconfig "FEATURE\(\`?local_no_masquerade" || local_no_masquerade="Y"; ! yesno "Dont masquerade local" local_no_masquerade || - echo "FEATURE(\`local_no_masquerade')dnl" >&3; + echo "FEATURE(\`local_no_masquerade')dnl" >&3; ############################################################################### @@ -323,7 +340,7 @@ alwaysdomain="N"; ! testconfig "FEATURE\(\`?always_add_domain" || alwaysdomain="Y"; ! yesno "Always add domain" alwaysdomain || \ - echo "FEATURE(\`always_add_domain')dnl" >&3; + echo "FEATURE(\`always_add_domain')dnl" >&3; ############################################################################### @@ -337,7 +354,7 @@ EOT acceptmailname="Y"; if [ -f $SENDMAIL_MC ]; then - testconfig "^Cw.*$mailname" || acceptmailname="N"; + testconfig "^Cw.*$mailname" || acceptmailname="N"; fi; yesno "Accept mail for \`$mailname'" acceptmailname || true; @@ -360,16 +377,16 @@ EOT cw_file="@sysconfdir@/mail/local-host-names"; altnames=$(cat "$cw_file" 2>/dev/null | tr -s '\n \t' ' ' | - sed -e 's/^ *//' -e 's/ *$//'); + sed -e 's/^ *//' -e 's/ *$//'); input "Alternate names" altnames NONE; if [ -n "$altnames" ]; then - echo "$altnames" | tr -s ' \t' '\n' >$cw_file; + echo "$altnames" | tr -s ' \t' '\n' >$cw_file; else - echo "localhost" >$cw_file; + echo "localhost" >$cw_file; fi; chown root:smmsp $cw_file; - chmod 0644 $cw_file; + chmod 0644 $cw_file; echo "FEATURE(\`use_cw_file')dnl" >&3; @@ -389,15 +406,15 @@ EOT ct_file="@sysconfdir@/mail/trusted-users"; trusted=$(cat "$ct_file" 2>/dev/null | tr -s '\n \t' ' ' | - sed -e 's/^ *//' -e 's/ *$//'); + sed -e 's/^ *//' -e 's/ *$//'); input "Trusted users" trusted NONE; if [ -n "$trusted" ]; then - echo "$trusted" | tr -s ' \t' '\n' >$ct_file; + echo "$trusted" | tr -s ' \t' '\n' >$ct_file; chown root:smmsp $ct_file; chmod 0644 $ct_file; else - cat /dev/null >$ct_file; + cat /dev/null >$ct_file; fi; echo "FEATURE(\`use_ct_file')dnl" >&3; @@ -434,7 +451,7 @@ EOT uucp="Y"; if [ -f $SENDMAIL_MC ]; then - testconfig "FEATURE\(\`?nouucp" || uucp="Y"; + testconfig "FEATURE\(\`?nouucp" || uucp="Y"; fi; yesno "Enable UUCP addressing" uucp || \ @@ -490,7 +507,7 @@ bestmxlocal="N"; ! testconfig "FEATURE\(\`?bestmx_is_local" || bestmxlocal="Y"; ! yesno "Assume best MX is local" bestmxlocal || \ - echo "FEATURE(\`bestmx_is_local')dnl" >&3; + echo "FEATURE(\`bestmx_is_local')dnl" >&3; ############################################################################### @@ -509,7 +526,7 @@ mailertable="N"; ! testconfig "FEATURE\(\`?mailertable" || mailertable="Y"; ! yesno "Enable the mailertable feature" mailertable || \ - echo "FEATURE(\`mailertable')dnl" >&3; + echo "FEATURE(\`mailertable')dnl" >&3; ############################################################################### @@ -525,37 +542,37 @@ smrsh="Y"; ! testconfig "FEATURE\(\'?smrsh" || smrsh="Y"; ! yesno "Use the Sendmail Restricted Shell (smrsh)" smrsh || \ - echo "FEATURE(\`smrsh', \`@libexecdir@/smrsh')dnl" >&3; + echo "FEATURE(\`smrsh', \`@libexecdir@/smrsh')dnl" >&3; ############################################################################### -descrip "Mailer Name" <<EOT -You can change the name used for internally generated outgoing messages. -Usually this is \`MAILER-DAEMON' but it would not be unreasonable to change -it to something such as \`postmaster'. -EOT +#descrip "Mailer Name" <<EOT +#You can change the name used for internally generated outgoing messages. +#Usually this is \`MAILER-DAEMON' but it would not be unreasonable to change +#it to something such as \`postmaster'. +#EOT -daemon="MAILER-DAEMON"; -! testconfig "define\(\`?confMAILER_NAME" || - daemon=$(echo -n "$CONFIG" | sed -e 's/[^,]*, *`\([^'"'"']*\).*/\1/'); +#daemon="MAILER-DAEMON"; +#! testconfig "define\(\`?confMAILER_NAME" || +# daemon=$(echo -n "$CONFIG" | sed -e 's/[^,]*, *`\([^'"'"']*\).*/\1/'); -input "Mailer name" daemon; +#input "Mailer name" daemon; -test "MAILER-DAEMON" = "$daemon" || - echo "define(\`confMAILER_NAME', \`$daemon')dnl" >&3; +#test "MAILER-DAEMON" = "$daemon" || +# echo "define(\`confMAILER_NAME', \`$daemon')dnl" >&3; ############################################################################### -descrip "Me Too" <<EOT -Sendmail normally excludes the sender address from group expansion. Enabling -this option will cause the sender to be included. -EOT +#descrip "Me Too" <<EOT +#Sendmail normally excludes the sender address from group expansion. Enabling +#this option will cause the sender to be included. +#EOT -metoo="N"; -! testconfig "define\(\`?confME_TOO.*True" || metoo="Y"; +#metoo="N"; +#! testconfig "define\(\`?confME_TOO.*True" || metoo="Y"; -! yesno "Enable me too option" metoo || - echo "define(\`confME_TOO', True)dnl" >&3; +#! yesno "Enable me too option" metoo || +# echo "define(\`confME_TOO', True)dnl" >&3; ############################################################################### @@ -572,11 +589,11 @@ EOT qw="4h"; ! testconfig "define\(\`?confTO_QUEUEWARN" || - qw=$(echo -n "$CONFIG" | sed -e 's/[^,]*, *`\([^'"'"']*\).*/\1/'); + qw=$(echo -n "$CONFIG" | sed -e 's/[^,]*, *`\([^'"'"']*\).*/\1/'); qr="5d"; ! testconfig "define\(\`?confTO_QUEUERETURN" || - qr=$(echo -n "$CONFIG" | sed -e 's/[^,]*, *`\([^'"'"']*\).*/\1/'); + qr=$(echo -n "$CONFIG" | sed -e 's/[^,]*, *`\([^'"'"']*\).*/\1/'); timeouts="$qw/$qr"; @@ -594,8 +611,8 @@ cat <<-EOT >&3 dnl # dnl # Dialup/LAN connection overrides dnl # -include(\`@sysconfdir@/mail/dialup.m4')dnl -include(\`@sysconfdir@/mail/provider.m4')dnl +include(\`@sysconfdir@/mail/m4/dialup.m4')dnl +include(\`@sysconfdir@/mail/m4/provider.m4')dnl dnl # EOT @@ -610,7 +627,7 @@ test "N" = "$smtp" || echo "MAILER(smtp)dnl" >&3; if [ -e /etc/ifmail/config ] && \ [ -e @datadir@/sendmail/cf/mailer/ifmail.m4 ]; then - echo "MAILER(ifmail)dnl" >&3; + echo "MAILER(ifmail)dnl" >&3; fi; ############################################################################### @@ -623,13 +640,13 @@ fi; # finished non-"null client" configuration echo "" >&3; echo "LOCAL_CONFIG" >&3; #if [ -z $nullclient ]; then -# echo "MASQUERADE_AS($mailname)dnl" >&3 -# fi +# echo "MASQUERADE_AS($mailname)dnl" >&3 +# fi if [ -f $SENDMAIL_MC ]; then - sed -n -e '/^## Custom/,$p' $SENDMAIL_MC >&3; + sed -n -e '/^## Custom/,$p' $SENDMAIL_MC >&3; else - echo "## Custom configurations below (will be preserved)" >&3; + echo "## Custom configurations below (will be preserved)" >&3; fi; descrip "Configuration Complete" <<EOT @@ -665,7 +682,7 @@ if [ ! -f @datadir@/sendmail/cf/feature/msp.m4 ]; then chmod 0644 $SUBMIT_MC.new; mv -f $SUBMIT_MC.new $SUBMIT_MC; fi; -trap 0; +trap - 0; makecf; exit 0; diff --git a/debian/local/update_auth.in b/debian/local/update_auth.in index 558c8b1..9b2a58e 100644 --- a/debian/local/update_auth.in +++ b/debian/local/update_auth.in @@ -20,34 +20,74 @@ DOMAINNAME=`hostname -d`; SMUID=sendmail; SMAID=sendmail; SMPWD=sendmailpwd; -SMRLM=$HOSTNAME.$DOMAINNAME; +SMRLM="$HOSTNAME.$DOMAINNAME"; +SMMCH=''; -# Check if SASL is installed -if [ -d /usr/lib/sasl2 -a @sm_version_math@ -ge 527364 ]; then +# Path to other sendmail helpers +if [ -x ./update_sendmail ]; then + sm_path='.'; +elif [ -x $(dirname $0)/update_sendmail ]; then + sm_path=$(dirname $0); +else + sm_path=@datadir@/sendmail; + fi; +# Bring in sendmail.conf for the network definitions +if [ ! -f @sysconfdir@/mail/sendmail.conf ]; then + if [ -x $sm_path/update_conf ]; then + $sm_path/update_conf; + fi; + fi; +if [ -f @sysconfdir@/mail/sendmail.conf ]; then + . @sysconfdir@/mail/sendmail.conf; + fi; +if [ "$HANDS_OFF" != 'No' ]; then + exit 0; + fi; + +# See what sendmail was linked with +if [ "@sm_enable_auth@" != "yes" ]; then + echo "SASL support not included in sendmail, skipping..."; + exit 0; +elif [ @sm_auth_lib@ -eq 2 ]; then SASLDBLISTUSERS='/usr/sbin/sasldblistusers2'; SASLPASSWD='/usr/sbin/saslpasswd2'; SASLLIB='/usr/lib/sasl2'; SASLSO='2'; SASLDB='/etc/sasldb2'; SASL_BIN='sasl2-bin'; - echo " SASL V2 not supported for the nonce, checking for SASL V1"; - fi; -if [ -d /usr/lib/sasl ]; then + SASL_LIB='libsasl2'; + SASL='SASL2'; +elif [ @sm_auth_lib@ -eq 1 ]; then SASLDBLISTUSERS='/usr/sbin/sasldblistusers'; SASLPASSWD='/usr/sbin/saslpasswd'; SASLLIB='/usr/lib/sasl'; SASLSO='1'; SASLDB='/etc/sasldb'; SASL_BIN='sasl-bin'; -else + SASL_LIB='libsasl'; + SASL='SASL'; + fi; + +# Check if SASL is installed +if [ ! -d ${SASLLIB} ]; then cat <<-EOT - SASL not installed, not configuring sendmail support. + ${SASL} not installed, not configuring sendmail support. - To install sasl, get sasl-bin, libsasl-modules-plain, - libsasl-digestmd5-plain or libsasl-digestmd5-des. + EOT + if [ "${SASLSO}" = '1' ]; then + cat <<-EOT + To install ${SASL}, get ${SASL_BIN}, ${SASL_LIB}-modules-plain, + ${SASL_LIB}-digestmd5-plain or ${SASL_LIB}-digestmd5-des. + EOT + else + cat <<-EOT + To install ${SASL}, get ${SASL_BIN} and ${SASL_LIB}-modules. + EOT + fi; + cat <<-EOT - To enable sendmail SASL support at a later date, invoke "$0" + To enable sendmail ${SASL} support at a later date, invoke "$0" EOT exit 0; @@ -58,36 +98,34 @@ if [ ! -x ${SASLPASSWD} ]; then cat <<-EOT ${SASL_BIN} not installed, not configuring sendmail support. - To enable sendmail SASL support at a later date, invoke "$0" + To enable sendmail ${SASL} support at a later date, invoke "$0" EOT exit 0; fi; #echo " "; -#echo "Creating/Updating SASL information"; +#echo "Creating/Updating ${SASL} information"; +touch @sysconfdir@/mail/tsasl; +if chown root:sasl @sysconfdir@/mail/tsasl 2>/dev/null; then + adduser smmta sasl 1>/dev/null 2>&1; + adduser smmsp sasl 1>/dev/null 2>&1; + fi; + rm @sysconfdir@/mail/tsasl; # See if we need to rename an existing SASL info file -if [ -f @sysconfdir@/mail/auth-info -a \ - ! -f @sysconfdir@/mail/default-auth-info ]; then +if [ -f @sysconfdir@/mail/auth-info ] \ +&& [ ! -f @sysconfdir@/mail/default-auth-info ]; then mv @sysconfdir@/mail/auth-info \ @sysconfdir@/mail/default-auth-info; fi; -# Create Default SASL auth information -if [ ! -f @sysconfdir@/mail/default-auth-info ]; then - cat <<-EOT > @sysconfdir@/mail/default-auth-info - $SMUID - $SMAID - $SMPWD - $SMRLM - EOT - # Use exisisting SASL auth information -else +if [ -f @sysconfdir@/mail/default-auth-info ]; then SMUID=$(head -n1 @sysconfdir@/mail/default-auth-info); SMAID=$(head -n2 @sysconfdir@/mail/default-auth-info | tail -n1 -); SMPWD=$(head -n3 @sysconfdir@/mail/default-auth-info | tail -n1 -); SMRLM=$(head -n4 @sysconfdir@/mail/default-auth-info | tail -n1 -); + SMMCH=$(head -n5 @sysconfdir@/mail/default-auth-info | tail -n1 -); fi; # Check for default settings, used in later test @@ -97,104 +135,158 @@ if [ "$SMUID" = 'sendmail' ] \ DEFAULT=1; fi; +# Create Default SASL auth information +if [ ! -f @sysconfdir@/mail/default-auth-info ]; then + cat <<-EOT > @sysconfdir@/mail/default-auth-info + $SMUID + $SMAID + $SMPWD + $SMRLM + $SMMCH + EOT + fi; + # Create any missing SASL configuration files if [ -d ${SASLLIB} ]; then # SASL password configuration if [ ! -f ${SASLLIB}/saslpasswd.conf ]; then NEW=1; - cp @datadir@/sendmail/examples/sasl/saslpasswd.conf \ + cp @datadir@/sendmail/examples/sasl/saslpasswd.conf.${SASLSO} \ ${SASLLIB}/saslpasswd.conf; fi; chown root:root ${SASLLIB}/saslpasswd.conf; chmod 0640 ${SASLLIB}/saslpasswd.conf; # Sendmail SASL configuration - if [ ! -L ${SASLLIB}/Sendmail.conf ]; then + if [ -L ${SASLLIB}/Sendmail.conf ]; then + ln -sf @sysconfdir@/mail/sasl/Sendmail.conf.${SASLSO} \ + ${SASLLIB}/Sendmail.conf; + else if [ -f ${SASLLIB}/Sendmail.conf ]; then - mv ${SASLLIB}/Sendmail.conf @sysconfdir@/mail/sasl/Sendmail.conf; + mv ${SASLLIB}/Sendmail.conf \ + @sysconfdir@/mail/sasl/Sendmail.conf.${SASLSO}; fi; - ln -sf @sysconfdir@/mail/sasl/Sendmail.conf \ + ln -sf @sysconfdir@/mail/sasl/Sendmail.conf.${SASLSO} \ ${SASLLIB}/Sendmail.conf; fi; # Make sure libraries are properly installed... ( cd ${SASLLIB} && \ - if [ -L libanonymous.so.${SASLSO} -a ! -L libanonymous.so ]; then \ + if [ -L libanonymous.so.${SASLSO} ] && [ ! -L libanonymous.so ]; then \ ln -s libanonymous.so.${SASLSO} libanonymous.so; \ fi; \ - if [ -L libcrammd5.so.${SASLSO} -a ! -L libcrammd5.so ]; then \ + if [ -L libcrammd5.so.${SASLSO} ] && [ ! -L libcrammd5.so ]; then \ ln -s libcrammd5.so.${SASLSO} libcrammd5.so; \ fi; \ - if [ -L libdigestmd5.so.${SASLSO} -a ! -L libdigestmd5.so ]; then \ + if [ -L libdigestmd5.so.${SASLSO} ] && [ ! -L libdigestmd5.so ]; then \ ln -s libdigestmd5.so.${SASLSO} libdigestmd5.so; \ fi; \ - if [ -L libdigestmd5.so.0 -a ! -L libdigestmd5.so ]; then \ + if [ -L libdigestmd5.so.0 ] && [ ! -L libdigestmd5.so ]; then \ ln -s libdigestmd5.so.0 libdigestmd5.so; \ fi; \ - if [ -L libgssapiv2.so.${SASLSO} -a ! -L libgssapiv2.so ]; then \ + if [ -L libgssapiv2.so.${SASLSO} ] && [ ! -L libgssapiv2.so ]; then \ ln -s libgssapiv2.so.${SASLSO} libgssapiv2.so; \ fi; \ - if [ -L liblogin.so.${SASLSO} -a ! -L liblogin.so ]; then \ + if [ -L liblogin.so.${SASLSO} ] && [ ! -L liblogin.so ]; then \ ln -s liblogin.so.${SASLSO} liblogin.so; \ fi; \ - if [ -L liblogin.so.0 -a ! -L liblogin.so ]; then \ + if [ -L liblogin.so.0 ] && [ ! -L liblogin.so ]; then \ ln -s liblogin.so.0 liblogin.so; \ fi; \ - if [ -L libplain.so.${SASLSO} -a ! -L libplain.so ]; then \ + if [ -L libplain.so.${SASLSO} ] && [ ! -L libplain.so ]; then \ ln -s libplain.so.${SASLSO} libplain.so; \ fi; ) fi; # Create/update sendmail SASL files -if [ ! -f @sysconfdir@/mail/sasl/Sendmail.conf ]; then +chown smmta:smmsp @sysconfdir@/mail/sasl; +chmod 0755 @sysconfdir@/mail/sasl; +if [ ! -f @sysconfdir@/mail/sasl/Sendmail.conf.${SASLSO} ] \ +&& [ -f @sysconfdir@/mail/sasl/Sendmail.conf ]; then + mv @sysconfdir@/mail/sasl/Sendmail.conf \ + @sysconfdir@/mail/sasl/Sendmail.conf.${SASLSO}; + fi; +if [ ! -f @sysconfdir@/mail/sasl/Sendmail.conf.${SASLSO} ]; then NEW=1; - cp @datadir@/sendmail/examples/sasl/Sendmail.conf \ - @sysconfdir@/mail/sasl/Sendmail.conf; - fi; -chown root:smmsp @sysconfdir@/mail/sasl/Sendmail.conf; -chmod 0640 @sysconfdir@/mail/sasl/Sendmail.conf; + cp @datadir@/sendmail/examples/sasl/Sendmail.conf.${SASLSO} \ + @sysconfdir@/mail/sasl/; + fi; +chown smmta:smmsp @sysconfdir@/mail/sasl/Sendmail.conf.${SASLSO}; +chmod 0640 @sysconfdir@/mail/sasl/Sendmail.conf.${SASLSO}; + +#--------------------------------------------------------------------------- +# Make sure prototype /etc/mail/sasl/sasl.m4 exists +$sm_path/update_authm4 || true; # Recommend PAM for sendmail authorization -if ! grep -qEe "^[[:space:]]*pwcheck_method:[[:space:]]*PAM" \ - ${SASLLIB}/Sendmail.conf; then +if [ "${SASLSO}" = "2" ]; then + if grep -qEe '^[[:space:]]*auto_transition:[[:space:]]*false' \ + @sysconfdir@/mail/sasl/Sendmail.conf.${SASLSO}; then + sed -e \ + 's?^[[:space:]]*auto_transition:.*$?auto_transition: true?' \ + @sysconfdir@/mail/sasl/Sendmail.conf.${SASLSO} \ + > @sysconfdir@/mail/sasl/Sendmail.conf.new; + fi; + if [ -f @sysconfdir@/mail/sasl/Sendmail.conf.new ]; then + chown smmta:smmsp @sysconfdir@/mail/sasl/Sendmail.conf.new; + chmod 0644 @sysconfdir@/mail/sasl/Sendmail.conf.new; + mv @sysconfdir@/mail/sasl/Sendmail.conf.new \ + @sysconfdir@/mail/sasl/Sendmail.conf.${SASLSO}; + fi; + cat <<-EOT + + Ah, you're setup with SASL${SASLSO} ! + + Unfortunately, there is no automagic way to migrate to ${SASLDB} :( - It is *strongly* recommended that you use PAM as the authentication - method for sendmail via SASL. Doing so will allow *all* your shell - users (those with an /etc/passwd entry) to automagically authenticate - themselves when using a MUA with SASL support turned on. + You'll want to make sure /etc/default/saslauthd is setup to start, + and has at least MECHANISMS="pam" ! - Do you wish to use PAM (Y|n)? + If you find out what more is needed, please let me know! EOT - read yn; - yn=$(echo -n "$yn" | sed -e "s/^\ *//" -e "s/^\t*//"); - test -n "$yn" || yn="Y"; - case "$yn" in - [Yy]*) - if grep -qEe '^[[:space:]]*pwcheck_method:' \ - @sysconfdir@/mail/sasl/Sendmail.conf; then - sed -e \ - 's?^[[:space:]]*pwcheck_method:.*$?pwcheck_method: PAM?' \ - @sysconfdir@/mail/sasl/Sendmail.conf \ - > @sysconfdir@/mail/sasl/Sendmail.conf.new; - else - echo 'pwcheck_method: PAM' \ - | cat @sysconfdir@/mail/sasl/Sendmail.conf - \ +else + if ! grep -qEe "^[[:space:]]*pwcheck_method:[[:space:]]*PAM" \ + ${SASLLIB}/Sendmail.conf; then + cat <<-EOT + + It is *strongly* recommended that you use PAM as the authentication + method for sendmail via ${SASL}. Doing so will allow *all* your shell + users (those with an /etc/passwd entry) to automagically authenticate + themselves when using a MUA with ${SASL} support turned on. + + Do you wish to use PAM (Y|n)? + EOT + read yn; + yn=$(echo -n "$yn" | sed -e "s/^\ *//" -e "s/^\t*//"); + test -n "$yn" || yn="Y"; + case "$yn" in + [Yy]*) + if grep -qEe '^[[:space:]]*pwcheck_method:' \ + @sysconfdir@/mail/sasl/Sendmail.conf.${SASLSO}; then + sed -e \ + 's?^[[:space:]]*pwcheck_method:.*$?pwcheck_method: PAM?' \ + @sysconfdir@/mail/sasl/Sendmail.conf.${SASLSO} \ > @sysconfdir@/mail/sasl/Sendmail.conf.new; - fi; - if [ -f @sysconfdir@/mail/sasl/Sendmail.conf.new ]; then - chown root:smmsp @sysconfdir@/mail/sasl/Sendmail.conf.new; - chmod 0644 @sysconfdir@/mail/sasl/Sendmail.conf.new; - mv @sysconfdir@/mail/sasl/Sendmail.conf.new \ - @sysconfdir@/mail/sasl/Sendmail.conf; - fi; - ;; - esac; + else + echo 'pwcheck_method: PAM' \ + | cat @sysconfdir@/mail/sasl/Sendmail.conf.${SASLSO} - \ + > @sysconfdir@/mail/sasl/Sendmail.conf.new; + fi; + if [ -f @sysconfdir@/mail/sasl/Sendmail.conf.new ]; then + chown smmta:smmsp @sysconfdir@/mail/sasl/Sendmail.conf.new; + chmod 0640 @sysconfdir@/mail/sasl/Sendmail.conf.new; + mv @sysconfdir@/mail/sasl/Sendmail.conf.new \ + @sysconfdir@/mail/sasl/Sendmail.conf.${SASLSO}; + fi; + ;; + esac; + fi; fi; # Make sure default-auth-info is secure if [ -f @sysconfdir@/mail/default-auth-info ]; then - chown root:smmsp @sysconfdir@/mail/default-auth-info; + chown smmta:smmsp @sysconfdir@/mail/default-auth-info; chmod 0640 @sysconfdir@/mail/default-auth-info; fi; @@ -208,9 +300,9 @@ if [ ! -f ${SASLDB} ]; then chown root:smmsp ${SASLDB}; chmod 0660 ${SASLDB}; else - echo "*** You do not have the sasl-bin package installed!"; + echo "*** You do not have the ${SASL_BIN} package installed!"; echo "*** Please install it and rerun $0"; - echo "*** Sendmail can't use SASL until this is done..."; + echo "*** Sendmail can't use ${SASL} until this is done..."; fi; fi; @@ -235,11 +327,18 @@ if [ -f ${SASLDB} ]; then if [ $NEW -eq 1 ]; then cat <<-EOT - SASL is now minimally setup, there are a few ways to handle users: + To enable sendmail to use SASLS, you need to: + 1) Add this line to @sysconfdir@/mail/sendmail.mc and optionally + to @sysconfdir@/mail/submit.mc: + include(\`@sysconfdir@/mail/sasl/sasl.m4')dnl + 2) Run sendmailconfig + 3) Restart sendmail + + ${SASL} is now minimally setup, there are a few ways to handle users: *) Allow only shell users (default) You're all set, nothing else to do ! *) Allow users other than shell - Add users via /usr/sbin/saslpasswd and make sure that the + Add users via ${SASLPASSWD} and make sure that the realm you used matches what your users specify in their netscape/outlook/mutt/etc profiles. diff --git a/debian/local/update_authm4.in b/debian/local/update_authm4.in new file mode 100644 index 0000000..6c9bf03 --- /dev/null +++ b/debian/local/update_authm4.in @@ -0,0 +1,257 @@ +#!/usr/bin/perl -w +#------------------------------------------------------------------------ +# +# $Sendmail: update_auth,v @sm_version@ @sm_date@ @sm_time@ cowboy Exp $ +# +# Create @sysconfdir@/mail/sasl/sasl.m4 for Debian Sendmail +# +# Copyright 1998-@SM_CPYRT@ Richard Nelson. All Rights Reserved. +# +# Notes (to all): +# * +# +# Notes (to self): +# * +# +#------------------------------------------------------------------------ +# +# Initialization of the perl environment +use strict; # be kosher +use Cwd; # provide cwd() +use Env; # A few environmental references +use integer; # Peformance +use Sys::Hostname; # make sure we have a valid hostname +use Getopt::Long; # parameter handling + +# Local libraries - for Debian Sendmail Perl helper functions +# BEGIN { $main::my_path = substr($0,$[,rindex($0,'/')) }; +use lib ('.', substr($0,$[,rindex($0,'/')), "@datadir@/sendmail"); +require Parse_mc; + +# Version of this program +#($main::MYNAME = $main::0) =~ s|.*/||; +#$main::Author = "Richard Nelson"; +#$main::AuthorMail = "cowboy\@debian.org"; +#$main::Version = '$Revision: 2.00 $ '; +$main::program_name = $0; +$main::program_version = '@sm_version@'; +$main::program_date = '@sm_date@ @sm_time@ cowboy'; +$main::debug = 0; + +my $interp_pgm = "$^X"; +my $interp_vrm = $]; +$interp_vrm = ("$^V" | '000') if (defined $^V); +my $current_time = scalar localtime; +my $user = getlogin || (getpwuid($<))[0] || "Unknown!!"; +my $hostname = hostname(); +my $directory = getcwd(); + +my $SASL_def = "@sysconfdir@/mail/sasl/sasl.m4"; + +# Hash of define names to filename +my %Def_Map; + +# +#------------------------------------------------------------------------------ +# Finally, some code (almost) +#------------------------------------------------------------------------------ +# +# Argument handling... +$main::opt_help=''; +$main::opt_output_file=''; +$main::opt_input_file=''; +$main::opt_debug=''; +my @options = qw( + help|h + output-file|output_file|o:s + input-file|input_file|i:s + debug! + ); +my $result = GetOptions(@options); +if ( ! $result ) { + die "Terminating due to parameter error"; + }; +if ( $main::opt_help ) { + warn "$main::program_name $main::program_version $main::program_date\n"; + warn "$0 \n"; + warn " -help\n" if $main::opt_help; + warn " -debug\n" if $main::opt_debug; + warn " -o $main::opt_output_file\n" if $main::opt_output_file; + warn " -i $main::opt_input_file\n" if $main::opt_input_file; + exit 0; + }; + +my $SASL = $main::opt_output_file || $SASL_def; +${Parse_mc::database_file} = $main::opt_input_file + if $main::opt_input_file; +# $main::debug is used in Parse_mc ! +$main::debug = $main::opt_debug || $main::debug; + +# Let them know wtf is going on... +print STDOUT "Creating ${SASL}...\n"; + +# Read the mc/m4 files +&Parse_mc::read_dbs($Parse_mc::database_file, ''); + +# Obtain SASL information from database +&get_data; + +# Write out the textual representation +&write_sasl; + + +# +#------------------------------------------------------------------------------ +# Obtain information from database +#------------------------------------------------------------------------------ +sub get_data { + my @names = ( + 'confTO_AUTH' + ,'TRUST_AUTH_MECH' + ,'confAUTH_MECHANISMS' + ,'confAUTH_REALM' + ); + + foreach my $entry (@names) { + my ($class, $flags, $files, $options) = + &Parse_mc::entry_dbs($entry); + my $file = join(' ',@{$files}); + $Def_Map{$entry} = ''; + $Def_Map{$entry} = $file if ($file ne '-'); + #$Def_Map{$entry} = &Parse_mc::format_dbs($entry); + }; + }; + + +# +#------------------------------------------------------------------------------ +# Create @sysconfdir@/mail/sasl/sasl.m4 +#------------------------------------------------------------------------------ +sub write_sasl { + my $ofh = new FileHandle; + + $SASL = '&STDOUT' if ($SASL eq '-'); + unless ( open($ofh, ">$SASL") ) { + warn("Could not open $SASL($!), using STDOUT.\n"); + open($ofh, ">&STDOUT"); + }; + $SASL = '-' if ($SASL eq '&STDOUT'); + + &write_m4($ofh); + + close $ofh; + if ($SASL eq $SASL_def) { + chown '0', '0', $SASL; + chmod 0744, $SASL; + }; + }; + + +# +#------------------------------------------------------------------------------ +# Write SASL m4 file +#------------------------------------------------------------------------------ +sub write_m4 { + my ($ofh) = @_; + + print $ofh <<"EOT"; +divert(-1)dnl +#################################################################### +##### This file is automagically generated -- edit at your own risk +##### +##### Copyright (c) 2002-@SM_CPYRT@ Richard Nelson. All Rights Reserved. +##### +##### file: ${SASL} +##### AUTH Configuration for Debian Sendmail +##### generated via: (${interp_pgm} ${interp_vrm}) +##### ${main::program_name} +##### version: ${main::program_version} ${main::program_date} +##### by: ${user}\@${hostname} +##### on: ${current_time} +##### in: ${directory} +##### input files: ${Parse_mc::database_file} +##### +##### Usage: +##### 1) To get *ANY* AUTH support for sendmail you +##### A) *MUST* Add this line to @sysconfdir@/mail/sendmail.mc +##### \`include(\`@sysconfdir@/mail/sasl/sasl.m4\')dnl\' +##### B) *MAY* Add the same line to @sysconfdir@/mail/submit.mc +##### to get MSP<->MTA authentication/encryption +##### 2) You may modify the marked portions of this file. +##### If you need finer control of AUTH options, use the access +##### database. +##### +#################################################################### +divert(0)dnl +VERSIONID(\`\$Id: sasl.m4,v @sm_version@@sm_revision@ @sm_date@ @sm_time@ cowboy Exp \$\') +dnl # +dnl #--------------------------------------------------------------------- +dnl # Bring in Autoconf results +dnl #--------------------------------------------------------------------- +ifdef(\`sm_version\', \`dnl\', +\`include(\`@datadir@/sendmail/cf/debian/autoconf.m4\')dnl\') +dnl # +dnl #--------------------------------------------------------------------- +dnl # SMTP AUTH (SASL) support (sendmail 8.10.0 +) +dnl # PLAIN/LOGIN needed to support SASL auth via PAM ;( +dnl # if this bothers you, you allow them only in conjunction w/STARTTLS ! +dnl #--------------------------------------------------------------------- +ifelse(eval(sm_version_math >= 526848), \`1\', \`dnl +ifelse(sm_enable_auth, \`yes\', \`dnl +dnl # +dnl # ...Do not touch anything above this line... +dnl # +dnl # Set a more reasonable timeout on negotiation +dnl # +define(\`confTO_AUTH\', \`$Def_Map{'confTO_AUTH'}\')dnl # <= EDIT +dnl # +dnl # Define the REALM passed to sasl (8.13.0+) +ifelse(eval(sm_version_math >= 527616), \`1\', \`dnl +define(`confAUTH_REALM', \`$Def_Map{'confAUTH_REALM'}\')dnl # <= EDIT +\')dnl +dnl # +dnl # Available Authentication methods +dnl # +define(\`confAUTH_MECHANISMS\',dnl +\`$Def_Map{'confAUTH_MECHANISMS'}\')dnl # <= EDIT +dnl # +dnl # These, we will trust for relaying +dnl # +TRUST_AUTH_MECH(\`$Def_Map{'TRUST_AUTH_MECH'}\')dnl # <= EDIT +dnl # +dnl # ...Do not touch anything below this line... +dnl # +dnl # +dnl # for 8.12.0+, add EXTERNAL as an available & trusted mech (w/STARTTLS) +dnl # and allow sharing of /etc/sasldb(2) file, allow group read/write +dnl # +ifelse(eval(sm_version_math >= 527360), \`1\', \`dnl +define(\`confAUTH_MECHANISMS\',dnl +\`EXTERNAL \'defn(\`confAUTH_MECHANISMS\'))dnl +TRUST_AUTH_MECH(\`EXTERNAL\') +dnl # +dnl # To support some SASL use, we need the DB to be group readable +dnl # +define(\`confDONT_BLAME_SENDMAIL\',dnl +defn(\`confDONT_BLAME_SENDMAIL\')\`,GroupReadableSASLDBFile,GroupWritableSASLDBFile\')dnl +\')dnl +dnl # +dnl # To support SMTP AUTH in \`sendmail -bs\' : +dnl # Sigh: SASLV1 MSP AUTH does not work in -bs mode (/etc/sasldb !o+r) +dnl # so, we have the MSP not use Auth (or ETRN) +dnl # SASLV2 (w/saslauth) chose to prohibit user authentication - it can +dnl # be made to work by: +dnl # 1) changing /etc/sasldb2 {root,sasl,smmta}:smmsp 0660 +dnl # 2) dpkg-statoverride --remove /var/run/saslauthd +dnl # 3) dpkg-statoverride --add root sasl 711 /var/run/saslauthd +dnl # +ifelse(eval(sm_auth_lib < 2), \`1\', \`dnl +ifdef(\`DEBIAN_MSP\', \`dnl +ifelse(defn(\`_DPO_\'), \`\', \`dnl +DAEMON_OPTIONS(\`Name=NoMTA, Addr=0.0.0.0, M=EA\')dnl +\')\')\')dnl +dnl # +\')\')dnl +EOT + }; + diff --git a/debian/local/update_conf.in b/debian/local/update_conf.in index 330a97a..dcb6ca3 100644 --- a/debian/local/update_conf.in +++ b/debian/local/update_conf.in @@ -21,35 +21,31 @@ use FileHandle; # I/O # Local libraries - for Debian Sendmail Perl helper functions # BEGIN { $main::my_path = substr($0,$[,rindex($0,'/')) }; use lib ('.', substr($0,$[,rindex($0,'/')), "@datadir@/sendmail"); +require Parse_conf; require Parse_mc; $main::program_name = $0; #'update_conf'; $main::program_version = '@sm_version@'; $main::program_date = '@sm_date@ @sm_time@ cowboy'; +$main::debug = 0; + my $interp_pgm = "$^X"; my $interp_vrm = $]; $interp_vrm = ("$^V" | '000') if (defined $^V); my $current_time = scalar localtime; my $user = getlogin || (getpwuid($<))[0] || "Unknown!!"; my $hostname = hostname(); -my $directory = cwd(); +my $directory = getcwd(); -my $conffile = "@sysconfdir@/mail/sendmail.conf"; +my $Conffile = "@sysconfdir@/mail/sendmail.conf"; my $output_file = ''; my $ofh = new FileHandle; my $debug = 0; -my $result; # #------------------------------------------------------------------------------ # Global variables #------------------------------------------------------------------------------ -my %parm_def; -my %parameter; -my %parm_kw; -my %parm_bool; -my %parm_deprecated; -my %parm_hidden; # #------------------------------------------------------------------------------ @@ -62,52 +58,57 @@ $main::opt_help=''; $main::opt_output_file=''; $main::opt_input_file=''; $main::opt_debug=''; +$main::opt_test=''; my @options = qw( help|h output-file|output_file|o:s input-file|input_file|i:s debug! + test! ); -$result = GetOptions(@options); +my $result = GetOptions(@options); if ( ! $result ) { die "Terminating due to parameter error"; }; if ( $main::opt_help ) { warn "$main::program_name $main::program_version $main::program_date\n"; warn "$0 \n"; - warn " -help\n" if $main::opt_help; - warn " -debug\n" if $main::opt_debug; - warn " -o $main::opt_output_file\n" if $main::opt_output_file; - warn " -i $main::opt_input_file\n" if $main::opt_input_file; + warn " -help\n" if $main::opt_help; + warn " -debug\n" if $main::opt_debug; + warn " -o $main::opt_output_file\n" if $main::opt_output_file; + warn " -i $main::opt_input_file\n" if $main::opt_input_file; + exit 0; + }; + +if ( $main::opt_test ) { + &sm2cron_time(""); + &sm2cron_time("6s"); + &sm2cron_time("5m"); + &sm2cron_time("4h"); + &sm2cron_time("3d"); + &sm2cron_time("2w"); + &sm2cron_time("5w"); + &sm2cron_time("2w3d4h5m6s"); + &sm2cron_time("89s"); + &sm2cron_time("90m"); exit 0; }; $output_file = $main::opt_output_file if ($main::opt_output_file); -my $input_file = $main::opt_input_file || $conffile; +my $input_file = $main::opt_input_file || $Conffile; # $main::debug is used in Parse_mc ! -$main::debug = $main::opt_debug || ''; -$debug = $main::debug; - -# Obtain default values -&set_defaults; - -# Update defaults according to current environment -&update_defaults; +$main::debug = $main::opt_debug || $main::debug; # Read /etc/mail/sendmail.conf (if extant) -&read_config; - -# Make sure things are kosher -my $ok = &validate_config; -if (! $ok) { - die "Terminating due to configuration error."; - }; +&Parse_conf::read_config($Conffile); # [Re]write /etc/mail/sendmail.config -&write_config; -if ( $output_file eq '' ) { - chown '0', '0', $conffile; - chmod 0644, $conffile; +&Parse_conf::write_config($Conffile); + +my ($ok, $value) = &Parse_conf::get_value('HANDS_OFF'); +if ($value ne '0') { + unlink "@sysconfdir@/cron.d/sendmail"; + exit; }; # Reflect settings in /etc/cron.d/sendmail @@ -127,267 +128,6 @@ exit (0); # #------------------------------------------------------------------------ -# Set global values -#------------------------------------------------------------------------ -sub set_defaults { - - %parm_def = ( - 'DAEMON_MODE' => 'Daemon' - ,'DAEMON_PARMS' => '' - ,'DAEMON_HOSTSTATS' => 'No' - ,'DAEMON_MAILSTATS' => 'No' - ,'QUEUE_MODE' => '${DAEMON_MODE}' - ,'QUEUE_INTERVAL' => '10' - ,'QUEUE_PARMS' => '' - ,'MSP_MODE' => 'Cron' - ,'MSP_INTERVAL' => '${QUEUE_INTERVAL}' - ,'MSP_PARMS' => '${QUEUE_PARMS}' - ,'MSP_MAILSTATS' => '${DAEMON_MAILSTATS}' - ,'MISC_PARMS' => '' - ,'CRON_MAILTO' => 'root' - ,'CRON_PARMS' => '' - ,'AGE_DATA' => '' - ); - - %parameter = %parm_def; - - %parm_kw = ( - 'DAEMON_MODE' => ['daemon', 'inetd'] - ,'QUEUE_MODE' => ['daemon', 'cron'] - ,'MSP_MODE' => ['daemon', 'cron', 'none'] - ); - - %parm_bool = ( - 'DAEMON_HOSTSTATS' => 1 - ,'DAEMON_MAILSTATS' => 1 - ,'MSP_MAILSTATS' => 1 - ); - - %parm_deprecated = ( - 'DAEMON_STATS' => 'DAEMON_MAILSTATS' - ,'MSP_STATS' => 'MSP_MAILSTATS' - ); - - %parm_hidden = ( - 'prefix' => 1 - ,'exec_prefix' => 1 - ,'bindir' => 1 - ,'sbindir' => 1 - ,'libexecdir' => 1 - ,'datadir' => 1 - ,'sysconfdir' => 1 - ,'sharedstatedir' => 1 - ,'localstatedir' => 1 - ,'libdir' => 1 - ,'MTA_DAEMON' => 1 - ,'MTA_COMMAND' => 1 - ,'MTA_L' => 1 - ,'MTA_L_QUEUE' => 1 - ,'MTA_ROOT' => 1 - ,'MTA_PIDFILE' => 1 - ,'MSP_DAEMON' => 1 - ,'MSP_COMMAND' => 1 - ,'MSP_L' => 1 - ,'MSP_L_QUEUE' => 1 - ,'MSP_ROOT' => 1 - ,'MSP_PIDFILE' => 1 - ); - - }; - -# -#------------------------------------------------------------------------ -# Update default settings according to current environment -#------------------------------------------------------------------------ -sub update_defaults { - my ($class, $flags, $files, $options); - my ($ok, $stats); - my $file; - - # Obtain entry for HOST_STATUS_DIRECTORY - ($class, $flags, $files, $options) = - &Parse_mc::entry_dbs('confHOST_STATUS_DIRECTORY'); - $file = @{$files}[0]; - if ( $file ne '-' and -d $file ) { - $parameter{'DAEMON_HOSTSTATS'} = 'Yes'; - } - else { - $parameter{'DAEMON_HOSTSTATS'} = 'No'; - }; - - # Obtain entry for STATUS_FILE - ($class, $flags, $files, $options) = - &Parse_mc::entry_dbs('STATUS_FILE'); - $file = @{$files}[0]; - if ( $file ne '-' and -e $file ) { - $parameter{'DAEMON_MAILSTATS'} = 'Yes'; - } - else { - $parameter{'DAEMON_MAILSTATS'} = 'No'; - }; - - # Obtain entry for MSP_STATUS_FILE - ($class, $flags, $files, $options) = - &Parse_mc::entry_dbs('MSP_STATUS_FILE'); - $file = @{$files}[0]; - if ( $file ne '-' and -e $file ) { - $parameter{'MSP_MAILSTATS'} = 'Yes'; - } - else { - $parameter{'MSP_MAILSTATS'} = 'No'; - }; - - }; - -# -#------------------------------------------------------------------------ -# Obtain parameter name -#------------------------------------------------------------------------ -sub get_name { - my ($name, $quiet) = @_; - - # Handle deprecated/renamed variables - if ( exists($parm_deprecated{$name}) ) { - print STDERR "$name is deprecated." - if ($debug and ! $quiet); - if ( $parm_deprecated{$name} ) { - print STDERR " Please use $parm_deprecated{$name} instead.\n" - if ($debug and ! $quiet); - $name = $parm_deprecated{$name}; - } - else { - print STDERR " It will be ignored.\n" - if ($debug and ! $quiet); - }; - }; - - return $name; - }; -# -#------------------------------------------------------------------------ -# Obtain value directly, or indirectly -#------------------------------------------------------------------------ -sub get_value { - my ($name) = get_name(@_, ''); - my $value = $parameter{$name}; - - my $tval = $value; - $tval =~ s/^\s*//; - my $ok = 1; - my $default = 0; - - # Dereference loop... keep original value if we get any errors... - Dereference:; - if ($tval =~ /^\$/) { - my @ref_stack = ($name); - my %ref_hash = ($name => 1); - while ($tval =~ /^\$/ and $ok) { - my $start = 1; - my $del = 1; - my $char = substr($tval, 1, 1); - if ( $char eq '{' or $char eq '(' ) { - $start += 1; $del += 2; - }; - my $ref = get_name(substr($tval, $start, - length($tval)-$del), ''); - push @ref_stack, $ref; - if (exists($ref_hash{$ref})) { - print STDERR "Go directly to jail; do not pass go, ", - "do not collect \$200\n"; - print STDERR " Reference loop: ", - join('->', @ref_stack, '...'),"\n"; - $ok = 0; - } - else { - $ref_hash{$ref} = 1; - if (lc $ref eq 'default') { - $tval = $parm_def{$name}; - print STDERR - "Setting $name to default value: ", - "$parm_def{$name}.\n" - if ($debug); - } - elsif (exists($parameter{$ref})) { - $tval = $parameter{$ref}; - print STDERR - "Setting $name to value of $ref: $tval.\n" - if ($debug); - } - else { - print STDERR - "Can't deference $ref, doesn't exist.\n"; - $ok = 0; - }; - }; - }; - }; - - if ( $ok ) { - # Check keyword parms for valid values - if (exists $parm_kw{$name}) { - my @ltval = split(/\s/,$tval); - my $ltval = lc @ltval[$[]; - my $found = ""; - foreach my $value (@{$parm_kw{$name}}) { - if ($value eq $ltval) { - $found = 1; $tval = $ltval; }; - }; - if ( ! $found ) { - $default += 1; - if ( $default > 1 ) { - print STDERR - "Can't resolve $name, value=$value.\n"; - $ok = 0; - } - else { - print STDERR "Illegal value($tval) for $name.\n", - " Valid values are: ", - join(', ', @{$parm_kw{$name}}), - "\n", - " Set to default: $parm_def{$name}.\n"; - $tval = $parm_def{$name}; - goto Dereference; - }; - }; - } - - # Check boolean parms for valid values - elsif (exists $parm_bool{$name}) { - my @ltval = split(/\s/,$tval); - my $ltval = lc @ltval[$[]; - $ltval =~ s/^[ty1].*/1/; - $ltval =~ s/^[fn0].*/0/; - if ($ltval eq '0' or $ltval eq '1') { - $tval = $ltval; } - else { - $default += 1; - if ( $default > 1 ) { - print STDERR - "Can't resolve $name, value=$value.\n"; - $ok = 0; - } - else { - print STDERR "Illegal value($tval) for $name.\n", - " Valid values are: T[rue],Y[es],1,", - " F[alse],N[o],0\n", - " Set to default: $parm_def{$name}.\n"; - $tval = $parm_def{$name}; - goto Dereference; - }; - }; - }; - }; - - $value = $tval if $ok; - - print STDERR "get_value : $name => $value\n" - if ($debug); - - return ($ok, $value); - }; - -# -#------------------------------------------------------------------------ # Check for nullclient mode in /etc/mail/sendmail.mc #------------------------------------------------------------------------ sub check_nullclient { @@ -416,453 +156,108 @@ sub check_nullclient { # #------------------------------------------------------------------------ -# Read input configuration file (if no input, just use defaults) +# Compute time setting for Crontab entry (simplistic) #------------------------------------------------------------------------ -sub read_config { - @ARGV = split(' ', $input_file); - return if (! -r $input_file); - - my $savename = ''; - my $parmname = ''; - my $parmval = ''; - my $parmref = ''; - my $defname = ''; - my $defval = ''; - my $tmpval = ''; - - print STDOUT "Reading configuration from ", join(',',@ARGV), ".\n"; - - line: while (<ARGV>) { - next line if /^$/; # skip empty lines - chomp; # drop tailing \n - if (s/\\$//) { - $_ .= <>; - redo unless eof(); - }; - - # check commented lines for default parameter values - # a bit of a kluge, but it works out nicely - if (/^#\s*([\w_]+)="([^"]*)"/) { - $defname = get_name($1, 1); - $defval = $2; - print STDERR "Default: $defname => $defval.\n" - if ($debug); - next line; +sub sm2cron_time { + my $month = 0; + my $week = 0; + my $day = 0; + my $hour = 0; + my $minute = 0; + my $second = 0; + my $tmp = 0; + my $t = ''; + my $cron = ''; + + my ($sm) = @_; + my $seconds = 0; + if ($sm eq '') { + if ( $main::opt_test ) { + print "$cron = sm2cron_time($sm);\n"; }; - # Skip any comments - next line if /^#/; # skip comments - - # Process assignment statements - if (/^\s*([\w_]+)="([^"]*)"/) { - $savename = $1; - $parmname = get_name($savename, ''); - $parmval = $2; - print STDERR "Value : $savename => $parmval.\n" - if ($debug); - - # Do we know about this parameter? - # NOTE: keep, even if we don't know about it to prevent - # problems with up/down grades (not loose anything) - if ( ! exists($parm_def{$parmname}) and - ! exists($parm_hidden{$parmname}) ) { - print STDERR "$parmname is a user defined parameter.\n" - if ($debug); - }; - - # Note if value is default, if so, we'll change it to - # the current default - maybe counterintuitive, oh well - # it does help with migration - if ($parmname eq $defname and $parmval eq $defval) { - print STDERR "$parmname is the default value: $defval.\n" - if ($debug); - $parmval = $parm_def{$parmname}; - }; - - # Finally, assign value - if ($savename eq $parmname) { - $parameter{$parmname} = $parmval; - } - else { - $parameter{$savename} = $parmval; - }; - }; - }; - }; - -# -#------------------------------------------------------------------------ -# Validate current configuration -#------------------------------------------------------------------------ -sub validate_config { - - my $valid = 1; - - print STDOUT "Validating configuration.\n"; - - # Really, we only care about the some of the variables - those - # that have defaults... the rest, well, so what ! - foreach my $val (sort keys %parm_def) { - my ($ok, $value) = &get_value($val, 1); - if (! $ok) { $valid = 0; }; - }; - - if (! $valid ) { - print STDERR "\nOne or more errors were encountered!\n\n"; + return ($cron, $seconds); }; - return ($valid); - }; - -# -#------------------------------------------------------------------------ -# Write updated configuration file -#------------------------------------------------------------------------ -sub write_config { - my $out_file = $output_file || $conffile; - print STDOUT "Writing configuration to $out_file.\n"; - $out_file = '&STDOUT' if ($out_file eq '-'); - unless ( open($ofh, ">$out_file") ) { - warn("Could not open $out_file($!), using STDOUT\n"); - open($ofh, ">&STDOUT"); + # Convert sendmail time + # 1w2d3h4m5s + # to cron time + # m h dom mon dow + $t = $sm; + ($week = $sm) =~ s/.*?(\d+)w.*/$1/ if ( $t =~ /w/ ); + ($day = $sm) =~ s/.*?(\d+)d.*/$1/ if ( $t =~ /d/ ); + ($hour = $sm) =~ s/.*?(\d+)h.*/$1/ if ( $t =~ /h/ ); + ($minute = $sm) =~ s/.*?(\d+)m.*/$1/ if ( $t =~ /m/ ); + ($second = $sm) =~ s/.*?(\d+)s.*/$1/ if ( $t =~ /s/ ); + # Convert weeks to days (roughly) + $day = $day + (7 * $week); + + # Cron doesn't do seconds, round to minutes or ignore + $seconds = $seconds + $second; + $tmp = $second; + $second = sprintf("%02d", $second%60); + $minute = $minute + sprintf("%02d", ($tmp-$second)/60); + $minute = $minute + 1 if ($second >= 30); + + # Minute of hour (0-59) + $seconds = $seconds + ($minute * 60); + $tmp = $minute; + $minute = sprintf("%02d", $minute%60); + $hour = $hour + sprintf("%02d", ($tmp-$minute)/60); + if (0 < $hour + $day + $week + $month) { + $hour = $hour + 1 if ($minute >= 30); + $cron = "00 "; + } + else { + $minute = '01' if ($minute == 0); + $cron = "*/$minute"; }; - $out_file = '-' if ($out_file eq '&STDOUT'); -# print $ofh <<"EOT"; -#################################################################### -##### This file is automagically generated -- edit at your own risk -##### -##### file: ${out_file} -##### generated via: (${interp_pgm} ${interp_vrm}) -##### ${main::program_name} -##### version: ${main::program_version} ${main::program_date} -##### by: ${user}\@${hostname} -##### on: ${current_time} -##### in: ${directory} -##### input files: -#EOT -# foreach my $file ( split(' ', $input_file) ) { -# print $ofh <<"EOT"; -##### ${file} -#EOT -# }; -# print $ofh <<"EOT"; -##### -#################################################################### - print $ofh <<"EOT"; -#------------------------------------------------------------------------------ -# -# $out_file -# -# Copyright (c) 2001-@SM_CPYRT@ Richard Nelson. All Rights Reserved. -# Version: ${main::program_version} -# Time-stamp: <${main::program_date}> -# -# Parameter file for sendmail (sourced by /usr/share/sendmail/sendmail) -# Make all changes herein, instead of altering /etc/init.d/sendmail. -# -# After making changes here, you'll need to run /usr/sbin/sendmailconfig -# or ${main::program_name} to have the changes take effect - -# If you change DAEMON_MODE, QUEUE_MODE, or QUEUE_INTERVAL, you'll also -# need to run /etc/init.d/sendmail restart. -# -# Changes made herein will be kept across upgrades - except for comments! -# Some comment lines have special significance ... -# -# **** **** **** **** DO NOT EDIT THE COMMENTS **** **** **** **** -# -# Supported parameters (and defaults) are listed herein. -# -# Notes: -# * This setup allows sendmail to run in several modes: -# - listener and queue runner..DAEMON_MODE="daemon".QUEUE_MODE="daemon" -# - listener only..............DAEMON_MODE="daemon".QUEUE_MODE="none" -# - queue runner only..........DAEMON_MODE="none"...QUEUE_MODE="daemon" -# - *NOTHING* ?!?..............DAEMON_MODE="none"...QUEUE_MODE="none" -# -# * You can also run the listener from inetd: -# - listener and queue runner..DAEMON_MODE="inetd"..QUEUE_MODE="daemon" -# - listener only..............DAEMON_MODE="inetd"..QUEUE_MODE="none" -# -# * You can also run the queue runner from cron: -# - listener and queue runner..DAEMON_MODE="....."..QUEUE_MODE="cron" -# - queue runner only..........DAEMON_MODE="none"...QUEUE_MODE="cron" -# -# * _PARMS entries herein are shown in precedence order, any later _PARMS -# field will, if applicable, override any previous _PARMS fields. -# -# * Values *MUST* be surrounded with double quotes ("), single quotes -# will *NOT* work ! -# -#------------------------------------------------------------------------------ -# SMTP Listener Configuration -# -# DAEMON_MODE="$parm_def{'DAEMON_MODE'}"; Keyword SMTP listener -# daemon: Run as standalone daemon -# inetd: Run from inet supervisor (forks for each mail) -# none: No listener (ie, nullclient/smarthost) -# -# NOTE: for the nonce, DAEMON_MODE="none" is *NOT* supported !!! -# -DAEMON_MODE="$parameter{'DAEMON_MODE'}"; -# -# DAEMON_PARMS="$parm_def{'DAEMON_PARMS'}"; String Listener parms -# Any parameters here will be ignored when run from cron. -# Note that MISC_PARMS and CRON_PARMS, if applicable, will override -# anything declared herein. -# -DAEMON_PARMS="$parameter{'DAEMON_PARMS'}"; -# -# DAEMON_HOSTSTATS="$parm_def{'DAEMON_HOSTSTATS'}"; Boolean Listener stats -# This parameter determines whether or not host stats are collected -# and available for the \`hoststat\` command to display. There will -# be a (minor) performance hit, as files will be created/updated for each -# sendmail delivery attempt. The files are fixed in size, and small, -# but there can be many of them. -# -DAEMON_HOSTSTATS="$parameter{'DAEMON_HOSTSTATS'}"; -# -# DAEMON_MAILSTATS="$parm_def{'DAEMON_MAILSTATS'}"; Boolean Listener stats -# This parameter determines whether or not mailer stats are collected -# and available for the \`mailstats\` command to display. There will -# be a (minor) performance hit, as this file will be updated for each -# item coming into, or out of, sendmail. The file is fixed in size, -# and small, so there's no need to rotate it. -# -DAEMON_MAILSTATS="$parameter{'DAEMON_MAILSTATS'}"; -# -#------------------------------------------------------------------------------ -# SMTP MTA Queue Runner Configuration -# -# QUEUE_MODE="$parm_def{'QUEUE_MODE'}"; Keyword SMTP queue runner -# daemon: Run as standalone daemon -# cron: Run from crontab -# none: No queue runner (ie, nullclient/smarthost) -# -# NOTE: for the nonce, QUEUE_MODE="none" is *NOT* supported !!! -# -QUEUE_MODE="$parameter{'QUEUE_MODE'}"; -# -# QUEUE_INTERVAL="$parm_def{'QUEUE_INTERVAL'}"; Integer in minutes -# Interval at which to run the MTA queues. What interval should you use? -# The amount of time that is acceptable before retrying delivery on -# mail that couldn't be delivered in one run, or how long an item can -# set in the queue before having the first delivery attempt done. -# -QUEUE_INTERVAL="$parameter{'QUEUE_INTERVAL'}"; -# -# QUEUE_PARMS="$parm_def{'QUEUE_PARMS'}"; String queue parameters -# Any parameters here are also used when run from cron. -# Note that MISC_PARMS and CRON_PARMS, if applicable, will override -# anything declared herein. -# -QUEUE_PARMS="$parameter{'QUEUE_PARMS'}"; -# -#------------------------------------------------------------------------------ -# SMTP - MSP Queue Runner Configuration -# -# MSP_MODE="$parm_def{'MSP_MODE'}"; Keyword MSP queue runner mode -# daemon: Run as standalone daemon -# cron: Run from crontab -# none: No queue runner (ie, nullclient/smarthost) -# -# NOTE: If QUEUE_MODE="cron" & MSP_MODE="none", the MSP queue will -# be run as part of the MTA queue running process. -# -MSP_MODE="$parameter{'MSP_MODE'}"; -# -# MSP_INTERVAL="$parm_def{'MSP_INTERVAL'}"; Integer in minutes -# Interval at which to run the MSP queues. What interval should you use? -# The amount of time that is acceptable before retrying delivery on -# mail that couldn't be accepted by the MTA, and was therefore left -# in the message submission queue. Probably should be the same as the -# whats used in QUEUE_INTERVAL. -# -MSP_INTERVAL="$parameter{'MSP_INTERVAL'}"; -# -# MSP_PARMS="$parm_def{'MSP_PARMS'}"; String queue parameters -# Any parameters here are also used when run from cron. -# Note that MISC_PARMS and CRON_PARMS, if applicable, will override -# anything declared herein. -# -MSP_PARMS="$parameter{'MSP_PARMS'}"; -# -# MSP_MAILSTATS="$parm_def{'MSP_MAILSTATS'}"; Boolean Listener stats -# This parameter determines whether or not mailer stats are collected -# and available for the \`mailstats\` command to display. There will -# be a (minor) performance hit, as this file will be updated for each -# item coming into, or out of, sendmail. The file is fixed in size, -# and small, so there's no need to rotate it. -# -MSP_MAILSTATS="$parameter{'MSP_MAILSTATS'}"; -# -#------------------------------------------------------------------------------ -# Miscellaneous Confguration -# -# MISC_PARMS="$parm_def{'MISC_PARMS'}"; String miscellaneous parameters -# Miscellaneous parameters - applied to any sendmail invocation. -# Any parameters here are also used when run from cron. -# Applied after {DAEMON,QUEUE}_PARMS, and can therefore override them -# if need be (in which case why did use them?) -# Note that CRON_PARMS, if applicable, will override anything -# declared herein. -# -# Here is where'd you setup and debugging or special parms that you -# want shared betwixt the possibly separate listener/queue-runner -# processes. -# -MISC_PARMS="$parameter{'MISC_PARMS'}"; -# -#------------------------------------------------------------------------------ -# Cron Job Configuration -# -# CRON_MAILTO="$parm_def{'CRON_MAILTO'}"; String cronjob output -# Recipient of *rare* cronjob output. Some cronjobs will be running -# under user `mail`, so any problems encountered would probably be missed -# so define a user who actually (hopefully) checks email now and again. -# -CRON_MAILTO="$parameter{'CRON_MAILTO'}"; -# -# CRON_PARMS="$parm_def{'CRON_PARMS'}"; String cron specific parmeters -# Cron parameters - applied *only* when sendmail queue running is done -# via a cronjob. Applied after QUEUE_PARMS and MISC_PARMS, and can -# therefore override them if need be. -# -CRON_PARMS="$parameter{'CRON_PARMS'}"; -# -#------------------------------------------------------------------------------ -# Queue Aging Configuration -# -# Why would you want to age your queues? On every queue-run interval, -# sendmail will try *every* file in the queue... If a site is down -# for a while, considerable time can be wasted each interval in retrying -# it. The scheme supported allows aging by time, and can move the older -# files to another (less frequently run queue), thereby reducing overal -# system impact - and providing better mail throughput. -# -# Note that this support is completely separate from QUEUE_MODE=cron, -# you can age queues even if you're running QUEUE_MODE=daemon. -# -# There are four parts to the queue aging support, and these parts -# may be repeated, to operate on multiple queues. -# -# 1. Interval at which to age the queues (in minutes). -# What interval should you use? Roughly twice the normal queue -# interval, so that messages are tried twice in each successively -# slower queue. -# -# 2. Criteria (optional and defaults to interval). This is the -# specification of which files to move. It defaults moving -# files whose age in the queues exceeds the interval. -# This field, if specified can be very complex - supporting -# aging by just about anything! see qtool(8) for details. -# -# 3. To queue. This is the queue to which files will be moved. -# It may be fully qualified, or relative to /var/spool/mqueue. -# -# 4. From queue. This is the queue from which files will be moved. -# It may be fully qualified, or relative to /var/spool/mqueue. -# -# Samples: -# AGE_DATA="[['25', '', 'hourly', 'main']]"; -# Every 25 minutes, move any file older than 25 minutes from -# /var/spool/mqueue/main to /var/spool/mqueue/hourly -# -# AGE_DATA="[['25', '', 'hourly', 'main'],\\ -# ['125', '', 'daily', 'hourly']]"; -# Same as the above, but also move files from the hourly queue -# to the daily queue after 125 minutes in the hourly queue. -# -# AGE_DATA="[['25',\\ -# '-e \\'\$msg{message}[0] == /Deferred: 452 4.2.2 Over quota/\\'',\\ -# 'overquota', 'main']]"; -# Every 25 minutes, move all files deferred because of quota -# violations from /var/spool/mqueue/main to -# /var/spool/mqueue/overquota where they can be processed on -# a different interval, or by some other means. -# -# If the above samples suggest Perl arrays, well, they are... -# -# AGE_DATA="$parm_def{'AGE_DATA'}"; Perl array Queue aging data -# -EOT - my ($ok, $var) = &get_value('AGE_DATA'); - my $tmpval = eval $var; - if ($@) { - warn $@; + # Hour of day (0-23) + $seconds = $seconds + ($hour * 60 * 60); + $tmp = $hour; + $hour = sprintf("%02d", $hour%24); + $day = $day + sprintf("%02d", ($tmp-$hour)/24); + if (0 < $day + $week + $month) { + $day = $hour + 1 if ($minute >= 30); + $cron = "$cron 00 "; + } + elsif ($hour != 0) { + $cron = "$cron */$hour"; } else { - $var = $tmpval; + $cron = "$cron * "; }; - if (not defined $var) { - print $ofh 'AGE_DATA="";',"\n"; - } - elsif (not ref $var) { - print $ofh 'AGE_DATA="',$var,'";',"\n"; + + # Day of month (1-31) + $tmp = $day; + $day = sprintf("%02d", $day%32); + $month = $month + sprintf("%02d", ($tmp-$day)/32); + if (0 < $month) { + $month = $month + 1 if ($day >= 15); + $cron = "$cron 01 "; } - elsif (@{$var} == 0) { - print $ofh 'AGE_DATA="";',"\n"; + elsif ($day != 0) { + $cron = "$cron */$day"; } else { - print $ofh 'AGE_DATA="[\\',"\n"; - foreach my $entry (@{$var}) { - foreach my $ndx ($[ .. $#{@{$entry}}) { - @{$entry}[$ndx] =~ s/'/\\'/g; - }; - print $ofh "['",join("', '",@{$entry}),"'],\\\n"; - }; - print $ofh ']";',"\n"; - }; - print $ofh <<"EOT"; -# -#------------------------------------------------------------------------------ -# Hidden variables (the blood be upon your hands) -# -EOT - foreach my $key (sort keys %parm_hidden) { - my ($ok, $value); - # Don't evaluate value, just stuff it... - next if ( ! $parameter{$key} ); - ($ok, $value) = (1, $parameter{$key}); - print $ofh "$key=",'"',$value,'";',"\n"; - }; - print $ofh <<"EOT"; -# -#------------------------------------------------------------------------------ -# Deprecated variables (kept for reference) -# -EOT - foreach my $key (sort keys %parm_deprecated) { - my ($ok, $value); - # Don't evaluate value, just stuff it... - if ( $parm_deprecated{$key} ) { - ($ok, $value) = (1, join('','${', $parm_deprecated{$key}, '}')); - } - elsif ( $parameter{$key} ) { - ($ok, $value) = (1, $parameter{$key}); - }; - print $ofh "$key=",'"',$value,'";',"\n"; + $cron = "$cron * "; }; - print $ofh <<"EOT"; -# -#------------------------------------------------------------------------------ -# Unknown variables (kept for reference) -# -EOT - foreach my $key (sort keys %parameter) { - if (! exists($parm_def{$key}) and - ! exists($parm_deprecated{$key})) { - # Don't evaluate value, just stuff it... - my ($ok, $value) = (1, $parameter{$key}); - print $ofh "$key=",'"',$value,'";',"\n"; - }; + + # Month in year (1-12) + $month = sprintf("%02d", $month%12); + if (0 < $month) { + $cron = "$cron */$month"; + } + else { + $cron = "$cron * "; }; - print $ofh <<"EOT"; -#------------------------------------------------------------------------------ -# -EOT + $cron = "$cron *"; # Day of week (0-7) - close($ofh); + if ( $main::opt_test ) { + print "$cron = sm2cron_time($sm);\n"; + }; + return ($cron, $seconds); }; # @@ -872,6 +267,7 @@ EOT sub write_crontab { my $var; my $interval = ''; + my $cronint = ''; my $test = "test -x @datadir@/sendmail/sendmail"; my $command = ''; my $ok = ''; @@ -882,7 +278,7 @@ sub write_crontab { my $mta_line = ''; my $age_line = ''; - ($ok, $mailto) = &get_value('CRON_MAILTO'); + ($ok, $mailto) = &Parse_conf::get_value('CRON_MAILTO'); if ( ! $ok ) { return; }; @@ -955,20 +351,21 @@ MAILTO=$mailto # Every so often, give sendmail a chance to run the MSP queues. # EOT - ($ok, $interval) = &get_value('MSP_INTERVAL'); - $interval = join('', '*/', $interval); + ($ok, $interval) = &Parse_conf::get_value('MSP_INTERVAL'); + ($cronint, $ok) = &sm2cron_time($interval); $command = "$test && @datadir@/sendmail/sendmail cron-msp"; - ($ok, $mmode) = &get_value('MSP_MODE'); - ($ok, $qmode) = &get_value('QUEUE_MODE'); - if ($mmode eq 'cron' - #or ($mmode eq 'none' and $qmode eq 'cron') + ($ok, $mmode) = &Parse_conf::get_value('MSP_MODE'); + ($ok, $qmode) = &Parse_conf::get_value('QUEUE_MODE'); + if ($mmode eq 'Cron' + and ($interval ne '') + #or ($mmode eq 'None' and $qmode eq 'Cron') ) { $msp_line = - "$interval * * * *\t\tsmmsp\t$command"; + "$cronint\t\tsmmsp\t$command"; } else { $msp_line = - "#$interval * * * *\t\tsmmsp\t$command"; + "#$cronint\t\tsmmsp\t$command"; }; print $ofh "$msp_line\n"; @@ -979,16 +376,18 @@ EOT # Will also run MSP queues if enabled # EOT - ($ok, $interval) = &get_value('QUEUE_INTERVAL'); - $interval = join('','*/',$interval); + ($ok, $interval) = &Parse_conf::get_value('QUEUE_INTERVAL'); + ($cronint, $ok) = &sm2cron_time($interval); $command = "$test && @datadir@/sendmail/sendmail cron-mta"; - if ($qmode eq 'cron') { + if ($qmode eq 'Cron' + and ($interval ne '') + ) { $mta_line = - "$interval * * * *\t\troot\t$command"; + "$cronint\t\troot\t$command"; } else { $mta_line = - "#$interval * * * *\t\troot\t$command"; + "#$cronint\t\troot\t$command"; }; print $ofh "$mta_line\n"; @@ -998,7 +397,7 @@ EOT # Every so often, give sendmail a chance to age the queues. # EOT - ($ok, $var) = &get_value('AGE_DATA'); + ($ok, $var) = &Parse_conf::get_value('AGE_DATA'); my $tmpval = eval $var; if ($@) { warn $@; @@ -1014,8 +413,8 @@ EOT } else { foreach my $entry (@{$var}) { - $interval = "*/@$entry[0]"; - my $criteria = @$entry[1] || join('','-s ',60*@$entry[0]); + ($interval, $ok) = &sm2cron_time(@$entry[0]); + my $criteria = @$entry[1] || join('','-s ',$ok); my $to = @$entry[2]; my $from = @$entry[3]; $command = "$test && @datadir@/sendmail/qtool.pl"; @@ -1024,7 +423,7 @@ EOT $to = "@localstatedir@/spool/mqueue/$to" if ($to !~ /^\//); $age_line = - "$interval * * * *\t\troot\t$command $criteria $to $from"; + "$interval\t\troot\t$command $criteria $to $from"; print $ofh "$age_line >/dev/null\n"; }; }; @@ -1046,13 +445,13 @@ sub update_inetd { return; }; - my ($ok, $mode) = &get_value('DAEMON_MODE'); - if ( $ok ) { - if ( $mode eq 'inetd' ) { - system 'update-inetd --group MAIL --enable smtp,smtps,587' + my ($ok, $mode) = &Parse_conf::get_value('DAEMON_MODE'); + if ( $ok and -x '/usr/sbin/update-inetd' ) { + if ( $mode eq 'Inetd' ) { + system 'update-inetd --group MAIL --enable smtp,smtps,submission' } else { - system 'update-inetd --group MAIL --disable smtp,smtps,587' + system 'update-inetd --group MAIL --disable smtp,smtps,submission' }; }; @@ -1081,14 +480,14 @@ sub update_files { ($class, $flags, $files, $options) = &Parse_mc::entry_dbs('confHOST_STATUS_DIRECTORY'); $file = @{$files}[0]; - ($ok, $stats) = &get_value('DAEMON_HOSTSTATS'); + ($ok, $stats) = &Parse_conf::get_value('DAEMON_HOSTSTATS'); if ( $ok and $file ne '-' ) { if ( $stats and ! -d $file) { print STDOUT "Enabling HOST statistics file($file).\n"; system "mkdir ${file}"; my $gid = getgrnam('smmsp'); chown '0', $gid, $file; - chmod 02750, $file; + chmod 02755, $file; } elsif ( ! $stats and -d $file ) { print STDOUT "Disabling HOST statistics file($file).\n"; @@ -1100,7 +499,7 @@ sub update_files { ($class, $flags, $files, $options) = &Parse_mc::entry_dbs('STATUS_FILE'); $file = @{$files}[0]; - ($ok, $stats) = &get_value('DAEMON_MAILSTATS'); + ($ok, $stats) = &Parse_conf::get_value('DAEMON_MAILSTATS'); if ( $ok and $file ne '-' ) { if ( $stats and ! -e $file) { print STDOUT "Enabling MTA statistics file($file).\n"; @@ -1120,7 +519,7 @@ sub update_files { ($class, $flags, $files, $options) = &Parse_mc::entry_dbs('MSP_STATUS_FILE'); $file = @{$files}[0]; - ($ok, $stats) = &get_value('MSP_MAILSTATS'); + ($ok, $stats) = &Parse_conf::get_value('MSP_MAILSTATS'); if ( $ok and $file ne '-') { if ( $stats and ! -e $file ) { print STDOUT "Enabling MSP statistics file($file).\n"; diff --git a/debian/local/update_db.in b/debian/local/update_db.in index 72ee337..d61016f 100644 --- a/debian/local/update_db.in +++ b/debian/local/update_db.in @@ -32,9 +32,21 @@ if [ -x ./update_sendmail ]; then sm_path='.'; elif [ -x $(dirname $0)/update_sendmail ]; then sm_path=$(dirname $0); -else +else sm_path=@datadir@/sendmail; fi; +# Bring in sendmail.conf for the network definitions +if [ ! -f @sysconfdir@/mail/sendmail.conf ]; then + if [ -x $sm_path/update_conf ]; then + $sm_path/update_conf; + fi; + fi; +if [ -f @sysconfdir@/mail/sendmail.conf ]; then + . @sysconfdir@/mail/sendmail.conf; + fi; +if [ "$HANDS_OFF" != 'No' ]; then + exit 0; + fi; # control amount of output verbosity=0; @@ -74,7 +86,7 @@ is_found () { case "$dbfeat" in ALIAS_FILE) - if [ -f @sysconfdir@/mail/aliases -a ! -f /etc/aliases ]; then + if [ -f @sysconfdir@/mail/aliases ] & [ ! -f /etc/aliases ]; then echo "Moving @sysconfdir@/mail/aliases to /etc/aliases"; mv @sysconfdir@/mail/aliases /etc/aliases; ln -sf ../aliases @sysconfdir@/mail/aliases; @@ -262,6 +274,16 @@ is_not_found () { $sm_path/update_conf; fi; ;; + access_db) + missing_cre=`expr $missing_cre + 1`; + echo "Warning: $dbfeat source" \ + "file not found: $dbname"; + echo " it was created"; + cp @datadir@/sendmail/examples/db/access \ + @sysconfdir@/mail/; + chown root:root $dbname; + chmod 0644 $dbname; + ;; *) if move_file /etc/$dbsname; then :; @@ -297,6 +319,12 @@ is_empty () { databases|Makefile) :; ;; + access_db) + cp @datadir@/sendmail/examples/db/access \ + @sysconfdir@/mail/; + chown root:root $dbname; + chmod 0644 $dbname; + ;; *) echo "Informational: $dbfeat file empty: $dbname"; if [ "$dbopts" = "-o" ]; then @@ -314,7 +342,7 @@ is_comments () { if [ $verbosity -gt 1 ]; then echo "is_comments: $dbfeat - $dbname"; fi; - if [ $process -eq 1 -a -s "$dbname" ]; then + if [ $process -eq 1 ] && [ -s "$dbname" ]; then if [ "$dbtype" != "-" ]; then rm -f $dbname.db; rm -f $dbname.pag; @@ -343,12 +371,12 @@ is_normal () { fi; # Make sure sensitive databases are *not* generally readable - if [ "$dbsname" = "authinfo" \ - -o "$dbsname" = "access" ]; then + if [ "$dbsname" = "authinfo" ] \ + || [ "$dbsname" = "access" ]; then chmod go-rwx $dbname; fi; - if [ $process -eq 1 -a $max_rc -eq 0 ]; then + if [ $process -eq 1 ] && [ $max_rc -eq 0 ]; then case "$dbtype" in '-'|text|ldap) :; @@ -372,12 +400,13 @@ is_normal () { dbm | btree | hash) echo "Updating $dbname..."; @sbindir@/makemap $dbtype $dbname.new.db < $dbname; - chown root:smmsp $dbname.new.db; - if [ "$dbsname" = "authinfo" \ - -o "$dbsname" = "access" ]; then + if [ "$dbsname" = "authinfo" ] \ + || [ "$dbsname" = "access" ]; then + chown smmta:smmsp $dbname.new.db; chmod 0640 $dbname.new.db; else - chmod 0644 $dbname.new.db; + chown root:smmsp $dbname.new.db; + chmod 0640 $dbname.new.db; fi; mv -f $dbname.new.db $dbname.db; ;; @@ -385,11 +414,11 @@ is_normal () { echo "Updating $dbname..."; if [ $newaliases_run -eq 0 ]; then newaliases_run=1; - @sbindir@/sendmail -bi || true; + @libexecdir@/newaliases || true; fi; if [ -f $dbname.db ]; then - chown root:smmsp $dbname.db; - chmod 0644 $dbname.db; + chown smmta:smmsp $dbname.db; + chmod 0640 $dbname.db; fi; ;; m4) @@ -399,6 +428,10 @@ is_normal () { m4 @sysconfdir@/mail/${mcfile}.mc \ > @sysconfdir@/mail/${mcfile}.cf.new \ 2> @sysconfdir@/mail/${mcfile}.cf.errors || true; + echo "### @sysconfdir@/mail/${mcfile}.mc ###" \ + >> @sysconfdir@/mail/${mcfile}.cf.new; + sed -e 's/^/# /' @sysconfdir@/mail/${mcfile}.mc \ + >> @sysconfdir@/mail/${mcfile}.cf.new; chown root:smmsp @sysconfdir@/mail/${mcfile}.cf.new; chmod 0644 @sysconfdir@/mail/${mcfile}.cf.new; if [ ! -s @sysconfdir@/mail/${mcfile}.cf.errors ]; then @@ -470,9 +503,9 @@ for file in $db_files; do \ # Check to see if we're doing one, or all if [ ! -z "$1" ]; then - if [ "$1" = "$dbfeat" -o \ - "$1" = "$dbname" -o \ - "$1" = "$dbsname" ]; then + if [ "$1" = "$dbfeat" ] \ + || [ "$1" = "$dbname" ] \ + || [ "$1" = "$dbsname" ]; then :; else continue; @@ -487,6 +520,18 @@ for file in $db_files; do \ fi; continue ;; + dbm | btree | hash) + if [ ! -x @libexecdir@/makemap ]; then + echo "Delaying $dbname..."; + continue; + fi; + ;; + newaliases) + if [ ! -x @libexecdir@/newaliases ]; then + echo "Delaying $dbname..."; + continue; + fi; + ;; *) ;; esac; @@ -502,7 +547,7 @@ for file in $db_files; do \ fi; # Check for database existance - if [ -f "$dbname" -o -d "$dbname" ]; then + if [ -f "$dbname" ] || [ -d "$dbname" ]; then is_found; else is_not_found; @@ -560,7 +605,7 @@ if [ $missing_rqd -ne 0 ]; then max_rc=2; fi; fi; -if [ $missing_opt -ne 0 -o $missing_rqd -ne 0 ]; then +if [ $missing_opt -ne 0 ] || [ $missing_rqd -ne 0 ]; then echo " "; echo "$0 assumes that databases, and their source datasets"; echo "have the same base name (not counting the .db). If this is not"; diff --git a/debian/local/update_ldap.in b/debian/local/update_ldap.in index 5daca95..bd20293 100644 --- a/debian/local/update_ldap.in +++ b/debian/local/update_ldap.in @@ -27,6 +27,27 @@ SCHEMA_PATH=; SCHEMA_NAME=; LDAP_VERSION=; +# Path to other sendmail helpers +if [ -x ./update_sendmail ]; then + sm_path='.'; +elif [ -x $(dirname $0)/update_sendmail ]; then + sm_path=$(dirname $0); +else + sm_path=@datadir@/sendmail; + fi; +# Bring in sendmail.conf for the network definitions +if [ ! -f @sysconfdir@/mail/sendmail.conf ]; then + if [ -x $sm_path/update_conf ]; then + $sm_path/update_conf; + fi; + fi; +if [ -f @sysconfdir@/mail/sendmail.conf ]; then + . @sysconfdir@/mail/sendmail.conf; + fi; +if [ "$HANDS_OFF" != 'No' ]; then + exit 0; + fi; + install_schema () { # # Install sendmail.schema in the appropriate place @@ -86,7 +107,7 @@ else echo "$SCHEMA_PATH/sendmail.schema has been installed"; fi; -if [ $FOUND -eq 0 -a $NEW -eq 1 ]; then +if [ $FOUND -eq 0 ] && [ $NEW -eq 1 ]; then cat <<-EOT No local LDAP server was located (tried openldap v2/v1, umich-ldap). @@ -104,7 +125,7 @@ if [ $FOUND -eq 0 -a $NEW -eq 1 ]; then If you later install a local LDAP server, be sure to re-run $0. EOT -elif [ $FOUND -eq 1 -a $NEW -eq 1 ]; then +elif [ $FOUND -eq 1 ] && [ $NEW -eq 1 ]; then cat <<-EOT You have a local $LDAP_VERSION server! Depending upon how (and if) diff --git a/debian/local/update_mc.in b/debian/local/update_mc.in index b157b6a..51a9cdf 100644 --- a/debian/local/update_mc.in +++ b/debian/local/update_mc.in @@ -8,29 +8,55 @@ # Copyright (c) 2000-@SM_CPYRT@ Richard Nelson. All Rights Reserved. # # Notes (to all): -# * assumes makemap dbtype /etc/mail/database < /etc/mail/database +# * assumes makemap dbtype /etc/mail/database < /etc/mail/database # # Notes (to self): -# * changes made herein *must* be reflected in -# parse_mc,update_mk,update_db,debian.m4 +# * changes made herein *must* be reflected in +# parse_mc,update_mk,update_db,debian.m4 # #----------------------------------------------------------------------------- set -e; changed=0; +# Path to other sendmail helpers +if [ -x ./update_sendmail ]; then + sm_path='.'; +elif [ -x $(dirname $0)/update_sendmail ]; then + sm_path=$(dirname $0); +else + sm_path=@datadir@/sendmail; + fi; +# Bring in sendmail.conf for the network definitions +if [ ! -f @sysconfdir@/mail/sendmail.conf ]; then + if [ -x $sm_path/update_conf ]; then + $sm_path/update_conf; + fi; + fi; +if [ -f @sysconfdir@/mail/sendmail.conf ]; then + . @sysconfdir@/mail/sendmail.conf; + fi; +if [ "$HANDS_OFF" != 'No' ]; then + exit 0; + fi; + +new_mc () { + chown root:smmsp @sysconfdir@/mail/"$1".mc.new; + chmod 0644 @sysconfdir@/mail/"$1".mc.new; + mv @sysconfdir@/mail/"$1".mc.new @sysconfdir@/mail/"$1".mc; + changed=1; + }; + #----------------------------------------------------------------------------- # Move sendmail.{mc,cf} from /etc/ to /etc/mail if [ ! -f @sysconfdir@/mail/sendmail.mc ]; then - if [ -f /etc/sendmail.mc ]; then + if [ -f @sysconfdir@/sendmail.mc ]; then echo "Moving /etc/sendmail.* to /etc/mail/"; - mv /etc/sendmail.mc @sysconfdir@/mail/sendmail.mc; - chown root:smmsp @sysconfdir@/mail/sendmail.mc; - chmod 0644 @sysconfdir@/mail/sendmail.mc; - changed=1; + mv @sysconfdir@/sendmail.mc @sysconfdir@/mail/sendmail.mc.new; + new_mc sendmail; fi; - if [ -f /etc/sendmail.cf ]; then - mv /etc/sendmail.cf @sysconfdir@/mail/sendmail.cf; + if [ -f @sysconfdir@/sendmail.cf ]; then + mv @sysconfdir@/sendmail.cf @sysconfdir@/mail/sendmail.cf; chown root:smmsp @sysconfdir@/mail/sendmail.cf; chmod 0644 @sysconfdir@/mail/sendmail.cf; changed=1; @@ -38,76 +64,94 @@ if [ ! -f @sysconfdir@/mail/sendmail.mc ]; then fi; #----------------------------------------------------------------------------- -# Install prototype submit.mc +# Create {submit,sendmail}.mc if needed +if [ ! -f @sysconfdir@/mail/sendmail.mc ]; then + cp -p @datadir@/sendmail/cf/debian/sendmail.mc \ + @sysconfdir@/mail/sendmail.mc.new; + if [ -f @sysconfdir@/mailname ] && [ ! -z @sysconfdir@/mailname ]; then + masq=$(cat @sysconfdir@/mailname); + echo "dnl # Masquerading options" \ + >> @sysconfdir@/mail/sendmail.mc.new; + echo "FEATURE(\`always_add_domain')dnl" \ + >> @sysconfdir@/mail/sendmail.mc.new; + echo "MASQUERADE_AS(\`${masq}')dnl" \ + >> @sysconfdir@/mail/sendmail.mc.new; + echo "FEATURE(\`allmasquerade')dnl" \ + >> @sysconfdir@/mail/sendmail.mc.new; + echo "FEATURE(\`masquerade_envelope')dnl" \ + >> @sysconfdir@/mail/sendmail.mc.new; + fi; + new_mc sendmail; + fi; if [ ! -f @sysconfdir@/mail/submit.mc ]; then - cp -p @datadir@/sendmail/cf/debian/submit.mc \ - @sysconfdir@/mail/submit.mc; - chown root:smmsp @sysconfdir@/mail/submit.mc; - chmod 0644 @sysconfdir@/mail/submit.mc; + if [ -f @datadir@/sendmail/cf/debian/submit.mc ]; then + cp -p @datadir@/sendmail/cf/debian/submit.mc \ + @sysconfdir@/mail/submit.mc.new; + new_mc submit; + fi; fi; #----------------------------------------------------------------------------- # Make sure dialup support m4 files are extant -if [ ! -f @sysconfdir@/mail/dialup.m4 ]; then - touch @sysconfdir@/mail/dialup.m4; - chown root:smmsp @sysconfdir@/mail/dialup.m4; - chmod 0640 @sysconfdir@/mail/dialup.m4; +if [ ! -f @sysconfdir@/mail/m4/dialup.m4 ]; then + if [ -f @sysconfdir@/mail/dialup.m4 ]; then + mv @sysconfdir@/mail/dialup.m4 @sysconfdir@/mail/m4/dialup.m4; + else + touch @sysconfdir@/mail/m4/dialup.m4; + fi; + chown root:smmsp @sysconfdir@/mail/m4/dialup.m4; + chmod 0640 @sysconfdir@/mail/m4/dialup.m4; fi; -if [ ! -f @sysconfdir@/mail/provider.m4 ]; then - touch @sysconfdir@/mail/provider.m4; - chown root:smmsp @sysconfdir@/mail/provider.m4; - chmod 0640 @sysconfdir@/mail/provider.m4; +if [ ! -f @sysconfdir@/mail/m4/provider.m4 ]; then + if [ -f @sysconfdir@/mail/provider.m4 ]; then + mv @sysconfdir@/mail/provider.m4 @sysconfdir@/mail/m4/provider.m4; + else + touch @sysconfdir@/mail/m4/provider.m4; + fi; + chown root:smmsp @sysconfdir@/mail/m4/provider.m4; + chmod 0640 @sysconfdir@/mail/m4/provider.m4; + fi; +if (grep -qEe "^[[:space:]]*include\(\`?@sysconfdir@/mail/dialup.m4" \ + @sysconfdir@/mail/sendmail.mc); then + sed -e "s=^\([[:space:]]*\)include(\`\?@sysconfdir@/mail/dialup\.m4.*$=include(\`@sysconfdir@/mail/m4/dialup\.m4')dnl=" \ + @sysconfdir@/mail/sendmail.mc > @sysconfdir@/mail/sendmail.mc.new; + new_mc sendmail; + fi; +if (grep -qEe "^[[:space:]]*include\(\`?@sysconfdir@/mail/provider.m4" \ + @sysconfdir@/mail/sendmail.mc); then + sed -e "s=^\([[:space:]]*\)include(\`\?@sysconfdir@/mail/provider\.m4.*$=include(\`@sysconfdir@/mail/m4/provider\.m4')dnl=" \ + @sysconfdir@/mail/sendmail.mc > @sysconfdir@/mail/sendmail.mc.new; + new_mc sendmail; fi; #----------------------------------------------------------------------------- # Make sure not using text mailertable (it doesn't work) -if (grep -qEe "^[[:space:]]*FEATURE\(\`?mailertable'?, \`text /etc/mail/mailertable'\)" @sysconfdir@/mail/sendmail.mc); then - changed=1; +if (grep -qEe "^[[:space:]]*FEATURE\(\`?mailertable'?, \`text /etc/mail/mailertable'\)" \ + @sysconfdir@/mail/sendmail.mc); then echo "Correcting FEATURE(mailertable) in /etc/mail/sendmail.mc"; sed -e "s=^\([[:space:]]*\)\(\`\?\)FEATURE(\`\?mailertable'\?, \`text /etc/mail/mailertable')\(dnl\)\?=\1\2FEATURE(\`mailertable')dnl=g" \ @sysconfdir@/mail/sendmail.mc > @sysconfdir@/mail/sendmail.mc.new; - chown root:smmsp @sysconfdir@/mail/sendmail.mc.new; - chmod 0644 @sysconfdir@/mail/sendmail.mc.new; - mv @sysconfdir@/mail/sendmail.mc.new @sysconfdir@/mail/sendmail.mc; + new_mc sendmail; fi; #----------------------------------------------------------------------------- # Make sure smrsh points to the correct location if (grep -qEe "^[[:space:]]*\`?FEATURE\(\`?smrsh'?[[:space:]]*,.*\)" \ @sysconfdir@/mail/sendmail.mc); then - changed=1; echo "Correcting FEATURE(smrsh) in /etc/mail/sendmail.mc"; sed -e "s=\([[:space:]]*\)\(\`\?\)FEATURE(\`\?smrsh'\?[[:space:]]*,.*)\(dnl\)\?=\1\2FEATURE(\`smrsh')dnl=g" \ @sysconfdir@/mail/sendmail.mc > @sysconfdir@/mail/sendmail.mc.new; - chown root:smmsp @sysconfdir@/mail/sendmail.mc.new; - chmod 0644 @sysconfdir@/mail/sendmail.mc.new; - mv @sysconfdir@/mail/sendmail.mc.new @sysconfdir@/mail/sendmail.mc; + new_mc sendmail; fi; #----------------------------------------------------------------------------- # Convert FEATURE(nouucp) to FEATURE(nouucp,reject) if (grep -qEe "^[[:space:]]*\`?FEATURE\(\`?nouucp'?\)" \ @sysconfdir@/mail/sendmail.mc); then - changed=1; echo "Correcting FEATURE(nouucp) in /etc/mail/sendmail.mc"; sed -e "s=^\([[:space:]]*\)\(\`\?\)FEATURE(\`\?nouucp'\?)\(dnl\)\?=\1\2FEATURE(\`nouucp', \`reject')dnl=g" \ @sysconfdir@/mail/sendmail.mc > @sysconfdir@/mail/sendmail.mc.new; - chown root:smmsp @sysconfdir@/mail/sendmail.mc.new; - chmod 0644 @sysconfdir@/mail/sendmail.mc.new; - mv @sysconfdir@/mail/sendmail.mc.new @sysconfdir@/mail/sendmail.mc; - fi; - -#----------------------------------------------------------------------------- -# Convert FEATURE(rbl) to FEATURE(dnsbl,rbl.maps.vix.com) -if (grep -qEe "^[[:space:]]*\`?FEATURE\(\`?rbl'?\)" \ - @sysconfdir@/mail/sendmail.mc); then - changed=1; - echo "Correcting FEATURE(rbl) in /etc/mail/sendmail.mc"; - sed -e "s=^\([[:space:]]*\)\(\`\?\)FEATURE(\`\?rbl'\?)\(dnl\)\?=\1\2FEATURE(\`dnsbl', \`rbl.maps.vix.com')dnl=g" \ - @sysconfdir@/mail/sendmail.mc > @sysconfdir@/mail/sendmail.mc.new; - chown root:smmsp @sysconfdir@/mail/sendmail.mc.new; - chmod 0644 @sysconfdir@/mail/sendmail.mc.new; - mv @sysconfdir@/mail/sendmail.mc.new @sysconfdir@/mail/sendmail.mc; + new_mc sendmail; fi; #----------------------------------------------------------------------------- @@ -115,13 +159,10 @@ if (grep -qEe "^[[:space:]]*\`?FEATURE\(\`?rbl'?\)" \ if [ -e @datadir@/sendmail/cf/feature/local_no_masquerade.m4 ]; then if (grep -qEe "^[[:space:]]*\`?FEATURE\(\`?dont_masquerade_local'?\)" \ @sysconfdir@/mail/sendmail.mc); then - changed=1; echo "Correcting FEATURE(dont_masquerade_local) in /etc/mail/sendmail.mc"; sed -e "s=^\([[:space:]]*\)\(\`\?\)FEATURE(\`\?dont_masquerade_local'\?)\(dnl\)\?=\1\2FEATURE(\`local_no_masquerade')dnl=g" \ @sysconfdir@/mail/sendmail.mc > @sysconfdir@/mail/sendmail.mc.new; - chown root:smmsp @sysconfdir@/mail/sendmail.mc.new; - chmod 0644 @sysconfdir@/mail/sendmail.mc.new; - mv @sysconfdir@/mail/sendmail.mc.new @sysconfdir@/mail/sendmail.mc; + new_mc sendmail; fi; fi; @@ -129,12 +170,9 @@ if [ -e @datadir@/sendmail/cf/feature/local_no_masquerade.m4 ]; then # Convert FEATURE(access_db,...) to FEATURE(access_db) if (grep -qEe "^[[:space:]]*\`?FEATURE\(\`?access_db'?[[:space:]]*,.*\)" \ @sysconfdir@/mail/sendmail.mc); then - changed=1; sed -e "s=^\([[:space:]]*\)\(\`\?\)FEATURE(\`\?access_db'\?[[:space:]]*,[[:space:]]*\`\?hash[[:space:]]*\(-o\)\?[[:space:]]*/etc/mail/access.db'\?[[:space:]]*)\(dnl\)\?=\1\2FEATURE(\`access_db')dnl=g" \ @sysconfdir@/mail/sendmail.mc > @sysconfdir@/mail/sendmail.mc.new; - chown root:smmsp @sysconfdir@/mail/sendmail.mc.new; - chmod 0644 @sysconfdir@/mail/sendmail.mc.new; - mv @sysconfdir@/mail/sendmail.mc.new @sysconfdir@/mail/sendmail.mc; + new_mc sendmail; fi; #----------------------------------------------------------------------------- @@ -143,70 +181,105 @@ if (grep -qEe "^[[:space:]]*\`?include\(\`?@datadir@/sendmail/sendmail.cf/m4/cf. @sysconfdir@/mail/sendmail.mc); then sed -e "s=sendmail/sendmail.cf=sendmail/cf=g" \ @sysconfdir@/mail/sendmail.mc > @sysconfdir@/mail/sendmail.mc.new; - chown root:smmsp @sysconfdir@/mail/sendmail.mc.new; - chmod 0644 @sysconfdir@/mail/sendmail.mc.new; - mv @sysconfdir@/mail/sendmail.mc.new @sysconfdir@/mail/sendmail.mc; - sed -e "s=sendmail/sendmail.cf=sendmail/cf=g" \ - @sysconfdir@/mail/submit.mc > @sysconfdir@/mail/submit.mc.new; - chown root:smmsp @sysconfdir@/mail/submit.mc.new; - chmod 0644 @sysconfdir@/mail/submit.mc.new; - mv @sysconfdir@/mail/submit.mc.new @sysconfdir@/mail/submit.mc; + new_mc sendmail; + if [ -f @sysconfdir@/mail/submit.mc ]; then + sed -e "s=sendmail/sendmail.cf=sendmail/cf=g" \ + @sysconfdir@/mail/submit.mc > @sysconfdir@/mail/submit.mc.new; + new_mc submit; + fi; fi; #----------------------------------------------------------------------------- # Add include(/usr/share/sendmail/cf/m4/cf.m4) if (grep -qEe "^[[:space:]]*\`?include\(\`?@datadir@/sendmail/cf/m4/cf.m4'?\)" \ @sysconfdir@/mail/sendmail.mc); then - true; + :; else - changed=1; echo "Adding include(.../cf.m4) to /etc/mail/sendmail.mc"; sed -e "s=^\([[:space:]]*\)\(\`\?\)VERSIONID(=\1\2include(\`@datadir@/sendmail/cf/m4/cf.m4')dnl\\ \1\2VERSIONID(=" \ @sysconfdir@/mail/sendmail.mc > @sysconfdir@/mail/sendmail.mc.new; - chown root:smmsp @sysconfdir@/mail/sendmail.mc.new; - chmod 0644 @sysconfdir@/mail/sendmail.mc.new; - mv @sysconfdir@/mail/sendmail.mc.new @sysconfdir@/mail/sendmail.mc; + new_mc sendmail; fi; #----------------------------------------------------------------------------- # Add define(`_USE_ETC_MAIL_')dnl if (grep -qEe "^[[:space:]]*\`?define\(\`?_USE_ETC_MAIL_" \ @sysconfdir@/mail/sendmail.mc); then - true; + :; else - changed=1; sed -e "s=^\([[:space:]]*\)\(\`\?\)include(\`\?@datadir@/sendmail/cf/m4/cf.m4'\?)\(dnl\)\?=\1\2define(\`_USE_ETC_MAIL_')dnl\\ include(\`@datadir@/sendmail/cf/m4/cf.m4')dnl=" \ @sysconfdir@/mail/sendmail.mc > @sysconfdir@/mail/sendmail.mc.new; - chown root:smmsp @sysconfdir@/mail/sendmail.mc.new; - chmod 0644 @sysconfdir@/mail/sendmail.mc.new; - mv @sysconfdir@/mail/sendmail.mc.new @sysconfdir@/mail/sendmail.mc; + new_mc sendmail; + fi; + +#----------------------------------------------------------------------------- +# Check for badness +if (grep -qEe "^[[:space:]]*\`?OSTYPE\(\`?linux'?\)" \ + @sysconfdir@/mail/sendmail.mc); then + sed -e "s=^\([[:space:]]*\)\(\`\?\)OSTYPE(\`\?linux'\?)\(dnl\)\?=\1\2OSTYPE(\`debian')dnl=" \ + @sysconfdir@/mail/sendmail.mc > @sysconfdir@/mail/sendmail.mc.new; + new_mc sendmail; fi; #----------------------------------------------------------------------------- # Add DOMAIN(debian-mta) if (grep -qEe "^[[:space:]]*\`?DOMAIN\(\`?debian-mta'?\)" \ @sysconfdir@/mail/sendmail.mc); then - true; + :; else - changed=1; echo "Adding DOMAIN(debian-mta) to /etc/mail/sendmail.mc"; sed -e "s=^\([[:space:]]*\)\(\`\?\)OSTYPE(\`\?debian'\?)\(dnl\)\?=\1\2OSTYPE(\`debian')dnl\\ \1\2DOMAIN(\`debian-mta')dnl=" \ @sysconfdir@/mail/sendmail.mc > @sysconfdir@/mail/sendmail.mc.new; - chown root:smmsp @sysconfdir@/mail/sendmail.mc.new; - chmod 0644 @sysconfdir@/mail/sendmail.mc.new; - mv /etc/mail/sendmail.mc.new /etc/mail/sendmail.mc + new_mc sendmail; + fi; + +#----------------------------------------------------------------------------- +# Add sendmail.conf customization area +if (grep -qEe "^dnl # Items controlled by /etc/mail/sendmail.conf" \ + @sysconfdir@/mail/sendmail.mc); then + :; +else + echo "Adding sendmail.conf customization area to /etc/mail/sendmail.mc"; + sed -e "s=^\([[:space:]]*\)\(\`\?\)DOMAIN(\`\?debian-mta'\?)\(dnl\)\?=\1\2DOMAIN(\`debian-mta')dnl\\ +dnl # Items controlled by /etc/mail/sendmail.conf - DO NOT TOUCH HERE \\ +dnl undefine(\`confHOST_STATUS_DIRECTORY')dnl #DAEMON_HOSTSTATS \\ +dnl # Items controlled by /etc/mail/sendmail.conf - DO NOT TOUCH HERE=" \ + @sysconfdir@/mail/sendmail.mc > @sysconfdir@/mail/sendmail.mc.new; + new_mc sendmail; fi; #----------------------------------------------------------------------------- +# Update items in sendmail.conf customization area +case "$DAEMON_HOSTSTATS" in + [Nn]*) + if (grep -qEe "^dnl undefine\(\`confHOST_STATUS_DIRECTORY'\)dnl" \ + @sysconfdir@/mail/sendmail.mc); then + echo "Turning off Host Status collection"; + sed -e "s=^dnl undefine(\`confHOST_STATUS_DIRECTORY')dnl=undefine(\`confHOST_STATUS_DIRECTORY')dnl=" \ + @sysconfdir@/mail/sendmail.mc > @sysconfdir@/mail/sendmail.mc.new; + new_mc sendmail; + fi; + ;; + [Yy]*) + if (grep -qEe "^undefine\(\`confHOST_STATUS_DIRECTORY'\)dnl" \ + @sysconfdir@/mail/sendmail.mc); then + echo "Turning on Host Status collection"; + sed -e "s=^undefine(\`confHOST_STATUS_DIRECTORY')dnl=dnl undefine(\`confHOST_STATUS_DIRECTORY')dnl=" \ + @sysconfdir@/mail/sendmail.mc > @sysconfdir@/mail/sendmail.mc.new; + new_mc sendmail; + fi; + esac; + +#----------------------------------------------------------------------------- # Cleanup submit.mc -sed -e "/^define(\`\?confRUN_AS_USER.*$/d" \ - -e "/^define(\`\?confTRUSTED_USER.*$/d" \ - @sysconfdir@/mail/submit.mc > @sysconfdir@/mail/submit.mc.new; - chown root:smmsp @sysconfdir@/mail/submit.mc.new; - chmod 0644 @sysconfdir@/mail/submit.mc.new; - mv /etc/mail/submit.mc.new /etc/mail/submit.mc +if [ -f @sysconfdir@/mail/submit.mc ]; then + sed -e "/^define(\`\?confRUN_AS_USER.*$/d" \ + -e "/^define(\`\?confTRUSTED_USER.*$/d" \ + @sysconfdir@/mail/submit.mc > @sysconfdir@/mail/submit.mc.new; + new_mc submit; + fi; exit $changed; diff --git a/debian/local/update_mk.in b/debian/local/update_mk.in index 02376ec..2ac8907 100644 --- a/debian/local/update_mk.in +++ b/debian/local/update_mk.in @@ -27,6 +27,7 @@ use Getopt::Long; # parameter handling # BEGIN { $main::my_path = substr($0,$[,rindex($0,'/')) }; use lib ('.', substr($0,$[,rindex($0,'/')), "@datadir@/sendmail"); require Parse_mc; +require Parse_conf; # Version of this program #($main::MYNAME = $main::0) =~ s|.*/||; @@ -47,6 +48,7 @@ my $hostname = hostname(); my $directory = getcwd(); my $Makefile_def = "@sysconfdir@/mail/Makefile"; +my $Conffile = "@sysconfdir@/mail/sendmail.conf"; # List of database entries that will be created if not found my %created_dbs; my @created_dbs; @@ -90,6 +92,15 @@ ${Parse_mc::database_file} = $main::opt_input_file # $main::debug is used in Parse_mc ! $main::debug = $main::opt_debug || $main::debug; +# Pull in some configuration data +&Parse_conf::read_conf("$Conffile"); +my ($ok, $value) = &Parse_conf::get_value('HANDS_OFF'); +if ($value ne '0') { + unlink "${Makefile}"; + unlink "@sysconfdir@/mail/databases"; + exit; + }; + # Let them know wtf is going on... print STDOUT "Creating ${Makefile}...\n"; @@ -119,7 +130,10 @@ sub get_names { ,'parse_mc' => 1 ,'update_conf' => 1 ,'update_mk' => 1 + ,'update_auth' => 1 + ,'update_tls' => 1 ,'QUEUE_GROUP' => 1 + ,'include' => 1 ); # Add any qualified databases to the list @@ -225,7 +239,12 @@ sub write_target_clean { %created_files = (); foreach my $entry (@databases) { - next if ($entry eq 'QUEUE_GROUP' or $entry eq 'Makefile'); + next if ($entry eq 'QUEUE_GROUP' + or $entry eq 'Makefile' + or $entry eq 'auth' + or $entry eq 'tls' + or $entry eq 'include' + ); my ($class, $flags, $files, $options) = &Parse_mc::entry_dbs($entry); foreach my $file (@{$files}) { @@ -233,14 +252,16 @@ sub write_target_clean { or exists($created_files{$file}) ); $created_files{$file} = ''; my $dbname; - if ($class eq 'parse_mc' or $class eq 'update_mk' + if ($class eq 'parse_mc' + or $class eq 'update_mk' or $class eq 'm4') { $dbname = "@sysconfdir@/mail/$entry"; } elsif ($class eq 'update_conf') { $dbname = "@sysconfdir@/cron.d/sendmail"; } - elsif ($class eq 'btree' or $class eq 'hash' + elsif ($class eq 'btree' + or $class eq 'hash' or $class eq 'newaliases') { $dbname = "$file.db"; } @@ -397,10 +418,12 @@ sub write_targets { # %.db: % FORCE \@echo 'Updating \$\@...'; - \@@sbindir@/makemap hash \$\@.new.db < \$<; - \@chown root:smmsp \$\@.new.db; - \@chmod 0644 \$\@.new.db - \@mv -f \$\@.new.db \$\@; + \@if [ -x @sbindir@/makemap ]; then \\ + @sbindir@/makemap hash \$\@.new.db < \$<; \\ + chown root:smmsp \$\@.new.db; \\ + chmod 0640 \$\@.new.db; \\ + mv -f \$\@.new.db \$\@; \\ + fi; EOT # Spew primary target of <target> @@ -416,8 +439,13 @@ EOT # Create short name(s) for database entries $sleft .= "$entry "; - if ($class eq 'newaliases' or $class eq 'parse_mc' - or $class eq 'update_mk' or $class eq 'update_conf') { + if ($class eq 'newaliases' + or $class eq 'parse_mc' + or $class eq 'update_mk' + or $class eq 'update_conf' + or $class eq 'update_auth' + or $class eq 'update_tls' + ) { $sleft = 'makefile make ' if ($class eq 'update_mk'); $sleft .= 'cron ' if ($class eq 'update_conf'); $sleft .= "$class "; @@ -426,9 +454,10 @@ EOT foreach my $file (@{$files}) { next if $file eq '-'; next if $file eq 'ldap'; # ALIAS hack - if ($entry eq 'QUEUE_GROUP') { + if ($entry eq 'QUEUE_GROUP' or $entry eq 'include') { $dbname = ''; - $left = $entry; + $sleft = lc "${entry}s"; + $left = lc "${entry}s"; } elsif ($class eq 'parse_mc' or $class eq 'update_mk' or $class eq 'm4') { @@ -443,14 +472,21 @@ EOT } else { $dbname = $file; + $file = "" + if ($class eq 'update_tls' + or $class eq 'update_auth'); }; $left .= "$dbname "; $right .= " $file"; # Create short name(s) for database entries - if ($class ne 'parse_mc' and $class ne 'update_mk' + if ($class ne 'parse_mc' + and $class ne 'update_mk' and $class ne 'update_conf' + and $class ne 'update_auth' + and $class ne 'update_tls' and $entry ne 'QUEUE_GROUP' + and $entry ne 'include' ) { my $dbsname = "$dbname"; $dbsname =~ s/\/etc\/mail\///; @@ -464,41 +500,57 @@ EOT # Spew out a phony entry suitable for FORCE print $ofh '.PHONY: ', $sleft, "\n"; - print $ofh $sleft,':', $right, " FORCE\n" - if ($entry ne 'QUEUE_GROUP'); + print $ofh $sleft,": FORCE\n" + if ($entry ne 'QUEUE_GROUP' and $entry ne 'include'); if ($class eq 'update_mk') { print $ofh "\t\@touch $right;\n", "\t\@\$(MAKE) -sf $Makefile $left;\n"; } - elsif ($entry ne 'QUEUE_GROUP') { + elsif ($entry ne 'QUEUE_GROUP' and $entry ne 'include') { print $ofh "\t\@rm -f $left;\n", "\t\@\$(MAKE) -sf $Makefile $left;\n"; }; # # Spew out the whole enchilada for this database - # Hidden dependancies (need to parse includes) - $right .= join(''," @sysconfdir@/mail/dialup.m4", - " @sysconfdir@/mail/provider.m4") - if ($entry eq 'sendmail.cf'); + if ($entry eq 'sendmail.cf' or $entry eq 'databases') { + my ($iclass, $iflags, $ifiles, $ioptions) = + &Parse_mc::entry_dbs('include'); + $right .= ' '; + $right .= join(' ', @{$ifiles}); + }; print $ofh $left, ':', $right, "\n"; - next if ($entry eq 'QUEUE_GROUP'); + next if ($entry eq 'QUEUE_GROUP' or $entry eq 'include'); print $ofh "\t\@echo 'Updating $entry ...';\n"; - print $ofh "\t\@@sbindir@/sendmail -bi || true;\n" - if ($class eq 'newaliases'); - print $ofh "\t\@@datadir@/sendmail/parse_mc || true;\n" - if ($class eq 'parse_mc'); - print $ofh "\t\@@datadir@/sendmail/update_mk || true;\n" - if ($class eq 'update_mk'); - print $ofh "\t\@@datadir@/sendmail/update_conf || true;\n" - if ($class eq 'update_conf'); + if ($class eq 'newaliases') { + print $ofh "\t\@if [ -x @sbindir@/sendmail ]; then \\\n"; + print $ofh "\t\t@sbindir@/sendmail -bi || true; \\\n"; + } + elsif ($class eq 'parse_mc' + or $class eq 'update_conf' + or $class eq 'update_mk' + or $class eq 'update_auth' + or $class eq 'update_tls' + ) { + print $ofh "\t\@if [ -x @datadir@/sendmail/${class} ]; then \\\n"; + print $ofh "\t\t@datadir@/sendmail/${class} || true; \\\n" + } + elsif ($class eq 'btree' or $class eq 'hash') { + print $ofh "\t\@if [ -x @sbindir@/makemap ]; then \\\n"; + }; foreach my $file (@{$files}) { next if ( $file eq 'ldap' ); # ALIAS hack my $dbname = $file; my $newname = $file; + my $uid = 'root'; + $uid = 'smmta' if ($entry eq 'authinfo' + or $entry eq 'access_db' + or $entry eq 'QUEUE_GROUP' + or $class eq 'newaliases'); my $mode = '0644'; $mode = '0640' if ($entry eq 'authinfo' or $entry eq 'access_db'); + $mode = '0640' if ($class eq 'btree' or $class eq 'hash'); $mode = '0644' if ($class eq 'm4'); $mode = '0754' if ($class eq 'update_mk'); $mode = '02750' if ($entry eq 'QUEUE_GROUP'); @@ -506,36 +558,37 @@ EOT $dbname .= '.db'; $newname .= '.new.db'; if (index($flags, '-o') == -1) { - print $ofh "\t\@@sbindir@/makemap $class $newname \\\n", - "\t\t< $file;\n", - "\t\@chown root:smmsp $newname;\n", - "\t\@chmod $mode $newname;\n", - "\t\@mv -f $newname $dbname;\n"; + print $ofh "\t\t@sbindir@/makemap $class $newname \\\n", + "\t\t\t< $file; \\\n", + "\t\tchown $uid:smmsp $newname; \\\n", + "\t\tchmod $mode $newname; \\\n", + "\t\tmv -f $newname $dbname; \\\n"; } else { print $ofh - "\t\@if [ -s $file ]; then \\\n", + "\t\tif [ -s $file ]; then \\\n", "\t\t@sbindir@/makemap $class $newname \\\n", - "\t\t\t< $file;\\\n", - "\t\tchown root:smmsp $newname;\\\n", - "\t\tchmod $mode $newname;\\\n", - "\t\tmv -f $newname $dbname;\\\n", - "\t\tfi;\n"; + "\t\t\t< $file; \\\n", + "\t\tchown $uid:smmsp $newname; \\\n", + "\t\tchmod $mode $newname; \\\n", + "\t\tmv -f $newname $dbname; \\\n", + "\t\tfi; \\\n"; }; } elsif ($class eq 'newaliases') { $newname .= '.db'; - print $ofh "\t\@if [ -f $newname ]; then \\\n", - "\t\tchown root:smmsp $newname; \\\n", - "\t\tchmod $mode $newname; \\\n", - "\t\tfi;\n"; + print $ofh "\t\tif [ -f $newname ]; then \\\n", + "\t\t\tchown $uid:smmsp $newname; \\\n", + "\t\t\tchmod $mode $newname; \\\n", + "\t\t\tfi; \\\n"; } elsif ($class eq 'parse_mc' or $class eq 'update_mk') { $newname = "@sysconfdir@/mail/$entry"; - print $ofh "\t\@chown root:smmsp $newname;\n", - "\t\@chmod $mode $newname;\n"; + print $ofh "\t\tchown $uid:smmsp $newname; \\\n", + "\t\tchmod $mode $newname; \\\n"; } elsif ($class eq 'm4') { + my $oldname = $dbname; $dbname =~ s/\.mc$/\.cf/; $newname =~ s/\.mc$/\.cf\.new/; my $lead = "\t"; @@ -543,10 +596,10 @@ EOT my $lead2 = "\t\t"; my $trail = ""; if ($entry eq 'submit.cf') { - $lead = "\t\t"; - $leadh = "\t\t"; + $lead = "\t\t"; + $leadh = "\t\t"; $lead2 = "\t\t\t"; - $trail = "\\"; + $trail = "\\"; }; print $ofh "\t\@rm -f ${dbname}.errors\n"; @@ -556,11 +609,15 @@ EOT print $ofh "${leadh}m4 $file > $newname \\\n", "${lead2}2> ${dbname}.errors || true; $trail\n", - "${leadh}chown root:smmsp $newname; $trail\n", + "${leadh}echo \"### ${oldname} ###\" \\\n", + "${lead2}>> $newname; $trail\n", + "${leadh}sed -e 's/^/# /' $file \\\n", + "${lead2}>> $newname; $trail\n", + "${leadh}chown $uid:smmsp $newname; $trail\n", "${leadh}chmod $mode $newname; $trail\n", "${leadh}mv -f $newname $dbname; $trail\n", "${leadh}if [ -s ${dbname}.errors ]; then \\\n", - "${lead2}chown root:smmsp ${dbname}.errors; \\\n", + "${lead2}chown $uid:smmsp ${dbname}.errors; \\\n", "${lead2}cat ${dbname}.errors; \\\n", "${lead}else \\\n", "${lead2}rm -f ${dbname}.errors; \\\n", @@ -569,6 +626,16 @@ EOT "${lead}fi;\n" if ($entry eq 'submit.cf'); }; }; + if ($class eq 'newaliases' + or $class eq 'parse_mc' + or $class eq 'update_conf' + or $class eq 'update_mk' + or $class eq 'update_auth' + or $class eq 'update_tls' + or $class eq 'btree' or $class eq 'hash' + ) { + print $ofh "\t\tfi;\n"; + }; }; }; @@ -593,15 +660,25 @@ EOT # These are done above... next if ($entry eq 'databases' - or $entry eq 'Makefile'); + or $entry eq 'auth' + or $entry eq 'tls' + or $entry eq 'Makefile' + or $entry eq 'include' + ); foreach my $file (@{$files}) { next if ( $file eq '-' or exists($created_files{$file}) ); $created_files{$file} = ''; + my $uid = 'root'; + $uid = 'smmta' if ($entry eq 'authinfo' + or $entry eq 'access_db' + or $entry eq 'QUEUE_GROUP' + or $class eq 'newaliases'); my $mode = '0644'; $mode = '0640' if ($entry eq 'authinfo' or $entry eq 'access_db'); + $mode = '0640' if ($class eq 'btree' or $class eq 'hash'); $mode = '0644' if ($class eq 'm4'); $mode = '0754' if ($class eq 'update_mk'); $mode = '02750' if ($entry eq 'QUEUE_GROUP'); @@ -609,8 +686,8 @@ EOT "\t\@echo 'Creating $file';\n"; if ($entry eq 'QUEUE_GROUP') { print $ofh "\t\@install -d", - " -o root -g smmsp -m $mode $file;\n", - "\t\@chown root:smmsp $file;\n", + " -o $uid -g smmsp -m $mode $file;\n", + "\t\@chown $uid:smmsp $file;\n", "\t\@chmod $mode $file;\n"; } elsif ($entry eq 'sendmail.cf') { @@ -621,17 +698,29 @@ EOT print $ofh "\t\@cp @datadir@/sendmail/", "cf/debian/submit.mc \\\n", "\t\t$file;\n", - "\t\@chown root:smmsp $file;\n", + "\t\@chown $uid:smmsp $file;\n", + "\t\@chmod $mode $file;\n"; + } + elsif ($entry eq 'access_db') { + print $ofh "\t\@cp @datadir@/sendmail/", + "examples/db/access \\\n", + "\t\t$file;\n", + "\t\@chown $uid:smmsp $file;\n", "\t\@chmod $mode $file;\n"; } - elsif ($entry eq 'crontab') { - print $ofh "\t\@@datadir@/sendmail/update_conf;\n"; + elsif ($file eq '@sysconfdir@/mail/aliases') { + print $ofh "\t\@ln -s ../aliases @sysconfdir@/mail/aliases\n"; + } + elsif ($class eq 'update_conf' + or $class eq 'update_auth' + or $class eq 'update_tls') { + print $ofh "\t\@@datadir@/sendmail/${class};\n"; } # FIXME: come back and create real data # where needed (local-host-names, etc) elsif (index($flags, '-o') == -1) { print $ofh "\t\@touch $file;\n", - "\t\@chown root:smmsp $file;\n", + "\t\@chown $uid:smmsp $file;\n", "\t\@chmod $mode $file;\n"; } elsif (index($flags, '-o') != -1) { diff --git a/debian/local/update_notices b/debian/local/update_notices index 522c1ef..b1db47b 100644 --- a/debian/local/update_notices +++ b/debian/local/update_notices @@ -17,7 +17,7 @@ set -e; notices=0; version=$1; export LANG=C; # for the comparison of mail version... - +exit 0; #----------------------------------------------------------------------------- # Notice Item #----------------------------------------------------------------------------- @@ -50,9 +50,44 @@ if [ -z "$version" ]; then fi; #----------------------------------------------------------------------------- +if test ! -z "$version" && \ + (dpkg --compare-versions "$version" lt "00.00.00-00"); then + : + Notice_Item <<-EOT; + EOT + fi; + +#----------------------------------------------------------------------------- +if test ! -z "$version" && \ + (dpkg --compare-versions "$version" lt "8.12.10-5"); then + Notice_Item <<-EOT; + + 7 -> 8 bit (QP/Base64) decoding is no longer done by default as it + doesn't respect character set differences (ie, utf-8). + + If you wish to keep this functionality, you'll need to update your + sendmail.mc to include the following line: + MODIFY_MAILER_FLAGS(\`local', \`+9') # mime7to8 + EOT + fi; + +#----------------------------------------------------------------------------- if test ! -z "$version" && \ - (dpkg --compare-versions "$version" lt "00.00.00-00"); then + (dpkg --compare-versions "$version" lt "8.12.10-5"); then Notice_Item <<-EOT; + + ---> IMPORTANT NOTICE <--- + If you want to use TLS and/or AUTH, you *MUST* update your + sendmail.mc and optionally submit.mc for these to work ! + + If you do *NOT* update prior to sendmail being restarted, those + features will simply *STOP* working !!! + + To allow SASL (SMTP AUTH), you must add this line to /etc/mail/sendmail.mc: + include(\`/etc/mail/sasl/sasl.m4')dnl + + For TLS (STARTTLS), you need this: + include(\`/etc/mail/tls/starttls.m4')dnl EOT fi; diff --git a/debian/local/update_sendmail b/debian/local/update_sendmail index e7c5fe1..900044e 100644 --- a/debian/local/update_sendmail +++ b/debian/local/update_sendmail @@ -7,16 +7,35 @@ # Time-stamp: <2001/01/17 10:00:00 cowboy> # # Notes (to all): -# * +# * # # Notes (to self): -# * +# * # #----------------------------------------------------------------------------- set -e; # Path to other sendmail helpers -sm_path=$(dirname $0); +if [ -x ./update_sendmail ]; then + sm_path='.'; +elif [ -x $(dirname $0)/update_sendmail ]; then + sm_path=$(dirname $0); +else + sm_path=/usr/share/sendmail; + fi; +# Bring in sendmail.conf for the network definitions +# Here, we *MUST* update the conf file before reading it... +#if [ ! -f /etc/mail/sendmail.conf ]; then + if [ -x $sm_path/update_conf ]; then + $sm_path/update_conf; + fi; +# fi; +if [ -f /etc/mail/sendmail.conf ]; then + . /etc/mail/sendmail.conf; + fi; +if [ "$HANDS_OFF" != 'No' ]; then + exit 0; + fi; # control amount of output verbosity=0; @@ -25,6 +44,20 @@ verbosity=0; changed=0; #------------------------------------------------------------- +# Make sure the configuration is setup +if [ -x $sm_path/update_conf ]; then + $sm_path/update_conf || true; + fi; + +#------------------------------------------------------------- +# Perform some [safe] updates to an existing sendmail.mc to make +# sure it is compatible with the current executables. +if [ -x $sm_path/update_mc ]; then + $sm_path/update_mc || changed=1; + $sm_path/parse_mc || true; + fi; + +#------------------------------------------------------------- # Make sure the system is setup if [ -x $sm_path/update_sys ]; then $sm_path/update_sys || changed=1; @@ -33,8 +66,8 @@ if [ -x $sm_path/update_sys ]; then #------------------------------------------------------------- # update smrsh/sensible-mda information if possible if [ -x $sm_path/update_smrsh ]; then - $sm_path/update_smrsh || true; - fi; + $sm_path/update_smrsh || true; + fi; #------------------------------------------------------------- # update LDAP information if possible @@ -61,13 +94,6 @@ if [ -x $sm_path/update_tcpd ]; then fi; #------------------------------------------------------------- -# Perform some [safe] updates to an existing sendmail.mc to make -# sure it is compatible with the current executables. -if [ -x $sm_path/update_mc ]; then - $sm_path/update_mc || changed=1; - fi; - -#------------------------------------------------------------- # Make sure the databases are in the expected locations if [ -x $sm_path/update_db ]; then $sm_path/update_db || changed=1; diff --git a/debian/local/update_smrsh.in b/debian/local/update_smrsh.in index 8a27d6d..6243ab4 100644 --- a/debian/local/update_smrsh.in +++ b/debian/local/update_smrsh.in @@ -9,7 +9,7 @@ # # Notes (to all): # * The entries in /etc/mail/smrsh are used by the feature(smrsh) and -# sensible-mda. +# sensible-mda. # # Notes (to self): # * @@ -30,6 +30,27 @@ def_progs="\ /usr/bin/deliver \ "; +# Path to other sendmail helpers +if [ -x ./update_sendmail ]; then + sm_path='.'; +elif [ -x $(dirname $0)/update_sendmail ]; then + sm_path=$(dirname $0); +else + sm_path=@datadir@/sendmail; + fi; +# Bring in sendmail.conf for the network definitions +if [ ! -f @sysconfdir@/mail/sendmail.conf ]; then + if [ -x $sm_path/update_conf ]; then + $sm_path/update_conf; + fi; + fi; +if [ -f @sysconfdir@/mail/sendmail.conf ]; then + . @sysconfdir@/mail/sendmail.conf; + fi; +if [ "$HANDS_OFF" != 'No' ]; then + exit 0; + fi; + echo " "; echo "Checking for installed MDAs..."; @@ -39,7 +60,7 @@ if [ ! -e @sysconfdir@/mail/smrsh ]; then changed=1; new=1; fi; -chown root:root @sysconfdir@/mail/smrsh; +chown smmta:smmsp @sysconfdir@/mail/smrsh; chmod 02755 @sysconfdir@/mail/smrsh; #------------------------------------------------------------------------------ diff --git a/debian/local/update_sys.in b/debian/local/update_sys.in index 89cad19..ec84f02 100644 --- a/debian/local/update_sys.in +++ b/debian/local/update_sys.in @@ -21,12 +21,39 @@ #----------------------------------------------------------------------------- set +e; +# Path to other sendmail helpers +if [ -x ./update_sendmail ]; then + sm_path='.'; +elif [ -x $(dirname $0)/update_sendmail ]; then + sm_path=$(dirname $0); +else + sm_path=@datadir@/sendmail; + fi; +# Bring in sendmail.conf for the network definitions +if [ ! -f @sysconfdir@/mail/sendmail.conf ]; then + if [ -x $sm_path/update_conf ]; then + $sm_path/update_conf; + fi; + fi; +if [ -f @sysconfdir@/mail/sendmail.conf ]; then + . @sysconfdir@/mail/sendmail.conf; + fi; +if [ "$HANDS_OFF" != 'No' ]; then + exit 0; + fi; + # flag used to indicate a dataset has been moved, may need another update changed=0; +#----------------------------------------------------------------------------- +# Warn the user that this may take a bit... +#----------------------------------------------------------------------------- +echo ''; +echo 'Checking filesystem, this may take some time - it will not hang!'; +echo -n ' ... '; + #------------------------------------------------------------------------------ # Create any needed directories, and move any prior data to its new home - #------------------------------------------------------------------------------ # /etc/aliases should exist, though not owned by sendmail, we'll create one if [ ! -e @sysconfdir@/aliases ]; then @@ -61,13 +88,15 @@ if [ ! -e @localstatedir@/mail ]; then fi; # # Make sure the sticky bit is set in pre-existing directories -if [ -d @localstatedir@/mail -a ! -k @localstatedir@/mail ]; then +if [ -d @localstatedir@/mail ] && [ ! -k @localstatedir@/mail ]; then chmod a+t @localstatedir@/mail; fi; -if [ -d @localstatedir@/spool/mail -a ! -k @localstatedir@/spool/mail ]; then +if [ -d @localstatedir@/spool/mail ] \ +&& [ ! -k @localstatedir@/spool/mail ]; then chmod a+t @localstatedir@/spool/mail; fi; -if [ ! -d @localstatedir@/spool/mail -a ! -L @localstatedir@/spool/mail ]; then +if [ ! -d @localstatedir@/spool/mail ] \ +&& [ ! -L @localstatedir@/spool/mail ]; then ln -sf ../mail @localstatedir@/spool/mail; #mkdir @localstatedir@/spool/mail; #chown root:root @localstatedir@/spool/mail; @@ -80,8 +109,11 @@ if [ ! -d @sysconfdir@/mail ]; then changed=1; mkdir @sysconfdir@/mail; fi; -chown root:smmsp @sysconfdir@/mail; +chown smmta:smmsp @sysconfdir@/mail; chmod 02755 @sysconfdir@/mail; +mkdir -p @sysconfdir@/mail/m4; +chown smmta:smmsp @sysconfdir@/mail/m4; +chmod 02755 @sysconfdir@/mail/m4; # # With the MSP/MTA split, we don't want any g=w files or directories # to save us from potential sgid attacks @@ -94,23 +126,23 @@ if [ ! -d @localstatedir@/run/sendmail ]; then changed=1; mkdir @localstatedir@/run/sendmail; fi; -chown root:smmsp @localstatedir@/run/sendmail; -chmod 02750 @localstatedir@/run/sendmail; +chown root:smmta @localstatedir@/run/sendmail; +chmod 02755 @localstatedir@/run/sendmail; if [ ! -d @localstatedir@/run/sendmail/mta ]; then mkdir @localstatedir@/run/sendmail/mta; fi; -chown root:smmsp @localstatedir@/run/sendmail/mta; -chmod 02750 @localstatedir@/run/sendmail/mta; +chown smmta:smmsp @localstatedir@/run/sendmail/mta; +chmod 02755 @localstatedir@/run/sendmail/mta; if [ ! -d @localstatedir@/run/sendmail/msp ]; then mkdir @localstatedir@/run/sendmail/msp; fi; chown smmsp:smmsp @localstatedir@/run/sendmail/msp; -chmod 02770 @localstatedir@/run/sendmail/msp; +chmod 02775 @localstatedir@/run/sendmail/msp; if [ ! -d @localstatedir@/run/sendmail/stampdir ]; then mkdir @localstatedir@/run/sendmail/stampdir; fi; chown root:smmsp @localstatedir@/run/sendmail/stampdir; -chmod 02770 @localstatedir@/run/sendmail/stampdir; +chmod 02775 @localstatedir@/run/sendmail/stampdir; # # Remove older files rm -f /var/run/sendmail.pid; @@ -124,8 +156,8 @@ if [ ! -d @localstatedir@/lib/sendmail ]; then changed=1; mkdir @localstatedir@/lib/sendmail; fi; -chown root:smmsp @localstatedir@/lib/sendmail; -chmod 02750 @localstatedir@/lib/sendmail; +chown smmta:smmta @localstatedir@/lib/sendmail; +chmod 02751 @localstatedir@/lib/sendmail; if [ -d /var/state/sendmail/host_status ]; then changed=1; echo "Moving /var/state/sendmail/host_status to /var/lib/sendmail/"; @@ -142,11 +174,11 @@ if [ ! -d @localstatedir@/lib/sendmail/host_status ]; then mkdir @localstatedir@/lib/sendmail/host_status; fi; chown root:smmsp @localstatedir@/lib/sendmail/host_status; -chmod 02750 @localstatedir@/lib/sendmail/host_status; +chmod 02775 @localstatedir@/lib/sendmail/host_status; find @localstatedir@/lib/sendmail/host_status -type d -print \ | xargs -r chown root:smmsp; find @localstatedir@/lib/sendmail/host_status -type d -print \ - | xargs -r chmod 02750; + | xargs -r chmod 02755; # # if sendmail.st doesn't exist, don't create it ! if [ -f /var/log/sendmail.st ]; then @@ -188,13 +220,13 @@ if [ ! -d @localstatedir@/spool/mqueue ]; then changed=1; mkdir @localstatedir@/spool/mqueue; fi; -chown root:smmsp @localstatedir@/spool/mqueue; +chown smmta:smmsp @localstatedir@/spool/mqueue; chmod 02750 @localstatedir@/spool/mqueue; # # With the MSP/MTA split, we *DO* need g=r, gid=smmsp queue directories and # files mailq to work... find @localstatedir@/spool/mqueue -print \ - | xargs -r chown root:smmsp; + | xargs -r chown smmta:smmsp; find @localstatedir@/spool/mqueue -type d -print \ | xargs -r chmod g+rxs-w,o-rwx; find @localstatedir@/spool/mqueue -type f -print \ @@ -210,73 +242,8 @@ chmod 02770 @localstatedir@/spool/mqueue-client; find @localstatedir@/spool/mqueue-client -perm +o=r -print \ | xargs -r chmod o-rwx; -#------------------------------------------------------------------------------ -# /var/log/mail is where we keep our log crap (via syslog) -# Try to fixup syslog, syslog-ng, etc... -if [ ! -d @localstatedir@/log/mail -a \ - ! -f /var/log/mail ]; then - echo "Moving /var/log/mail.* to /var/log/mail/mail.*"; - echo "You will need to adjust any log reading scripts accordingly"; - mkdir @localstatedir@/log/mail; - chown root:smmsp @localstatedir@/log/mail; - chmod 02770 @localstatedir@/log/mail; - mv -f /var/log/mail.log @localstatedir@/log/mail/ \ - 1>/dev/null 2>&1; - mv -f /var/log/mail.log.[0-9]* @localstatedir@/log/mail/ \ - 1>/dev/null 2>&1; - mv -f /var/log/mail.err @localstatedir@/log/mail/\ - 1>/dev/null 2>&1; - mv -f /var/log/mail.err.[0-9]* @localstatedir@/log/mail/ \ - 1>/dev/null 2>&1; - mv -f /var/log/mail.info @localstatedir@/log/mail/ \ - 1>/dev/null 2>&1; - mv -f /var/log/mail.info.[0-9]* @localstatedir@/log/mail/ \ - 1>/dev/null 2>&1; - mv -f /var/log/mail.warn @localstatedir@/log/mail/ \ - 1>/dev/null 2>&1; - mv -f /var/log/mail.warn.[0-9]* @localstatedir@/log/mail/ \ - 1>/dev/null 2>&1; - # Create link for compatility with logscan package - ln -sf @localstatedir@/log/mail/mail.log /var/log/mail.log; - fi; -# -# Support for sysklogd package -if [ -f /etc/syslog.conf ]; then - sed -e "s?/var/log/mail.log?@localstatedir@/log/mail/mail.log?g" \ - -e "s?/var/log/mail.err?@localstatedir@/log/mail/mail.err?g" \ - -e "s?/var/log/mail.info?@localstatedir@/log/mail/mail.info?g" \ - -e "s?/var/log/mail.warn?@localstatedir@/log/mail/mail.warn?g" \ - /etc/syslog.conf > /etc/syslog.conf.new; - chown root:root /etc/syslog.conf.new; - chmod 0644 /etc/syslog.conf.new; - mv /etc/syslog.conf.new /etc/syslog.conf; - /etc/init.d/sysklogd reload; - fi; -# -# Support for syslog-ng package -if [ -f /etc/syslog-ng/syslog-ng.conf ]; then - sed -e "s?/var/log/mail.log?@localstatedir@/log/mail/mail.log?g" \ - -e "s?/var/log/mail.err?@localstatedir@/log/mail/mail.err?g" \ - -e "s?/var/log/mail.info?@localstatedir@/log/mail/mail.info?g" \ - -e "s?/var/log/mail.warn?@localstatedir@/log/mail/mail.warn?g" \ - /etc/syslog-ng/syslog-ng.conf > \ - /etc/syslog-ng/syslog-ng.conf.new; - chown root:root /etc/syslog-ng/syslog-ng.conf.new; - chmod 0644 /etc/syslog-ng/syslog-ng.conf.new; - mv /etc/syslog-ng/syslog-ng.conf.new \ - /etc/syslog-ng/syslog-ng.conf; - /etc/init.d/syslog-ng reload; - if [ -f /etc/logrotate.d/syslog-ng ]; then - sed -e '/\/var\/log\/mail\..*/{:a;N;/}\n/!ba;d;}' \ - /etc/logrotate.d/syslog-ng > \ - /etc/logrotate.d/syslog-ng.new; - chown root:root /etc/logrotate.d/syslog-ng.new; - chmod 0644 /etc/logrotate.d/syslog-ng.new; - mv /etc/logrotate.d/syslog-ng.new \ - /etc/logrotate.d/syslog-ng; - true; - fi; - fi; +#----------------------------------------------------------------------------- +echo ' Done.'; #------------------------------------------------------------------------------ exit $changed; diff --git a/debian/local/update_tcpd b/debian/local/update_tcpd index e3b430a..ca19b79 100644 --- a/debian/local/update_tcpd +++ b/debian/local/update_tcpd @@ -15,9 +15,30 @@ set -e #------------------------------------------------------------------------------ # Check to see if sendmail is mentioned in /etc/hosts.allow -# Note: This check is far from perfect - it requires sendmail and : be -# on the same line. If you've got a better approach, I'd love to -# see it (Maybe awk/perl)! +# Note: This check is far from perfect - it requires sendmail and : be +# on the same line. If you've got a better approach, I'd love to +# see it (Maybe awk/perl)! + +# Path to other sendmail helpers +if [ -x ./update_sendmail ]; then + sm_path='.'; +elif [ -x $(dirname $0)/update_sendmail ]; then + sm_path=$(dirname $0); +else + sm_path=/usr/share/sendmail; + fi; +# Bring in sendmail.conf for the network definitions +if [ ! -f /etc/mail/sendmail.conf ]; then + if [ -x $sm_path/update_conf ]; then + $sm_path/update_conf; + fi; + fi; +if [ -f /etc/mail/sendmail.conf ]; then + . /etc/mail/sendmail.conf; + fi; +if [ "$HANDS_OFF" != 'No' ]; then + exit 0; + fi; if grep -qEe "^[^#:]*sendmail[^:]*[:]" /etc/hosts.allow 2>/dev/null; then need_tcpd=0 diff --git a/debian/local/update_tls.in b/debian/local/update_tls.in index 7d833fe..ea7345d 100644 --- a/debian/local/update_tls.in +++ b/debian/local/update_tls.in @@ -17,8 +17,9 @@ set -e; #--------------------------------------------------------------------------- HOSTNAME=`hostname -s`; DOMAINNAME=`hostname -d`; +MAILNAME=`cat /etc/mailname 2> /dev/null || hostname -f`; SSL_FQDN=`hostname -f`; -SSL_EMAIL="admin@${SSL_FQDN}"; +SSL_EMAIL="admin@${MAILNAME}"; export SSL_FQDN SSL_EMAIL; PROGRAM='sendmail'; CERT_DIR="@sysconfdir@/ssl/certs"; @@ -33,13 +34,34 @@ MSP_CRT="@sysconfdir@/mail/tls/$PROGRAM-client.crt"; NEW=0; REFD=0; +# Path to other sendmail helpers +if [ -x ./update_sendmail ]; then + sm_path='.'; +elif [ -x $(dirname $0)/update_sendmail ]; then + sm_path=$(dirname $0); +else + sm_path=@datadir@/sendmail; + fi; +# Bring in sendmail.conf for the network definitions +if [ ! -f @sysconfdir@/mail/sendmail.conf ]; then + if [ -x $sm_path/update_conf ]; then + $sm_path/update_conf; + fi; + fi; +if [ -f @sysconfdir@/mail/sendmail.conf ]; then + . @sysconfdir@/mail/sendmail.conf; + fi; +if [ "$HANDS_OFF" != 'No' ]; then + exit 0; + fi; + #--------------------------------------------------------------------------- # create_config: Function to create openssl configuration file #--------------------------------------------------------------------------- create_config () { cat >$MTA_CFG <<EOT [ ca ] -default_days = 365 +default_days = 3650 x509_extensions = X509v3 [ req ] default_bits = 1024 @@ -99,7 +121,9 @@ echo 'Creating/Updating SSL(for TLS) information'; # Process arguments #--------------------------------------------------------------------------- case "$1" in - [Nn][Ee][Ww]*) + [Nn][Ee][Ww]* | \ + [Rr][Ee][Nn][Ee][Ww]* | \ + [Rr][Ee][Ss][Ii][Nn][Gg]*) echo 'Removing any pre-existing sendmail certificates.'; if [ -x @bindir@/openssl ]; then if [ -f $MTA_CRT ]; then @@ -151,25 +175,15 @@ if [ -f @sysconfdir@/mail/sendmail.mc ]; then #--------------------------------------------------------------------------- # Make sure prototype /etc/mail/tls/starttls.m4 exists -if [ -L @sysconfdir@/mail/starttls.m4 ]; then - rm @sysconfdir@/mail/starttls.m4; - fi; -if [ -f @sysconfdir@/mail/starttls.m4 ]; then - mv @sysconfdir@/mail/starttls.m4 @sysconfdir@/mail/tls/starttls.m4; - fi; -if [ ! -f @sysconfdir@/mail/tls/starttls.m4 ]; then - NEW=1; - cp -a @datadir@/sendmail/cf/debian/starttls.m4 \ - @sysconfdir@/mail/tls/starttls.m4; - echo ' '; - echo 'Created template file @sysconfdir@/mail/tls/starttls.m4'; - echo 'Edit this file if you wish to change the default tls setup.'; - fi; +mkdir -p @sysconfdir@/mail/tls 2>/dev/null; +chown smmta:smmsp @sysconfdir@/mail/tls; +chmod 0755 @sysconfdir@/mail/tls; +$sm_path/update_tlsm4 || true; #--------------------------------------------------------------------------- # check for SSL if [ -d "$CERT_DIR" ]; then - if [ -f $MTA_CRT -a -f $MSP_CRT ]; then + if [ -f $MTA_CRT ] && [ -f $MSP_CRT ]; then echo 'You already have sendmail certificates'; echo ' '; chown root:smmsp $COM_KEY; @@ -223,14 +237,14 @@ if [ -d "$CERT_DIR" ]; then # Create shared DSA/DH password parameters # Skip this for now... if [ ! -f $COM_PRM ]; then - #openssl dsaparam 1024 -out $COM_PRM; + #openssl dsaparam 2048 -out $COM_PRM; #openssl dhparam -dsaparam -in $COM_PRM >> $COM_PRM; touch $COM_PRM; chmod 0600 $COM_PRM; fi; # Create shared DSA/RSA key (RSA preferred for browser support) if [ ! -f $COM_KEY ]; then - openssl genrsa -out $COM_KEY 1024; + openssl genrsa -out $COM_KEY 2048; #openssl gendsa -out $COM_KEY $COM_PRM; chown root:smmsp $COM_KEY; chmod 0640 $COM_KEY; @@ -250,7 +264,7 @@ if [ -d "$CERT_DIR" ]; then chmod 0600 $MTA_CSR; openssl x509 -req -extfile $MTA_CFG \ -signkey $COM_KEY -in $MTA_CSR \ - -out $MTA_CRT -days 365 \ + -out $MTA_CRT -days 3650 \ >/dev/null 2>&1; chown root:smmsp $MTA_CRT; chmod 0644 $MTA_CRT; @@ -262,7 +276,7 @@ if [ -d "$CERT_DIR" ]; then chmod 0600 $MSP_CSR; openssl x509 -req -extfile $MSP_CFG \ -signkey $COM_KEY -in $MSP_CSR \ - -out $MSP_CRT -days 365 \ + -out $MSP_CRT -days 3650 \ >/dev/null 2>&1; chown root:smmsp $MSP_CRT; chmod 0644 $MSP_CRT; diff --git a/debian/local/update_tlsm4.in b/debian/local/update_tlsm4.in new file mode 100644 index 0000000..a2951c4 --- /dev/null +++ b/debian/local/update_tlsm4.in @@ -0,0 +1,248 @@ +#!/usr/bin/perl -w +#------------------------------------------------------------------------ +# +# $Sendmail: update_tls,v @sm_version@ @sm_date@ @sm_time@ cowboy Exp $ +# +# Create @sysconfdir@/mail/tls/starttls.m4 for Debian Sendmail +# +# Copyright 1998-@SM_CPYRT@ Richard Nelson. All Rights Reserved. +# +# Notes (to all): +# * +# +# Notes (to self): +# * +# +#------------------------------------------------------------------------ +# +# Initialization of the perl environment +use strict; # be kosher +use Cwd; # provide cwd() +use Env; # A few environmental references +use integer; # Peformance +use Sys::Hostname; # make sure we have a valid hostname +use Getopt::Long; # parameter handling + +# Local libraries - for Debian Sendmail Perl helper functions +# BEGIN { $main::my_path = substr($0,$[,rindex($0,'/')) }; +use lib ('.', substr($0,$[,rindex($0,'/')), "@datadir@/sendmail"); +require Parse_mc; + +# Version of this program +#($main::MYNAME = $main::0) =~ s|.*/||; +#$main::Author = "Richard Nelson"; +#$main::AuthorMail = "cowboy\@debian.org"; +#$main::Version = '$Revision: 2.00 $ '; +$main::program_name = $0; +$main::program_version = '@sm_version@'; +$main::program_date = '@sm_date@ @sm_time@ cowboy'; +$main::debug = 0; + +my $interp_pgm = "$^X"; +my $interp_vrm = $]; +$interp_vrm = ("$^V" | '000') if (defined $^V); +my $current_time = scalar localtime; +my $user = getlogin || (getpwuid($<))[0] || "Unknown!!"; +my $hostname = hostname(); +my $directory = getcwd(); + +my $Starttls_def = "@sysconfdir@/mail/tls/starttls.m4"; + +# Hash of define names to filename +my %Def_Map; + +# +#------------------------------------------------------------------------------ +# Finally, some code (almost) +#------------------------------------------------------------------------------ +# +# Argument handling... +$main::opt_help=''; +$main::opt_output_file=''; +$main::opt_input_file=''; +$main::opt_debug=''; +my @options = qw( + help|h + output-file|output_file|o:s + input-file|input_file|i:s + debug! + ); +my $result = GetOptions(@options); +if ( ! $result ) { + die "Terminating due to parameter error"; + }; +if ( $main::opt_help ) { + warn "$main::program_name $main::program_version $main::program_date\n"; + warn "$0 \n"; + warn " -help\n" if $main::opt_help; + warn " -debug\n" if $main::opt_debug; + warn " -o $main::opt_output_file\n" if $main::opt_output_file; + warn " -i $main::opt_input_file\n" if $main::opt_input_file; + exit 0; + }; + +my $Starttls = $main::opt_output_file || $Starttls_def; +${Parse_mc::database_file} = $main::opt_input_file + if $main::opt_input_file; +# $main::debug is used in Parse_mc ! +$main::debug = $main::opt_debug || $main::debug; + +# Let them know wtf is going on... +print STDOUT "Creating ${Starttls}...\n"; + +# Read the mc/m4 files +&Parse_mc::read_dbs($Parse_mc::database_file, ''); + +# Obtain Starttls information from database +&get_data; + +# Write out the textual representation +&write_starttls; + + +# +#------------------------------------------------------------------------------ +# Obtain information from database +#------------------------------------------------------------------------------ +sub get_data { + my @names = ( + 'confTO_STARTTLS' + ,'confCACERT' + ,'confCACERT_PATH' + ,'confCRL' + ,'confCLIENT_CERT' + ,'confCLIENT_KEY' + ,'confSERVER_CERT' + ,'confSERVER_KEY' + ,'confTLS_SRV_OPTIONS' + ); + + foreach my $entry (@names) { + my ($class, $flags, $files, $options) = + &Parse_mc::entry_dbs($entry); + my $file = @{$files}[0]; + $Def_Map{$entry} = ''; + $Def_Map{$entry} = $file if ($file ne '-'); + #$Def_Map{$entry} = &Parse_mc::format_dbs($entry); + }; + }; + + +# +#------------------------------------------------------------------------------ +# Create @sysconfdir@/mail/tls/starttls.m4 +#------------------------------------------------------------------------------ +sub write_starttls { + my $ofh = new FileHandle; + + $Starttls = '&STDOUT' if ($Starttls eq '-'); + unless ( open($ofh, ">$Starttls") ) { + warn("Could not open $Starttls($!), using STDOUT.\n"); + open($ofh, ">&STDOUT"); + }; + $Starttls = '-' if ($Starttls eq '&STDOUT'); + + &write_m4($ofh); + + close $ofh; + if ($Starttls eq $Starttls_def) { + chown '0', '0', $Starttls; + chmod 0744, $Starttls; + }; + }; + + +# +#------------------------------------------------------------------------------ +# Write Starttls m4 file +#------------------------------------------------------------------------------ +sub write_m4 { + my ($ofh) = @_; + + print $ofh <<"EOT"; +divert(-1)dnl +#################################################################### +##### This file is automagically generated -- edit at your own risk +##### +##### Copyright (c) 2002-@SM_CPYRT@ Richard Nelson. All Rights Reserved. +##### +##### file: ${Starttls} +##### STARTTLS Configuration for Debian Sendmail +##### generated via: (${interp_pgm} ${interp_vrm}) +##### ${main::program_name} +##### version: ${main::program_version} ${main::program_date} +##### by: ${user}\@${hostname} +##### on: ${current_time} +##### in: ${directory} +##### input files: ${Parse_mc::database_file} +##### +##### Usage: +##### 1) To get *ANY* STARTTLS support for sendmail you +##### A) *MUST* Add this line to @sysconfdir@/mail/sendmail.mc +##### \`include(\`@sysconfdir@/mail/tls/starttls.m4\')dnl\' +##### B) *MAY* Add the same line to @sysconfdir@/mail/submit.mc +##### to get MSP<->MTA authentication/encryption +##### 2) You may modify the marked portions of this file, those +##### deal with the cert/key filenames and TLS options. +##### If you need finer control of TLS options, use the access +##### database. +##### +#################################################################### +divert(0)dnl +VERSIONID(\`\$Id: starttls.m4,v @sm_version@@sm_revision@ @sm_date@ @sm_time@ cowboy Exp \$\') +dnl # +dnl #--------------------------------------------------------------------- +dnl # Bring in Autoconf results +dnl #--------------------------------------------------------------------- +ifdef(\`sm_version\', \`dnl\', +\`include(\`@datadir@/sendmail/cf/debian/autoconf.m4\')dnl\') +dnl # +dnl # Check to see if inclusion is valid (version >= 8.11.0, tls enabled) +ifelse(eval(sm_version_math >= 527104), \`1\', \`dnl +ifelse(sm_enable_tls, \`yes\', \`dnl +dnl # +dnl # To support shared keyfiles, we need them to be group readable +dnl # +define(\`confDONT_BLAME_SENDMAIL\',dnl + defn(\`confDONT_BLAME_SENDMAIL\')\`,GroupReadableKeyFile\')dnl +dnl # +dnl # ...Do not touch anything above this line... +dnl # +dnl # Set a more reasonable timeout on negotiation +dnl # +define(\`confTO_STARTTLS\', \`$Def_Map{'confTO_STARTTLS'}\')dnl # <= EDIT +dnl # +dnl # CA directory - CA certs should be herein +define(\`confCACERT_PATH\', \`$Def_Map{'confCACERT_PATH'}\')dnl # <= EDIT +dnl # +dnl # CA file (may be the same as client/server certificate) +define(\`confCACERT\', \`$Def_Map{'confCACERT'}\')dnl # <= EDIT +dnl # +dnl # Certificate Revocation List +define(\`confCRL\', \`$Def_Map{'confCRL'}\')dnl # <= EDIT +EOT +if (! -f $Def_Map{'confCRL'}) { +print $ofh <<"EOT"; +dnl # CRL not found... do not issue warnings on it! +undefine(\`confCRL\')dnl +EOT + }; + print $ofh <<"EOT"; +dnl # +dnl # Server certificate/key (can be in the same file, and shared w/client) +dnl # NOTE: The key must *NOT* be encrypted !!! +define(\`confSERVER_CERT\', \`$Def_Map{'confSERVER_CERT'}\')dnl # <= EDIT +define(\`confSERVER_KEY\', \`$Def_Map{'confSERVER_KEY'}\')dnl # <= EDIT +dnl # +dnl # Client certificate/key (can be in the same file, and shared w/server) +dnl # NOTE: The key must *NOT* be encrypted !!! +define(\`confCLIENT_CERT\', \`$Def_Map{'confCLIENT_CERT'}\')dnl # <= EDIT +define(\`confCLIENT_KEY\', \`$Def_Map{'confCLIENT_KEY'}\')dnl # <= EDIT +dnl # +dnl # Optional settings +define(\`confTLS_SRV_OPTIONS\', \`$Def_Map{'confTLS_SRV_OPTIONS'}\')dnl # <= EDIT +dnl # +\')\')dnl +EOT + }; + diff --git a/debian/ownertrust b/debian/ownertrust new file mode 100644 index 0000000..8b418bb --- /dev/null +++ b/debian/ownertrust @@ -0,0 +1,5 @@ +# List of assigned trustvalues, created Wed Sep 4 15:22:15 2002 EDT +# (Use "gpg --import-ownertrust" to restore them) +9D3583BC28718C0A058A89E77371068600000000:6: +684A1F8DC9BBE0DFF3168C9F015427E3A4B47676:5: +99ECD122A8D84271AB54E94AD949C12800000000:5: diff --git a/debian/patches/8.12/8.12.3/CAN-2003-0681.patch b/debian/patches/8.12/8.12.3/CAN-2003-0681.patch deleted file mode 100644 index de31a60..0000000 --- a/debian/patches/8.12/8.12.3/CAN-2003-0681.patch +++ /dev/null @@ -1,87 +0,0 @@ -Index: parseaddr.c -=================================================================== -RCS file: /cvs/sendmail/parseaddr.c,v -retrieving revision 8.359.2.6 -diff -u -r8.359.2.6 parseaddr.c ---- parseaddr.c 27 Mar 2003 02:39:53 -0000 8.359.2.6 -+++ sendmail-8.12.3/sendmail/parseaddr.c 30 Mar 2003 16:41:50 -0000 -@@ -1000,6 +1008,8 @@ - } - if (pvp == NULL) - return EX_USAGE; -+ if (maxatom <= 0) -+ return EX_USAGE; - - /* - ** Run through the list of rewrite rules, applying -@@ -1866,6 +1880,7 @@ - register ENVELOPE *e; - { - bool tempfail = false; -+ int maxatom; - struct mailer **mp; - register struct mailer *m; - register char *p; -@@ -1880,6 +1895,7 @@ - printav(tv); - } - -+ maxatom = MAXATOM; - if (a == NULL) - a = (ADDRESS *) sm_rpool_malloc_x(e->e_rpool, sizeof *a); - memset((char *) a, '\0', sizeof *a); -@@ -1919,14 +1935,22 @@ - return a; - } - mname = *++tv; -+ --maxatom; - - /* extract host and user portions */ - if (*++tv != NULL && (**tv & 0377) == CANONHOST) -+ { - hostp = ++tv; -+ --maxatom; -+ } - else - hostp = NULL; -+ --maxatom; - while (*tv != NULL && (**tv & 0377) != CANONUSER) -+ { - tv++; -+ --maxatom; -+ } - if (*tv == NULL) - { - syserr("554 5.3.5 buildaddr: no user"); -@@ -1937,6 +1961,7 @@ - else if (hostp != NULL) - cataddr(hostp, tv - 1, hbuf, sizeof hbuf, '\0'); - cataddr(++tv, NULL, ubuf, sizeof ubuf, ' '); -+ --maxatom; - - /* save away the host name */ - if (sm_strcasecmp(mname, "error") == 0) -@@ -2041,6 +2066,7 @@ - { - p++; - tv++; -+ --maxatom; - a->q_flags |= QNOTREMOTE; - } - -@@ -2071,11 +2097,11 @@ - !bitset(RF_SENDERADDR|RF_HEADERADDR, flags)) - { - /* sender addresses done later */ -- (void) REWRITE(tv, 2, e); -+ (void) rewrite(tv, 2, 0, e, maxatom); - if (m->m_re_rwset > 0) -- (void) REWRITE(tv, m->m_re_rwset, e); -+ (void) rewrite(tv, m->m_re_rwset, 0, e, maxatom); - } -- (void) REWRITE(tv, 4, e); -+ (void) rewrite(tv, 4, 0, e, maxatom); - - /* save the result for the command line/RCPT argument */ - cataddr(tv, NULL, ubuf, sizeof ubuf, '\0'); - diff --git a/debian/patches/8.12/8.12.3/CAN-2003-0694.patch b/debian/patches/8.12/8.12.3/CAN-2003-0694.patch deleted file mode 100644 index bdba504..0000000 --- a/debian/patches/8.12/8.12.3/CAN-2003-0694.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff -ru build-tree.orig/sendmail-8.12.3/sendmail/parseaddr.c build-tree/sendmail-8.12.3/sendmail/parseaddr.c ---- build-tree.orig/sendmail-8.12.3/sendmail/parseaddr.c 2003-09-17 10:43:53.000000000 -0400 -+++ sendmail-8.12.3/sendmail/parseaddr.c 2003-09-17 10:45:06.000000000 -0400 -@@ -700,7 +700,11 @@ - addr[MAXNAME] = '\0'; - returnnull: - if (delimptr != NULL) -+ { -+ if (p > addr) -+ p--; - *delimptr = p; -+ } - CurEnv->e_to = saveto; - return NULL; - } diff --git a/debian/patches/8.12/8.12.3/bf.c.8.51 b/debian/patches/8.12/8.12.3/bf.c.8.51 deleted file mode 100644 index fec8d59..0000000 --- a/debian/patches/8.12/8.12.3/bf.c.8.51 +++ /dev/null @@ -1,30 +0,0 @@ -Index: sendmail/bf.c -diff -u sendmail/bf.c:8.51 sendmail/bf.c:8.52 ---- sendmail/bf.c:8.51 Mon Mar 4 13:51:25 2002 -+++ ./sendmail-8.12.3/sendmail/bf.c Thu Apr 11 14:00:15 2002 -@@ -202,12 +202,24 @@ - ** any value of errno specified by sm_io_setinfo() - */ - -+#ifdef __STDC__ -+/* -+** XXX This is a temporary hack since MODE_T on HP-UX 10.x is short. -+** If we use K&R here, the compiler will complain about -+** Inconsistent parameter list declaration -+** due to the change from short to int. -+*/ -+ - SM_FILE_T * -+bfopen(char *filename, MODE_T fmode, size_t bsize, long flags) -+#else /* __STDC__ */ -+SM_FILE_T * - bfopen(filename, fmode, bsize, flags) - char *filename; - MODE_T fmode; - size_t bsize; - long flags; -+#endif /* __STDC__ */ - { - MODE_T omask; - SM_FILE_T SM_IO_SET_TYPE(vector, BF_FILE_TYPE, sm_bfopen, sm_bfclose, - diff --git a/debian/patches/8.12/8.12.3/domain.c.8.181 b/debian/patches/8.12/8.12.3/domain.c.8.181 deleted file mode 100644 index da6a59f..0000000 --- a/debian/patches/8.12/8.12.3/domain.c.8.181 +++ /dev/null @@ -1,16 +0,0 @@ -Index: domain.c -=================================================================== -RCS file: /cvs/sendmail/domain.c,v -retrieving revision 8.181 -diff -u -r8.181 domain.c ---- domain.c 2002/05/24 23:48:42 8.181 -+++ ./sendmail-8.12.3/sendmail/domain.c 2002/06/27 15:45:27 -@@ -737,7 +737,7 @@ - #endif /* _FFR_BESTMX_BETTER_TRUNCATION */ - - _res.options &= ~(RES_DNSRCH|RES_DEFNAMES); -- nmx = getmxrr(name, mxhosts, NULL, false, statp, true, NULL); -+ nmx = getmxrr(name, mxhosts, NULL, false, statp, false, NULL); - _res.options = saveopts; - if (nmx <= 0) - return NULL; diff --git a/debian/patches/8.12/8.12.3/dsa-doublebounce.patch b/debian/patches/8.12/8.12.3/dsa-doublebounce.patch deleted file mode 100644 index f920d0a..0000000 --- a/debian/patches/8.12/8.12.3/dsa-doublebounce.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff -u doublebounce.pl.old doublebounce.pl ---- doublebounce.pl.old Sun Feb 7 05:44:09 1999 -+++ ./sendmail-8.12.3/contrib/doublebounce.pl Mon Apr 14 08:46:02 2003 -@@ -26,6 +26,7 @@ - - - use Socket; -+use Fcntl; - - # look for debug flag - # -@@ -45,7 +46,7 @@ - # I thought about reading it into a buffer here, but some messages - # are 10+Mb so a buffer may not be a good idea - # --if (! open(MSG, "+> $tmp")) { -+if (! sysopen(MSG, "$tmp", O_RDWR|O_CREAT|O_EXCL, 0600)) { - # can't open temp file -- send message to local postmaster - # open(MAIL, "| /usr/sbin/sendmail -oeq postmaster"); - print MAIL <STDIN>; diff --git a/debian/patches/8.12/8.12.3/dsa-expn.patch b/debian/patches/8.12/8.12.3/dsa-expn.patch deleted file mode 100644 index c24bfaa..0000000 --- a/debian/patches/8.12/8.12.3/dsa-expn.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff -u expn.old expn ---- expn.old Sat Apr 5 00:07:36 2003 -+++ ./sendmail-8.12.3/contrib/expn.pl Mon Apr 14 08:37:41 2003 -@@ -8,6 +8,7 @@ - - use 5.001; - use IO::Socket; -+use Fcntl; - - # system requirements: - # must have 'nslookup' and 'hostname' programs. -@@ -999,7 +1000,7 @@ - } - - $0 = "$av0 - nslookup of $server"; -- open(T,">/tmp/expn$$") || die "open > /tmp/expn$$: $!\n"; -+ sysopen(T,"/tmp/expn$$",O_RDWR|O_CREAT|O_EXCL,0600) || die "open > /tmp/expn$$: $!\n"; - print T "set querytype=MX\n"; - print T "$server\n"; - close(T); diff --git a/debian/patches/8.12/8.12.3/main.c.8.876 b/debian/patches/8.12/8.12.3/main.c.8.876 deleted file mode 100644 index 9be7994..0000000 --- a/debian/patches/8.12/8.12.3/main.c.8.876 +++ /dev/null @@ -1,17 +0,0 @@ -Index: main.c -=================================================================== -RCS file: /cvs/sendmail/main.c,v -retrieving revision 8.876 -diff -u -r8.876 main.c ---- ./sendmail-8.12.3/sendmail/main.c 2002/02/27 23:49:52 8.876 -+++ main.c 2002/04/10 23:59:28 -@@ -726,6 +726,8 @@ - (void) sm_signal(SIGPIPE, SIG_IGN); - OldUmask = umask(022); - FullName = getextenv("NAME"); -+ if (FullName != NULL) -+ FullName = newstr(FullName); - - /* - ** Initialize name server if it is going to be used. - diff --git a/debian/patches/8.12/8.12.3/patch.milter.replbody b/debian/patches/8.12/8.12.3/patch.milter.replbody deleted file mode 100644 index 6321210..0000000 --- a/debian/patches/8.12/8.12.3/patch.milter.replbody +++ /dev/null @@ -1,63 +0,0 @@ -Index: sendmail/bf.c -diff -u sendmail/bf.c:8.52 sendmail/bf.c:8.53 ---- sendmail/bf.c:8.52 Thu Apr 11 14:00:15 2002 -+++ ./sendmail-8.12.3/sendmail/bf.c Sat Apr 13 20:55:07 2002 -@@ -795,11 +795,12 @@ - errno = EINVAL; - return -1; - #else /* NOFTRUNCATE */ -+ if (lseek(bfp->bf_disk_fd, 0, SEEK_SET) < 0) -+ return -1; - return ftruncate(bfp->bf_disk_fd, 0); - #endif /* NOFTRUNCATE */ - } -- else -- return 0; -+ return 0; - } - - /* - ------------------------------------- -Index: sendmail/milter.c -diff -u sendmail/milter.c:8.195 sendmail/milter.c:8.196 ---- sendmail/milter.c:8.195 Thu Apr 11 10:30:29 2002 -+++ ./sendmail-8.12.3/sendmail/milter.c Sat Apr 13 20:55:07 2002 -@@ -2903,8 +2903,6 @@ - { - int err; - --# if NOFTRUNCATE -- /* XXX: Not much we can do except rewind it */ - err = sm_io_error(e->e_dfp); - (void) sm_io_flush(e->e_dfp, SM_TIME_DEFAULT); - -@@ -2920,16 +2918,26 @@ - /* errno is set implicitly by fseek() before return */ - err = sm_io_seek(e->e_dfp, SM_TIME_DEFAULT, - 0, SEEK_SET); -+ if (err < 0) -+ { -+ MILTER_DF_ERROR("milter_replbody: sm_io_seek %s: %s"); -+ return -1; -+ } -+# if NOFTRUNCATE -+ /* XXX: Not much we can do except rewind it */ -+ errno = EINVAL; -+ MILTER_DF_ERROR("milter_replbody: ftruncate not available on this platform (%s:%s)"); -+ return -1; - # else /* NOFTRUNCATE */ - err = ftruncate(sm_io_getinfo(e->e_dfp, - SM_IO_WHAT_FD, NULL), - 0); --# endif /* NOFTRUNCATE */ - if (err < 0) - { - MILTER_DF_ERROR("milter_replbody: sm_io ftruncate %s: %s"); - return -1; - } -+# endif /* NOFTRUNCATE */ - } - - if (prevsize > e->e_msgsize) - diff --git a/debian/patches/8.12/8.12.3/proto.m4.8.646 b/debian/patches/8.12/8.12.3/proto.m4.8.646 deleted file mode 100644 index 395cbb0..0000000 --- a/debian/patches/8.12/8.12.3/proto.m4.8.646 +++ /dev/null @@ -1,11 +0,0 @@ ---- proto.m4- Thu Nov 14 17:01:56 2002 -+++ ./sendmail-8.12.3/cf/m4/proto.m4 Thu Nov 14 17:02:19 2002 -@@ -2228,7 +2228,7 @@ - dnl ${client_resolve} should be OK, so go ahead - R$* $: <@> $&{client_name} - dnl should not be necessary since it has been done for client_addr already --R<@> $@ RELAY -+#R<@> $@ RELAY - dnl workspace: <@> ${client_name} (not empty) - # pass to name server to make hostname canonical - R<@> $* $=P $:<?> $1 $2 diff --git a/debian/patches/8.12/8.12.3/proto.m4.8.649.2.13 b/debian/patches/8.12/8.12.3/proto.m4.8.649.2.13 deleted file mode 100644 index 2c3a283..0000000 --- a/debian/patches/8.12/8.12.3/proto.m4.8.649.2.13 +++ /dev/null @@ -1,18 +0,0 @@ -Index: proto.m4 -=================================================================== -RCS file: /cvs/cf/m4/proto.m4,v -retrieving revision 8.649.2.12 -retrieving revision 8.649.2.13 -diff -u -r8.649.2.12 -r8.649.2.13 ---- proto.m4 3 Dec 2002 16:48:37 -0000 8.649.2.12 -+++ ./sendmail-8.12.3/cf/m4/proto.m4 4 Dec 2002 00:12:18 -0000 8.649.2.13 -@@ -1761,6 +1761,9 @@ - dnl workspace: {client_name} $| {client_addr} - R$+ $| $+ $: $>D < $1 > <?> <+ Connect> < $2 > - dnl workspace: <result-of-lookup> <{client_addr}> -+dnl OR $| $+ if client_name is empty -+R $| $+ $: $>A < $1 > <?> <+ Connect> <> empty client_name -+dnl workspace: <result-of-lookup> <{client_addr}> - R<?> <$+> $: $>A < $1 > <?> <+ Connect> <> no: another lookup - dnl workspace: <result-of-lookup> (<>|<{client_addr}>) - R<?> <$*> $: OK found nothing diff --git a/debian/patches/8.12/8.12.3/recipient.c.8.330.2.1 b/debian/patches/8.12/8.12.3/recipient.c.8.330.2.1 deleted file mode 100644 index 10516b0..0000000 --- a/debian/patches/8.12/8.12.3/recipient.c.8.330.2.1 +++ /dev/null @@ -1,17 +0,0 @@ -Index: recipient.c -=================================================================== -RCS file: /cvs/sendmail/recipient.c,v -retrieving revision 8.330 -retrieving revision 8.330.2.1 -diff -u -r8.330 -r8.330.2.1 ---- ./sendmail-8.12.3/sendmail/recipient.c 29 May 2002 18:20:03 -0000 8.330 -+++ recipient.c 27 Aug 2002 20:21:02 -0000 8.330.2.1 -@@ -679,7 +679,7 @@ - ** the current recipient is marked expensive. - */ - -- if (WILL_BE_QUEUED(e->e_sendmode) || -+ if (UseMSP || WILL_BE_QUEUED(e->e_sendmode) || - (!bitset(EF_SPLIT, e->e_flags) && e->e_ntries == 0 && - FastSplit > 0)) - sortfn = sorthost; diff --git a/debian/patches/8.12/8.12.3/security.parsaddr b/debian/patches/8.12/8.12.3/security.parsaddr deleted file mode 100644 index 90daf45..0000000 --- a/debian/patches/8.12/8.12.3/security.parsaddr +++ /dev/null @@ -1,58 +0,0 @@ -diff -u -Nur --exclude CVS sendmail-8.12.3.orig/sendmail/parseaddr.c sendmail-8.12.3/sendmail/parseaddr.c ---- sendmail-8.12.3.orig/sendmail/parseaddr.c 2003-04-01 20:52:13.000000000 +0200 -+++ sendmail-8.12.3/sendmail/parseaddr.c 2003-04-04 15:59:07.000000000 +0200 -@@ -608,7 +608,7 @@ - }; - - --#define NOCHAR -1 /* signal nothing in lookahead token */ -+#define NOCHAR (-1) /* signal nothing in lookahead token */ - - char ** - prescan(addr, delim, pvpbuf, pvpbsize, delimptr, toktab) -@@ -694,6 +694,7 @@ - /* see if there is room */ - if (q >= &pvpbuf[pvpbsize - 5]) - { -+ addrtoolong: - usrerr("553 5.1.1 Address too long"); - if (strlen(addr) > MAXNAME) - addr[MAXNAME] = '\0'; -@@ -705,11 +706,15 @@ - } - - /* squirrel it away */ -+#if !ALLOW_255 -+ if ((char) c == (char) -1 && !tTd(82, 101)) -+ c &= 0x7f; -+#endif /* !ALLOW_255 */ - *q++ = c; - } - - /* read a new input character */ -- c = *p++; -+ c = (unsigned char)*p++; - if (c == '\0') - { - /* diagnose and patch up bad syntax */ -@@ -764,6 +769,9 @@ - } - else if (c != '!' || state == QST) - { -+ /* see if there is room */ -+ if (q >= &pvpbuf[pvpbsize - 5]) -+ goto addrtoolong; - *q++ = '\\'; - continue; - } -@@ -849,6 +857,10 @@ - /* new token */ - if (tok != q) - { -+ /* see if there is room */ -+ if (q >= &pvpbuf[pvpbsize - 5]) -+ goto addrtoolong; -+ - *q++ = '\0'; - if (tTd(22, 36)) - { diff --git a/debian/patches/8.12/8.12.3/sendmail.8.12.security.cr.patch b/debian/patches/8.12/8.12.3/sendmail.8.12.security.cr.patch deleted file mode 100644 index 0e62081..0000000 --- a/debian/patches/8.12/8.12.3/sendmail.8.12.security.cr.patch +++ /dev/null @@ -1,462 +0,0 @@ ---- sendmail/headers.c 13 Jan 2003 19:30:28 -0000 8.266.4.3 -+++ ./sendmail-8.12.3/sendmail/headers.c 16 Jan 2003 23:31:17 -0000 -@@ -676,8 +676,8 @@ - if (buf[0] != '\0') - { - if (bitset(H_FROM, h->h_flags)) -- expand(crackaddr(buf), buf, sizeof buf, -- e); -+ expand(crackaddr(buf, e), -+ buf, sizeof buf, e); - h->h_value = sm_rpool_strdup_x(e->e_rpool, buf); - h->h_flags &= ~H_DEFAULT; - } -@@ -998,7 +998,11 @@ - ** it and replaces it with "$g". The parse is totally ad hoc - ** and isn't even guaranteed to leave something syntactically - ** identical to what it started with. However, it does leave --** something semantically identical. -+** something semantically identical if possible, else at least -+** syntactically correct. -+** -+** For example, it changes "Real Name <real@example.com> (Comment)" -+** to "Real Name <$g> (Comment)". - ** - ** This algorithm has been cleaned up to handle a wider range - ** of cases -- notably quoted and backslash escaped strings. -@@ -1007,6 +1011,7 @@ - ** - ** Parameters: - ** addr -- the address to be cracked. -+** e -- the current envelope. - ** - ** Returns: - ** a pointer to the new version. -@@ -1019,28 +1024,50 @@ - ** be copied if it is to be reused. - */ - -+#define SM_HAVE_ROOM ((bp < buflim) && (buflim <= bufend)) -+ -+/* -+** Append a character to bp if we have room. -+** If not, punt and return $g. -+*/ -+ -+#define SM_APPEND_CHAR(c) \ -+ do \ -+ { \ -+ if (SM_HAVE_ROOM) \ -+ *bp++ = (c); \ -+ else \ -+ goto returng; \ -+ } while (0) -+ -+#if MAXNAME < 10 -+ERROR MAXNAME must be at least 10 -+#endif /* MAXNAME < 10 */ -+ - char * --crackaddr(addr) -+crackaddr(addr, e) - register char *addr; -+ ENVELOPE *e; - { - register char *p; - register char c; -- int cmtlev; -- int realcmtlev; -- int anglelev, realanglelev; -- int copylev; -- int bracklev; -- bool qmode; -- bool realqmode; -- bool skipping; -- bool putgmac = false; -- bool quoteit = false; -- bool gotangle = false; -- bool gotcolon = false; -+ int cmtlev; /* comment level in input string */ -+ int realcmtlev; /* comment level in output string */ -+ int anglelev; /* angle level in input string */ -+ int copylev; /* 0 == in address, >0 copying */ -+ int bracklev; /* bracket level for IPv6 addr check */ -+ bool addangle; /* put closing angle in output */ -+ bool qmode; /* quoting in original string? */ -+ bool realqmode; /* quoting in output string? */ -+ bool putgmac = false; /* already wrote $g */ -+ bool quoteit = false; /* need to quote next character */ -+ bool gotangle = false; /* found first '<' */ -+ bool gotcolon = false; /* found a ':' */ - register char *bp; - char *buflim; - char *bufhead; - char *addrhead; -+ char *bufend; - static char buf[MAXNAME + 1]; - - if (tTd(33, 1)) -@@ -1055,25 +1082,22 @@ - ** adjusted later if we find them. - */ - -+ buflim = bufend = &buf[sizeof(buf) - 1]; - bp = bufhead = buf; -- buflim = &buf[sizeof buf - 7]; - p = addrhead = addr; -- copylev = anglelev = realanglelev = cmtlev = realcmtlev = 0; -+ copylev = anglelev = cmtlev = realcmtlev = 0; - bracklev = 0; -- qmode = realqmode = false; -+ qmode = realqmode = addangle = false; - - while ((c = *p++) != '\0') - { - /* -- ** If the buffer is overful, go into a special "skipping" -- ** mode that tries to keep legal syntax but doesn't actually -- ** output things. -+ ** Try to keep legal syntax using spare buffer space -+ ** (maintained by buflim). - */ - -- skipping = bp >= buflim; -- -- if (copylev > 0 && !skipping) -- *bp++ = c; -+ if (copylev > 0) -+ SM_APPEND_CHAR(c); - - /* check for backslash escapes */ - if (c == '\\') -@@ -1088,8 +1112,8 @@ - p--; - goto putg; - } -- if (copylev > 0 && !skipping) -- *bp++ = c; -+ if (copylev > 0) -+ SM_APPEND_CHAR(c); - goto putg; - } - -@@ -1097,8 +1121,14 @@ - if (c == '"' && cmtlev <= 0) - { - qmode = !qmode; -- if (copylev > 0 && !skipping) -+ if (copylev > 0 && SM_HAVE_ROOM) -+ { -+ if (realqmode) -+ buflim--; -+ else -+ buflim++; - realqmode = !realqmode; -+ } - continue; - } - if (qmode) -@@ -1110,15 +1140,15 @@ - cmtlev++; - - /* allow space for closing paren */ -- if (!skipping) -+ if (SM_HAVE_ROOM) - { - buflim--; - realcmtlev++; - if (copylev++ <= 0) - { - if (bp != bufhead) -- *bp++ = ' '; -- *bp++ = c; -+ SM_APPEND_CHAR(' '); -+ SM_APPEND_CHAR(c); - } - } - } -@@ -1128,7 +1158,7 @@ - { - cmtlev--; - copylev--; -- if (!skipping) -+ if (SM_HAVE_ROOM) - { - realcmtlev--; - buflim++; -@@ -1139,7 +1169,7 @@ - else if (c == ')') - { - /* syntax error: unmatched ) */ -- if (copylev > 0 && !skipping) -+ if (copylev > 0 && SM_HAVE_ROOM) - bp--; - } - -@@ -1157,7 +1187,7 @@ - - /* - ** Check for DECnet phase IV ``::'' (host::user) -- ** or ** DECnet phase V ``:.'' syntaxes. The latter -+ ** or DECnet phase V ``:.'' syntaxes. The latter - ** covers ``user@DEC:.tay.myhost'' and - ** ``DEC:.tay.myhost::user'' syntaxes (bletch). - */ -@@ -1166,10 +1196,10 @@ - { - if (cmtlev <= 0 && !qmode) - quoteit = true; -- if (copylev > 0 && !skipping) -+ if (copylev > 0) - { -- *bp++ = c; -- *bp++ = *p; -+ SM_APPEND_CHAR(c); -+ SM_APPEND_CHAR(*p); - } - p++; - goto putg; -@@ -1180,41 +1210,43 @@ - bp = bufhead; - if (quoteit) - { -- *bp++ = '"'; -+ SM_APPEND_CHAR('"'); - - /* back up over the ':' and any spaces */ - --p; -- while (isascii(*--p) && isspace(*p)) -+ while (p > addr && -+ isascii(*--p) && isspace(*p)) - continue; - p++; - } - for (q = addrhead; q < p; ) - { - c = *q++; -- if (bp < buflim) -+ if (quoteit && c == '"') - { -- if (quoteit && c == '"') -- *bp++ = '\\'; -- *bp++ = c; -+ SM_APPEND_CHAR('\\'); -+ SM_APPEND_CHAR(c); - } -+ else -+ SM_APPEND_CHAR(c); - } - if (quoteit) - { - if (bp == &bufhead[1]) - bp--; - else -- *bp++ = '"'; -+ SM_APPEND_CHAR('"'); - while ((c = *p++) != ':') -- { -- if (bp < buflim) -- *bp++ = c; -- } -- *bp++ = c; -+ SM_APPEND_CHAR(c); -+ SM_APPEND_CHAR(c); - } - - /* any trailing white space is part of group: */ -- while (isascii(*p) && isspace(*p) && bp < buflim) -- *bp++ = *p++; -+ while (isascii(*p) && isspace(*p)) -+ { -+ SM_APPEND_CHAR(*p); -+ p++; -+ } - copylev = 0; - putgmac = quoteit = false; - bufhead = bp; -@@ -1223,10 +1255,7 @@ - } - - if (c == ';' && copylev <= 0 && !ColonOkInAddr) -- { -- if (bp < buflim) -- *bp++ = c; -- } -+ SM_APPEND_CHAR(c); - - /* check for characters that may have to be quoted */ - if (strchr(MustQuoteChars, c) != NULL) -@@ -1254,42 +1283,45 @@ - - /* oops -- have to change our mind */ - anglelev = 1; -- if (!skipping) -- realanglelev = 1; -+ if (SM_HAVE_ROOM) -+ { -+ if (!addangle) -+ buflim--; -+ addangle = true; -+ } - - bp = bufhead; - if (quoteit) - { -- *bp++ = '"'; -+ SM_APPEND_CHAR('"'); - - /* back up over the '<' and any spaces */ - --p; -- while (isascii(*--p) && isspace(*p)) -+ while (p > addr && -+ isascii(*--p) && isspace(*p)) - continue; - p++; - } - for (q = addrhead; q < p; ) - { - c = *q++; -- if (bp < buflim) -+ if (quoteit && c == '"') - { -- if (quoteit && c == '"') -- *bp++ = '\\'; -- *bp++ = c; -+ SM_APPEND_CHAR('\\'); -+ SM_APPEND_CHAR(c); - } -+ else -+ SM_APPEND_CHAR(c); - } - if (quoteit) - { - if (bp == &buf[1]) - bp--; - else -- *bp++ = '"'; -+ SM_APPEND_CHAR('"'); - while ((c = *p++) != '<') -- { -- if (bp < buflim) -- *bp++ = c; -- } -- *bp++ = c; -+ SM_APPEND_CHAR(c); -+ SM_APPEND_CHAR(c); - } - copylev = 0; - putgmac = quoteit = false; -@@ -1301,13 +1333,14 @@ - if (anglelev > 0) - { - anglelev--; -- if (!skipping) -+ if (SM_HAVE_ROOM) - { -- realanglelev--; -- buflim++; -+ if (addangle) -+ buflim++; -+ addangle = false; - } - } -- else if (!skipping) -+ else if (SM_HAVE_ROOM) - { - /* syntax error: unmatched > */ - if (copylev > 0) -@@ -1316,7 +1349,7 @@ - continue; - } - if (copylev++ <= 0) -- *bp++ = c; -+ SM_APPEND_CHAR(c); - continue; - } - -@@ -1324,30 +1357,42 @@ - putg: - if (copylev <= 0 && !putgmac) - { -- if (bp > bufhead && bp[-1] == ')') -- *bp++ = ' '; -- *bp++ = MACROEXPAND; -- *bp++ = 'g'; -+ if (bp > buf && bp[-1] == ')') -+ SM_APPEND_CHAR(' '); -+ SM_APPEND_CHAR(MACROEXPAND); -+ SM_APPEND_CHAR('g'); - putgmac = true; - } - } - - /* repair any syntactic damage */ -- if (realqmode) -+ if (realqmode && bp < bufend) - *bp++ = '"'; -- while (realcmtlev-- > 0) -+ while (realcmtlev-- > 0 && bp < bufend) - *bp++ = ')'; -- while (realanglelev-- > 0) -+ if (addangle && bp < bufend) - *bp++ = '>'; -- *bp++ = '\0'; -+ *bp = '\0'; -+ if (bp < bufend) -+ goto success; -+ -+ returng: -+ /* String too long, punt */ -+ buf[0] = '<'; -+ buf[1] = MACROEXPAND; -+ buf[2]= 'g'; -+ buf[3] = '>'; -+ buf[4]= '\0'; -+ sm_syslog(LOG_ALERT, e->e_id, -+ "Dropped invalid comments from header address"); - -+ success: - if (tTd(33, 1)) - { - sm_dprintf("crackaddr=>`"); - xputs(buf); - sm_dprintf("'\n"); - } -- - return buf; - } - /* ---- sendmail/main.c 8 Jan 2003 23:09:59 -0000 8.887.2.17 -+++ ./sendmail-8.12.3/sendmail/main.c 14 Jan 2003 02:38:58 -0000 -@@ -4423,7 +4423,7 @@ - "Usage: /parse address\n"); - return; - } -- q = crackaddr(p); -+ q = crackaddr(p, e); - (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, - "Cracked address = "); - xputs(q); ---- sendmail/parseaddr.c 26 Sep 2002 23:03:39 -0000 8.359.2.3 -+++ ./sendmail-8.12.3/sendmail/parseaddr.c 14 Jan 2003 02:38:58 -0000 -@@ -2509,7 +2509,7 @@ - if (bitset(RF_CANONICAL, flags) || bitnset(M_NOCOMMENT, m->m_flags)) - fancy = "\201g"; - else -- fancy = crackaddr(name); -+ fancy = crackaddr(name, e); - - /* - ** Turn the name into canonical form. ---- sendmail/sendmail.h 12 Dec 2002 22:46:35 -0000 8.919.2.15 -+++ ./sendmail-8.12.3/sendmail/sendmail.h 14 Jan 2003 02:38:58 -0000 -@@ -394,7 +394,7 @@ - - /* functions */ - extern void cataddr __P((char **, char **, char *, int, int)); --extern char *crackaddr __P((char *)); -+extern char *crackaddr __P((char *, ENVELOPE *)); - extern bool emptyaddr __P((ADDRESS *)); - extern ADDRESS *getctladdr __P((ADDRESS *)); - extern int include __P((char *, bool, ADDRESS *, ADDRESS **, int, ENVELOPE *)); - diff --git a/debian/patches/8.12/8.12.3/smrsh-20020924.patch b/debian/patches/8.12/8.12.3/smrsh-20020924.patch deleted file mode 100644 index d9f4c93..0000000 --- a/debian/patches/8.12/8.12.3/smrsh-20020924.patch +++ /dev/null @@ -1,63 +0,0 @@ -Index: smrsh.c -=================================================================== -RCS file: /cvs/smrsh/smrsh.c,v -retrieving revision 8.58 -diff -u -r8.58 smrsh.c ---- ./sendmail-8.12.3/smrsh/smrsh.c 25 May 2002 02:41:31 -0000 8.58 -+++ smrsh.c 24 Sep 2002 23:58:16 -0000 -@@ -57,6 +57,8 @@ - #include <sm/limits.h> - #include <sm/string.h> - #include <sys/file.h> -+#include <sys/types.h> -+#include <sys/stat.h> - #include <string.h> - #include <ctype.h> - #include <errno.h> -@@ -145,6 +147,7 @@ - char *newenv[2]; - char pathbuf[1000]; - char specialbuf[32]; -+ struct stat st; - - #ifndef DEBUG - # ifndef LOG_MAIL -@@ -302,6 +305,38 @@ - (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, - "Trying %s\n", cmdbuf); - #endif /* DEBUG */ -+ if (stat(cmdbuf, &st) < 0) -+ { -+ /* can't stat it */ -+ (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, -+ "%s: %s not available for sendmail programs (stat failed)\n", -+ prg, cmd); -+ if (p != NULL) -+ *p = ' '; -+#ifndef DEBUG -+ syslog(LOG_CRIT, "uid %d: attempt to use %s (stat failed)", -+ (int) getuid(), cmd); -+#endif /* ! DEBUG */ -+ exit(EX_UNAVAILABLE); -+ } -+ if (!S_ISREG(st.st_mode) -+#ifdef S_ISLNK -+ && !S_ISLNK(st.st_mode) -+#endif /* S_ISLNK */ -+ ) -+ { -+ /* can't stat it */ -+ (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, -+ "%s: %s not available for sendmail programs (not a file)\n", -+ prg, cmd); -+ if (p != NULL) -+ *p = ' '; -+#ifndef DEBUG -+ syslog(LOG_CRIT, "uid %d: attempt to use %s (not a file)", -+ (int) getuid(), cmd); -+#endif /* ! DEBUG */ -+ exit(EX_UNAVAILABLE); -+ } - if (access(cmdbuf, X_OK) < 0) - { - /* oops.... crack attack possiblity */ diff --git a/debian/patches/8.12/8.12.3/socks.patch b/debian/patches/8.12/8.12.3/socks.patch deleted file mode 100644 index 61b3046..0000000 --- a/debian/patches/8.12/8.12.3/socks.patch +++ /dev/null @@ -1,50 +0,0 @@ -# This is a patch for conf.c to update it to conf.c.new -# -# To apply this patch: -# STEP 1: Chdir to the source directory. -# STEP 2: Run the 'applypatch' program with this patch file as input. -# -# If you do not have 'applypatch', it is part of the 'makepatch' package -# that you can fetch from the Comprehensive Perl Archive Network: -# http://www.perl.com/CPAN/authors/Johan_Vromans/makepatch-x.y.tar.gz -# In the above URL, 'x' should be 2 or higher. -# -# To apply this patch without the use of 'applypatch': -# STEP 1: Chdir to the source directory. -# STEP 2: Run the 'patch' program with this file as input. -# -#### End of Preamble #### - -#### Patch data follows #### -diff -c 'conf.c' 'conf.c.new' -Index: ./conf.c -Prereq: 8.961 -*** ./sendmail-8.12.3/sendmail/conf.c Thu May 17 14:19:41 2001 ---- ./sendmail/conf.c.new Wed May 23 13:01:15 2001 -*************** -*** 3760,3765 **** ---- 3760,3770 ---- - vendor_post_defaults(e) - ENVELOPE *e; - { -+ char *p; -+ if ((p = getenv("LD_PRELOAD"))) -+ setuserenv("LD_PRELOAD", p); -+ if ((p = getenv("LD_LIBRARY_PATH"))) -+ setuserenv("LD_LIBRARY_PATH", p); - #ifdef __QNX__ - char *p; - -#### End of Patch data #### - -#### ApplyPatch data follows #### -# Data version : 1.0 -# Date generated : Wed May 23 13:02:56 2001 -# Generated by : makepatch 2.00_03 -# Recurse directories : Yes -# p 'conf.c' 130464 -#### End of ApplyPatch data #### - -#### End of Patch kit [created: Wed May 23 13:02:56 2001] #### -#### Patch checksum: 30 772 52154 #### -#### Checksum: 48 1448 42818 #### diff --git a/debian/patches/8.12/8.12.3/z_CVE-2006-0058.patch b/debian/patches/8.12/8.12.3/z_CVE-2006-0058.patch deleted file mode 100644 index a81a583..0000000 --- a/debian/patches/8.12/8.12.3/z_CVE-2006-0058.patch +++ /dev/null @@ -1,2768 +0,0 @@ -diff -u -p -Nr --exclude CVS sendmail-8.12.3.orig/libsm/fflush.c sendmail-8.12.3/libsm/fflush.c ---- sendmail-8.12.3.orig/libsm/fflush.c 2001-09-11 06:04:48.000000000 +0200 -+++ sendmail-8.12.3/libsm/fflush.c 2006-03-22 22:42:44.000000000 +0100 -@@ -145,6 +145,7 @@ sm_flush(fp, timeout) - return SM_IO_EOF; - } - SM_IO_WR_TIMEOUT(fp, fd, *timeout); -+ t = 0; - } - } - return 0; -diff -u -p -Nr --exclude CVS sendmail-8.12.3.orig/libsm/local.h sendmail-8.12.3/libsm/local.h ---- sendmail-8.12.3.orig/libsm/local.h 2002-02-20 03:40:24.000000000 +0100 -+++ sendmail-8.12.3/libsm/local.h 2006-03-22 22:42:45.000000000 +0100 -@@ -193,7 +193,7 @@ extern const char SmFileMagic[]; - else \ - { \ - (time)->tv_sec = (val) / 1000; \ -- (time)->tv_usec = ((val) - ((time)->tv_sec * 1000)) * 10; \ -+ (time)->tv_usec = ((val) - ((time)->tv_sec * 1000)) * 1000; \ - } \ - if ((val) == SM_TIME_FOREVER) \ - { \ -@@ -277,7 +277,7 @@ extern const char SmFileMagic[]; - else \ - { \ - sm_io_to.tv_sec = (to) / 1000; \ -- sm_io_to.tv_usec = ((to) - (sm_io_to.tv_sec * 1000)) * 10; \ -+ sm_io_to.tv_usec = ((to) - (sm_io_to.tv_sec * 1000)) * 1000; \ - } \ - FD_ZERO(&sm_io_to_mask); \ - FD_SET((fd), &sm_io_to_mask); \ -@@ -285,8 +285,11 @@ extern const char SmFileMagic[]; - FD_SET((fd), &sm_io_x_mask); \ - if (gettimeofday(&sm_io_to_before, NULL) < 0) \ - return SM_IO_EOF; \ -- sm_io_to_sel = select((fd) + 1, NULL, &sm_io_to_mask, &sm_io_x_mask, \ -- &sm_io_to); \ -+ do \ -+ { \ -+ sm_io_to_sel = select((fd) + 1, NULL, &sm_io_to_mask, \ -+ &sm_io_x_mask, &sm_io_to); \ -+ } while (sm_io_to_sel < 0 && errno == EINTR); \ - if (sm_io_to_sel < 0) \ - { \ - /* something went wrong, errno set */ \ -@@ -301,10 +304,9 @@ extern const char SmFileMagic[]; - /* else loop again */ \ - if (gettimeofday(&sm_io_to_after, NULL) < 0) \ - return SM_IO_EOF; \ -- timersub(&sm_io_to_before, &sm_io_to_after, &sm_io_to_diff); \ -- timersub(&sm_io_to, &sm_io_to_diff, &sm_io_to); \ -- (to) -= (sm_io_to.tv_sec * 1000); \ -- (to) -= (sm_io_to.tv_usec / 10); \ -+ timersub(&sm_io_to_after, &sm_io_to_before, &sm_io_to_diff); \ -+ (to) -= (sm_io_to_diff.tv_sec * 1000); \ -+ (to) -= (sm_io_to_diff.tv_usec / 1000); \ - if ((to) < 0) \ - (to) = 0; \ - } -diff -u -p -Nr --exclude CVS sendmail-8.12.3.orig/libsm/refill.c sendmail-8.12.3/libsm/refill.c ---- sendmail-8.12.3.orig/libsm/refill.c 2001-09-11 06:04:49.000000000 +0200 -+++ sendmail-8.12.3/libsm/refill.c 2006-03-22 22:42:45.000000000 +0100 -@@ -71,8 +71,11 @@ static int sm_lflush __P((SM_FILE_T *, i - FD_SET((fd), &sm_io_x_mask); \ - if (gettimeofday(&sm_io_to_before, NULL) < 0) \ - return SM_IO_EOF; \ -- (sel_ret) = select((fd) + 1, &sm_io_to_mask, NULL, \ -- &sm_io_x_mask, (to)); \ -+ do \ -+ { \ -+ (sel_ret) = select((fd) + 1, &sm_io_to_mask, NULL, \ -+ &sm_io_x_mask, (to)); \ -+ } while ((sel_ret) < 0 && errno == EINTR); \ - if ((sel_ret) < 0) \ - { \ - /* something went wrong, errno set */ \ -@@ -89,7 +92,7 @@ static int sm_lflush __P((SM_FILE_T *, i - /* calulate wall-clock time used */ \ - if (gettimeofday(&sm_io_to_after, NULL) < 0) \ - return SM_IO_EOF; \ -- timersub(&sm_io_to_before, &sm_io_to_after, &sm_io_to_diff); \ -+ timersub(&sm_io_to_after, &sm_io_to_before, &sm_io_to_diff); \ - timersub((to), &sm_io_to_diff, (to)); \ - } - -diff -u -p -Nr --exclude CVS sendmail-8.12.3.orig/sendmail/collect.c sendmail-8.12.3/sendmail/collect.c ---- sendmail-8.12.3.orig/sendmail/collect.c 2002-03-15 02:32:47.000000000 +0100 -+++ sendmail-8.12.3/sendmail/collect.c 2006-03-22 22:47:28.000000000 +0100 -@@ -15,7 +15,6 @@ - - SM_RCSID("@(#)$Id: collect.c,v 8.241 2002/03/15 01:32:47 gshapiro Exp $") - --static void collecttimeout __P((time_t)); - static void dferror __P((SM_FILE_T *volatile, char *, ENVELOPE *)); - static void eatfrom __P((char *volatile, ENVELOPE *)); - static void collect_doheader __P((ENVELOPE *)); -@@ -263,10 +262,6 @@ collect_dfopen(e) - ** If data file cannot be created, the process is terminated. - */ - --static jmp_buf CtxCollectTimeout; --static bool volatile CollectProgress; --static SM_EVENT *volatile CollectTimeout = NULL; -- - /* values for input state machine */ - #define IS_NORM 0 /* middle of line */ - #define IS_BOL 1 /* beginning of line */ -@@ -288,26 +283,30 @@ collect(fp, smtpmode, hdrp, e) - register ENVELOPE *e; - { - register SM_FILE_T *volatile df; -- volatile bool ignrdot; -- volatile time_t dbto; -+ bool ignrdot; -+ int dbto; - register char *volatile bp; -- volatile int c; -- volatile bool inputerr; -+ int c; -+ bool inputerr; - bool headeronly; -- char *volatile buf; -- volatile int buflen; -- volatile int istate; -- volatile int mstate; -- volatile int hdrslen; -- volatile int numhdrs; -- volatile int afd; -- unsigned char *volatile pbp; -+ char *buf; -+ int buflen; -+ int istate; -+ int mstate; -+ int hdrslen; -+ int numhdrs; -+ int afd; -+ unsigned char *pbp; - unsigned char peekbuf[8]; - char bufbuf[MAXLINE]; - - df = NULL; - ignrdot = smtpmode ? false : IgnrDot; -- dbto = smtpmode ? TimeOuts.to_datablock : 0; -+ -+ /* timeout for I/O functions is in milliseconds */ -+ dbto = smtpmode ? ((int) TimeOuts.to_datablock * 1000) -+ : SM_TIME_FOREVER; -+ sm_io_setinfo(fp, SM_IO_WHAT_TIMEOUT, &dbto); - c = SM_IO_EOF; - inputerr = false; - headeronly = hdrp != NULL; -@@ -319,7 +318,6 @@ collect(fp, smtpmode, hdrp, e) - pbp = peekbuf; - istate = IS_BOL; - mstate = SaveFrom ? MS_HEADER : MS_UFROM; -- CollectProgress = false; - - /* - ** Tell ARPANET to go ahead. -@@ -340,22 +338,6 @@ collect(fp, smtpmode, hdrp, e) - ** the larger picture (e.g., header versus body). - */ - -- if (dbto != 0) -- { -- /* handle possible input timeout */ -- if (setjmp(CtxCollectTimeout) != 0) -- { -- if (LogLevel > 2) -- sm_syslog(LOG_NOTICE, e->e_id, -- "timeout waiting for input from %s during message collect", -- CURHOSTNAME); -- errno = 0; -- usrerr("451 4.4.1 timeout waiting for input during message collect"); -- goto readerr; -- } -- CollectTimeout = sm_setevent(dbto, collecttimeout, dbto); -- } -- - e->e_msgsize = 0; - for (;;) - { -@@ -378,9 +360,26 @@ collect(fp, smtpmode, hdrp, e) - sm_io_clearerr(fp); - continue; - } -+ -+ /* timeout? */ -+ if (c == SM_IO_EOF && errno == EAGAIN -+ && smtpmode) -+ { -+ /* -+ ** Override e_message in -+ ** usrerr() as this is the -+ ** reason for failure that -+ ** should be logged for -+ ** undelivered recipients. -+ */ -+ -+ e->e_message = NULL; -+ errno = 0; -+ inputerr = true; -+ goto readabort; -+ } - break; - } -- CollectProgress = true; - if (TrafficLogFile != NULL && !headeronly) - { - if (istate == IS_BOL) -@@ -523,6 +522,18 @@ bufferchar: - buflen *= 2; - else - buflen += MEMCHUNKSIZE; -+ if (buflen <= 0) -+ { -+ sm_syslog(LOG_NOTICE, e->e_id, -+ "header overflow from %s during message collect", -+ CURHOSTNAME); -+ errno = 0; -+ e->e_flags |= EF_CLRQUEUE; -+ e->e_status = "5.6.0"; -+ usrerrenh(e->e_status, -+ "552 Headers too large"); -+ goto discard; -+ } - buf = xalloc(buflen); - memmove(buf, obuf, bp - obuf); - bp = &buf[bp - obuf]; -@@ -566,6 +577,7 @@ bufferchar: - usrerrenh(e->e_status, - "552 Headers too large (%d max)", - MaxHeadersLength); -+ discard: - mstate = MS_DISCARD; - } - } -@@ -605,6 +617,24 @@ nextstate: - sm_io_clearerr(fp); - errno = 0; - c = sm_io_getc(fp, SM_TIME_DEFAULT); -+ -+ /* timeout? */ -+ if (c == SM_IO_EOF && errno == EAGAIN -+ && smtpmode) -+ { -+ /* -+ ** Override e_message in -+ ** usrerr() as this is the -+ ** reason for failure that -+ ** should be logged for -+ ** undelivered recipients. -+ */ -+ -+ e->e_message = NULL; -+ errno = 0; -+ inputerr = true; -+ goto readabort; -+ } - } while (c == SM_IO_EOF && errno == EINTR); - if (c != SM_IO_EOF) - (void) sm_io_ungetc(fp, SM_TIME_DEFAULT, c); -@@ -614,6 +644,11 @@ nextstate: - continue; - } - -+ SM_ASSERT(bp > buf); -+ -+ /* guaranteed by isheader(buf) */ -+ SM_ASSERT(*(bp - 1) != '\n' || bp > buf + 1); -+ - /* trim off trailing CRLF or NL */ - if (*--bp != '\n' || *--bp != '\r') - bp++; -@@ -680,10 +715,6 @@ readerr: - inputerr = true; - } - -- /* reset global timer */ -- if (CollectTimeout != NULL) -- sm_clrevent(CollectTimeout); -- - if (headeronly) - return; - -@@ -761,6 +792,7 @@ readerr: - } - - /* An EOF when running SMTP is an error */ -+ readabort: - if (inputerr && (OpMode == MD_SMTP || OpMode == MD_DAEMON)) - { - char *host; -@@ -782,13 +814,14 @@ readerr: - problem, host, - shortenstring(e->e_from.q_paddr, MAXSHORTSTR)); - if (sm_io_eof(fp)) -- usrerr("451 4.4.1 collect: %s on connection from %s, from=%s", -+ usrerr("421 4.4.1 collect: %s on connection from %s, from=%s", - problem, host, - shortenstring(e->e_from.q_paddr, MAXSHORTSTR)); - else -- syserr("451 4.4.1 collect: %s on connection from %s, from=%s", -+ syserr("421 4.4.1 collect: %s on connection from %s, from=%s", - problem, host, - shortenstring(e->e_from.q_paddr, MAXSHORTSTR)); -+ flush_errors(true); - - /* don't return an error indication */ - e->e_to = NULL; -@@ -862,39 +895,6 @@ readerr: - markstats(e, (ADDRESS *) NULL, STATS_NORMAL); - } - --static void --collecttimeout(timeout) -- time_t timeout; --{ -- int save_errno = errno; -- -- /* -- ** NOTE: THIS CAN BE CALLED FROM A SIGNAL HANDLER. DO NOT ADD -- ** ANYTHING TO THIS ROUTINE UNLESS YOU KNOW WHAT YOU ARE -- ** DOING. -- */ -- -- if (CollectProgress) -- { -- /* reset the timeout */ -- CollectTimeout = sm_sigsafe_setevent(timeout, collecttimeout, -- timeout); -- CollectProgress = false; -- } -- else -- { -- /* event is done */ -- CollectTimeout = NULL; -- } -- -- /* if no progress was made or problem resetting event, die now */ -- if (CollectTimeout == NULL) -- { -- errno = ETIMEDOUT; -- longjmp(CtxCollectTimeout, 1); -- } -- errno = save_errno; --} - /* - ** DFERROR -- signal error on writing the data file. - ** -diff -u -p -Nr --exclude CVS sendmail-8.12.3.orig/sendmail/conf.c sendmail-8.12.3/sendmail/conf.c ---- sendmail-8.12.3.orig/sendmail/conf.c 2006-03-22 22:27:15.000000000 +0100 -+++ sendmail-8.12.3/sendmail/conf.c 2006-03-22 22:42:45.000000000 +0100 -@@ -5145,8 +5145,8 @@ sm_syslog(level, id, fmt, va_alist) - va_dcl - #endif /* __STDC__ */ - { -- static char *buf = NULL; -- static size_t bufsize; -+ char *buf; -+ size_t bufsize; - char *begin, *end; - int save_errno; - int seq = 1; -@@ -5170,11 +5170,8 @@ sm_syslog(level, id, fmt, va_alist) - else - idlen = strlen(id) + SyslogPrefixLen; - -- if (buf == NULL) -- { -- buf = buf0; -- bufsize = sizeof buf0; -- } -+ buf = buf0; -+ bufsize = sizeof buf0; - - for (;;) - { -@@ -5216,8 +5213,8 @@ sm_syslog(level, id, fmt, va_alist) - (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, - "%s: %s\n", id, newstring); - #endif /* LOG */ -- if (buf == buf0) -- buf = NULL; -+ if (buf != buf0) -+ sm_free(buf); - errno = save_errno; - return; - } -@@ -5281,8 +5278,8 @@ sm_syslog(level, id, fmt, va_alist) - (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, - "%s[%d]: %s\n", id, seq, begin); - #endif /* LOG */ -- if (buf == buf0) -- buf = NULL; -+ if (buf != buf0) -+ sm_free(buf); - errno = save_errno; - } - /* -diff -u -p -Nr --exclude CVS sendmail-8.12.3.orig/sendmail/deliver.c sendmail-8.12.3/sendmail/deliver.c ---- sendmail-8.12.3.orig/sendmail/deliver.c 2002-03-23 19:30:40.000000000 +0100 -+++ sendmail-8.12.3/sendmail/deliver.c 2006-03-22 23:32:26.000000000 +0100 -@@ -3179,16 +3179,33 @@ do_transfer: - } - else if (!clever) - { -+ bool ok; -+ - /* - ** Format and send message. - */ - -- putfromline(mci, e); -- (*e->e_puthdr)(mci, e->e_header, e, M87F_OUTER); -- (*e->e_putbody)(mci, e, NULL); -+ rcode = EX_OK; -+ errno = 0; -+ ok = putfromline(mci, e); -+ if (ok) -+ ok = (*e->e_puthdr)(mci, e->e_header, e, M87F_OUTER); -+ if (ok) -+ ok = (*e->e_putbody)(mci, e, NULL); -+ -+ /* -+ ** Ignore an I/O error that was caused by EPIPE. -+ ** Some broken mailers don't read the entire body -+ ** but just exit() thus causing an I/O error. -+ */ -+ -+ if (!ok && (sm_io_error(mci->mci_out) && errno == EPIPE)) -+ ok = true; - -- /* get the exit status */ -+ /* (always) get the exit status */ - rcode = endmailer(mci, e, pv); -+ if (!ok) -+ rcode = EX_TEMPFAIL; - if (rcode == EX_TEMPFAIL && SmtpError[0] == '\0') - { - /* -@@ -4335,13 +4352,13 @@ logdelivery(m, mci, dsn, status, ctladdr - ** e -- the envelope. - ** - ** Returns: --** none -+** true iff line was written successfully - ** - ** Side Effects: - ** outputs some text to fp. - */ - --void -+bool - putfromline(mci, e) - register MCI *mci; - ENVELOPE *e; -@@ -4351,7 +4368,7 @@ putfromline(mci, e) - char xbuf[MAXLINE]; - - if (bitnset(M_NHDR, mci->mci_mailer->m_flags)) -- return; -+ return true; - - mci->mci_flags |= MCIF_INHEADER; - -@@ -4392,8 +4409,9 @@ putfromline(mci, e) - } - } - expand(template, buf, sizeof buf, e); -- putxline(buf, strlen(buf), mci, PXLF_HEADER); -+ return putxline(buf, strlen(buf), mci, PXLF_HEADER); - } -+ - /* - ** PUTBODY -- put the body of a message. - ** -@@ -4404,7 +4422,7 @@ putfromline(mci, e) - ** not be permitted in the resulting message. - ** - ** Returns: --** none. -+** true iff message was written successfully - ** - ** Side Effects: - ** The message is written onto fp. -@@ -4415,13 +4433,15 @@ putfromline(mci, e) - #define OS_CR 1 /* read a carriage return */ - #define OS_INLINE 2 /* putting rest of line */ - --void -+bool - putbody(mci, e, separator) - register MCI *mci; - register ENVELOPE *e; - char *separator; - { - bool dead = false; -+ bool ioerr = false; -+ int save_errno; - char buf[MAXLINE]; - #if MIME8TO7 - char *boundaries[MAXMIMENESTING + 1]; -@@ -4451,10 +4471,12 @@ putbody(mci, e, separator) - { - if (bitset(MCIF_INHEADER, mci->mci_flags)) - { -- putline("", mci); -+ if (!putline("", mci)) -+ goto writeerr; - mci->mci_flags &= ~MCIF_INHEADER; - } -- putline("<<< No Message Collected >>>", mci); -+ if (!putline("<<< No Message Collected >>>", mci)) -+ goto writeerr; - goto endofmessage; - } - -@@ -4483,26 +4505,31 @@ putbody(mci, e, separator) - */ - - /* make sure it looks like a MIME message */ -- if (hvalue("MIME-Version", e->e_header) == NULL) -- putline("MIME-Version: 1.0", mci); -+ if (hvalue("MIME-Version", e->e_header) == NULL && -+ !putline("MIME-Version: 1.0", mci)) -+ goto writeerr; - - if (hvalue("Content-Type", e->e_header) == NULL) - { - (void) sm_snprintf(buf, sizeof buf, - "Content-Type: text/plain; charset=%s", - defcharset(e)); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - } - - /* now do the hard work */ - boundaries[0] = NULL; - mci->mci_flags |= MCIF_INHEADER; -- (void) mime8to7(mci, e->e_header, e, boundaries, M87F_OUTER); -+ if (mime8to7(mci, e->e_header, e, boundaries, M87F_OUTER) == -+ SM_IO_EOF) -+ goto writeerr; - } - # if MIME7TO8 - else if (bitset(MCIF_CVT7TO8, mci->mci_flags)) - { -- (void) mime7to8(mci, e->e_header, e); -+ if (!mime7to8(mci, e->e_header, e)) -+ goto writeerr; - } - # endif /* MIME7TO8 */ - else if (MaxMimeHeaderLength > 0 || MaxMimeFieldLength > 0) -@@ -4524,8 +4551,9 @@ putbody(mci, e, separator) - if (bitset(EF_DONT_MIME, e->e_flags)) - SuprErrs = true; - -- (void) mime8to7(mci, e->e_header, e, boundaries, -- M87F_OUTER|M87F_NO8TO7); -+ if (mime8to7(mci, e->e_header, e, boundaries, -+ M87F_OUTER|M87F_NO8TO7) == SM_IO_EOF) -+ goto writeerr; - - /* restore SuprErrs */ - SuprErrs = oldsuprerrs; -@@ -4545,7 +4573,8 @@ putbody(mci, e, separator) - - if (bitset(MCIF_INHEADER, mci->mci_flags)) - { -- putline("", mci); -+ if (!putline("", mci)) -+ goto writeerr; - mci->mci_flags &= ~MCIF_INHEADER; - } - -@@ -4636,11 +4665,6 @@ putbody(mci, e, separator) - dead = true; - continue; - } -- else -- { -- /* record progress for DATA timeout */ -- DataProgress = true; -- } - pos++; - } - for (xp = buf; xp < bp; xp++) -@@ -4653,11 +4677,6 @@ putbody(mci, e, separator) - dead = true; - break; - } -- else -- { -- /* record progress for DATA timeout */ -- DataProgress = true; -- } - } - if (dead) - continue; -@@ -4668,11 +4687,6 @@ putbody(mci, e, separator) - mci->mci_mailer->m_eol) - == SM_IO_EOF) - break; -- else -- { -- /* record progress for DATA timeout */ -- DataProgress = true; -- } - pos = 0; - } - else -@@ -4702,11 +4716,6 @@ putbody(mci, e, separator) - mci->mci_mailer->m_eol) - == SM_IO_EOF) - continue; -- else -- { -- /* record progress for DATA timeout */ -- DataProgress = true; -- } - - if (TrafficLogFile != NULL) - { -@@ -4763,11 +4772,6 @@ putch: - dead = true; - continue; - } -- else -- { -- /* record progress for DATA timeout */ -- DataProgress = true; -- } - pos++; - continue; - } -@@ -4783,11 +4787,6 @@ putch: - dead = true; - continue; - } -- else -- { -- /* record progress for DATA timeout */ -- DataProgress = true; -- } - - if (TrafficLogFile != NULL) - { -@@ -4811,11 +4810,6 @@ putch: - mci->mci_mailer->m_eol) - == SM_IO_EOF) - continue; -- else -- { -- /* record progress for DATA timeout */ -- DataProgress = true; -- } - pos = 0; - ostate = OS_HEAD; - } -@@ -4833,11 +4827,6 @@ putch: - dead = true; - continue; - } -- else -- { -- /* record progress for DATA timeout */ -- DataProgress = true; -- } - pos++; - ostate = OS_INLINE; - } -@@ -4864,11 +4853,6 @@ putch: - dead = true; - break; - } -- else -- { -- /* record progress for DATA timeout */ -- DataProgress = true; -- } - } - pos += bp - buf; - } -@@ -4878,11 +4862,9 @@ putch: - (void) sm_io_fputs(TrafficLogFile, - SM_TIME_DEFAULT, - mci->mci_mailer->m_eol); -- (void) sm_io_fputs(mci->mci_out, SM_TIME_DEFAULT, -- mci->mci_mailer->m_eol); -- -- /* record progress for DATA timeout */ -- DataProgress = true; -+ if (sm_io_fputs(mci->mci_out, SM_TIME_DEFAULT, -+ mci->mci_mailer->m_eol) == SM_IO_EOF) -+ goto writeerr; - } - } - -@@ -4892,6 +4874,7 @@ putch: - qid_printqueue(e->e_dfqgrp, e->e_dfqdir), - DATAFL_LETTER, e->e_id); - ExitStat = EX_IOERR; -+ ioerr = true; - } - - endofmessage: -@@ -4906,23 +4889,35 @@ endofmessage: - ** offset to match. - */ - -+ save_errno = errno; - if (e->e_dfp != NULL) - (void) bfrewind(e->e_dfp); - - /* some mailers want extra blank line at end of message */ - if (!dead && bitnset(M_BLANKEND, mci->mci_mailer->m_flags) && - buf[0] != '\0' && buf[0] != '\n') -- putline("", mci); -+ { -+ if (!putline("", mci)) -+ goto writeerr; -+ } - -- (void) sm_io_flush(mci->mci_out, SM_TIME_DEFAULT); -- if (sm_io_error(mci->mci_out) && errno != EPIPE) -+ if (!dead && -+ (sm_io_flush(mci->mci_out, SM_TIME_DEFAULT) == SM_IO_EOF || -+ (sm_io_error(mci->mci_out) && errno != EPIPE))) - { -+ save_errno = errno; - syserr("putbody: write error"); - ExitStat = EX_IOERR; -+ ioerr = true; - } - -- errno = 0; -+ errno = save_errno; -+ return !dead && !ioerr; -+ -+ writeerr: -+ return false; - } -+ - /* - ** MAILFILE -- Send a message to a file. - ** -@@ -5447,14 +5442,14 @@ mailfile(filename, mailer, ctladdr, sffl - } - #endif /* MIME7TO8 */ - -- putfromline(&mcibuf, e); -- (*e->e_puthdr)(&mcibuf, e->e_header, e, M87F_OUTER); -- (*e->e_putbody)(&mcibuf, e, NULL); -- putline("\n", &mcibuf); -- if (sm_io_flush(f, SM_TIME_DEFAULT) != 0 || -+ if (!putfromline(&mcibuf, e) || -+ !(*e->e_puthdr)(&mcibuf, e->e_header, e, M87F_OUTER) || -+ !(*e->e_putbody)(&mcibuf, e, NULL) || -+ !putline("\n", &mcibuf) || -+ (sm_io_flush(f, SM_TIME_DEFAULT) != 0 || - (SuperSafe != SAFE_NO && - fsync(sm_io_getinfo(f, SM_IO_WHAT_FD, NULL)) < 0) || -- sm_io_error(f)) -+ sm_io_error(f))) - { - setstat(EX_IOERR); - #if !NOFTRUNCATE -@@ -6011,66 +6006,19 @@ ssl_retry: - if ((result = SSL_connect(clt_ssl)) <= 0) - { - int i; -- bool timedout; -- time_t left; -- time_t now = curtime(); -- struct timeval tv; -- -- /* what to do in this case? */ -- i = SSL_get_error(clt_ssl, result); -+ int ssl_err; - -- /* -- ** For SSL_ERROR_WANT_{READ,WRITE}: -- ** There is not a complete SSL record available yet -- ** or there is only a partial SSL record removed from -- ** the network (socket) buffer into the SSL buffer. -- ** The SSL_connect will only succeed when a full -- ** SSL record is available (assuming a "real" error -- ** doesn't happen). To handle when a "real" error -- ** does happen the select is set for exceptions too. -- ** The connection may be re-negotiated during this time -- ** so both read and write "want errors" need to be handled. -- ** A select() exception loops back so that a proper SSL -- ** error message can be gotten. -- */ -+ ssl_err = SSL_get_error(clt_ssl, result); -+ i = tls_retry(clt_ssl, rfd, wfd, tlsstart, -+ TimeOuts.to_starttls, ssl_err, "client"); -+ if (i > 0) -+ goto ssl_retry; - -- left = TimeOuts.to_starttls - (now - tlsstart); -- timedout = left <= 0; -- if (!timedout) -- { -- tv.tv_sec = left; -- tv.tv_usec = 0; -- } -- -- if (!timedout && i == SSL_ERROR_WANT_READ) -- { -- fd_set ssl_maskr, ssl_maskx; -- -- FD_ZERO(&ssl_maskr); -- FD_SET(rfd, &ssl_maskr); -- FD_ZERO(&ssl_maskx); -- FD_SET(rfd, &ssl_maskx); -- if (select(rfd + 1, &ssl_maskr, NULL, &ssl_maskx, &tv) -- > 0) -- goto ssl_retry; -- } -- if (!timedout && i == SSL_ERROR_WANT_WRITE) -- { -- fd_set ssl_maskw, ssl_maskx; -- -- FD_ZERO(&ssl_maskw); -- FD_SET(wfd, &ssl_maskw); -- FD_ZERO(&ssl_maskx); -- FD_SET(rfd, &ssl_maskx); -- if (select(wfd + 1, NULL, &ssl_maskw, &ssl_maskx, &tv) -- > 0) -- goto ssl_retry; -- } - if (LogLevel > 5) - { - sm_syslog(LOG_ERR, e->e_id, -- "STARTTLS=client, error: connect failed=%d, SSL_error=%d, timedout=%d", -- result, i, (int) timedout); -+ "STARTTLS=client, error: connect failed=%d, SSL_error=%d, errno=%d", -+ result, i, errno); - if (LogLevel > 8) - tlslogerr("client"); - } -diff -u -p -Nr --exclude CVS sendmail-8.12.3.orig/sendmail/headers.c sendmail-8.12.3/sendmail/headers.c ---- sendmail-8.12.3.orig/sendmail/headers.c 2006-03-22 22:27:15.000000000 +0100 -+++ sendmail-8.12.3/sendmail/headers.c 2006-03-22 22:59:58.000000000 +0100 -@@ -17,7 +17,7 @@ SM_RCSID("@(#)$Id: headers.c,v 8.266 200 - - static size_t fix_mime_header __P((char *)); - static int priencode __P((char *)); --static void put_vanilla_header __P((HDR *, char *, MCI *)); -+static bool put_vanilla_header __P((HDR *, char *, MCI *)); - - /* - ** SETUPHEADERS -- initialize headers in symbol table -@@ -849,7 +849,6 @@ logsender(e, msgid) - char *name; - register char *sbp; - register char *p; -- int l; - char hbuf[MAXNAME + 1]; - char sbuf[MAXLINE + 1]; - char mbuf[MAXNAME + 1]; -@@ -858,6 +857,8 @@ logsender(e, msgid) - /* XXX do we still need this? sm_syslog() replaces control chars */ - if (msgid != NULL) - { -+ size_t l; -+ - l = strlen(msgid); - if (l > sizeof mbuf - 1) - l = sizeof mbuf - 1; -@@ -1401,13 +1402,13 @@ crackaddr(addr, e) - ** flags -- MIME conversion flags. - ** - ** Returns: --** none. -+** success - ** - ** Side Effects: - ** none. - */ - --void -+bool - putheader(mci, hdr, e, flags) - register MCI *mci; - HDR *hdr; -@@ -1527,7 +1528,8 @@ putheader(mci, hdr, e, flags) - { - if (tTd(34, 11)) - sm_dprintf("\n"); -- put_vanilla_header(h, p, mci); -+ if (!put_vanilla_header(h, p, mci)) -+ goto writeerr; - continue; - } - -@@ -1586,7 +1588,8 @@ putheader(mci, hdr, e, flags) - /* no other recipient headers: truncate value */ - (void) sm_strlcpyn(obuf, sizeof obuf, 2, - h->h_field, ":"); -- putline(obuf, mci); -+ if (!putline(obuf, mci)) -+ goto writeerr; - } - continue; - } -@@ -1605,7 +1608,8 @@ putheader(mci, hdr, e, flags) - } - else - { -- put_vanilla_header(h, p, mci); -+ if (!put_vanilla_header(h, p, mci)) -+ goto writeerr; - } - } - -@@ -1622,18 +1626,25 @@ putheader(mci, hdr, e, flags) - !bitset(MCIF_CVT8TO7|MCIF_CVT7TO8|MCIF_INMIME, mci->mci_flags) && - hvalue("MIME-Version", e->e_header) == NULL) - { -- putline("MIME-Version: 1.0", mci); -+ if (!putline("MIME-Version: 1.0", mci)) -+ goto writeerr; - if (hvalue("Content-Type", e->e_header) == NULL) - { - (void) sm_snprintf(obuf, sizeof obuf, - "Content-Type: text/plain; charset=%s", - defcharset(e)); -- putline(obuf, mci); -+ if (!putline(obuf, mci)) -+ goto writeerr; - } -- if (hvalue("Content-Transfer-Encoding", e->e_header) == NULL) -- putline("Content-Transfer-Encoding: 8bit", mci); -+ if (hvalue("Content-Transfer-Encoding", e->e_header) == NULL -+ && !putline("Content-Transfer-Encoding: 8bit", mci)) -+ goto writeerr; - } - #endif /* MIME8TO7 */ -+ return true; -+ -+ writeerr: -+ return false; - } - /* - ** PUT_VANILLA_HEADER -- output a fairly ordinary header -@@ -1644,10 +1655,10 @@ putheader(mci, hdr, e, flags) - ** mci -- the connection info for output - ** - ** Returns: --** none. -+** success - */ - --static void -+static bool - put_vanilla_header(h, v, mci) - HDR *h; - char *v; -@@ -1672,7 +1683,8 @@ put_vanilla_header(h, v, mci) - l = SPACELEFT(obuf, obp) - 1; - - (void) sm_snprintf(obp, SPACELEFT(obuf, obp), "%.*s", l, v); -- putxline(obuf, strlen(obuf), mci, putflags); -+ if (!putxline(obuf, strlen(obuf), mci, putflags)) -+ goto writeerr; - v += l + 1; - obp = obuf; - if (*v != ' ' && *v != '\t') -@@ -1680,7 +1692,10 @@ put_vanilla_header(h, v, mci) - } - (void) sm_snprintf(obp, SPACELEFT(obuf, obp), "%.*s", - (int) (SPACELEFT(obuf, obp) - 1), v); -- putxline(obuf, strlen(obuf), mci, putflags); -+ return putxline(obuf, strlen(obuf), mci, putflags); -+ -+ writeerr: -+ return false; - } - /* - ** COMMAIZE -- output a header field, making a comma-translated list. -@@ -1693,13 +1708,13 @@ put_vanilla_header(h, v, mci) - ** e -- the envelope containing the message. - ** - ** Returns: --** none. -+** success - ** - ** Side Effects: - ** outputs "p" to file "fp". - */ - --void -+bool - commaize(h, p, oldstyle, mci, e) - register HDR *h; - register char *p; -@@ -1817,13 +1832,6 @@ commaize(h, p, oldstyle, mci, e) - } - name = denlstring(name, false, true); - -- /* -- ** record data progress so DNS timeouts -- ** don't cause DATA timeouts -- */ -- -- DataProgress = true; -- - /* output the name with nice formatting */ - opos += strlen(name); - if (!firstone) -@@ -1831,7 +1839,8 @@ commaize(h, p, oldstyle, mci, e) - if (opos > omax && !firstone) - { - (void) sm_strlcpy(obp, ",\n", SPACELEFT(obuf, obp)); -- putxline(obuf, strlen(obuf), mci, putflags); -+ if (!putxline(obuf, strlen(obuf), mci, putflags)) -+ goto writeerr; - obp = obuf; - (void) sm_strlcpy(obp, " ", sizeof obp); - opos = strlen(obp); -@@ -1849,8 +1858,14 @@ commaize(h, p, oldstyle, mci, e) - firstone = false; - *p = savechar; - } -- *obp = '\0'; -- putxline(obuf, strlen(obuf), mci, putflags); -+ if (obp < &obuf[sizeof obuf]) -+ *obp = '\0'; -+ else -+ obuf[sizeof obuf - 1] = '\0'; -+ return putxline(obuf, strlen(obuf), mci, putflags); -+ -+ writeerr: -+ return false; - } - /* - ** COPYHEADER -- copy header list -diff -u -p -Nr --exclude CVS sendmail-8.12.3.orig/sendmail/mime.c sendmail-8.12.3/sendmail/mime.c ---- sendmail-8.12.3.orig/sendmail/mime.c 2002-03-13 08:28:05.000000000 +0100 -+++ sendmail-8.12.3/sendmail/mime.c 2006-03-22 23:06:09.000000000 +0100 -@@ -81,6 +81,7 @@ static bool MapNLtoCRLF; - ** MBT_FINAL -- the final boundary - ** MBT_INTERMED -- an intermediate boundary - ** MBT_NOTSEP -- an end of file -+** SM_IO_EOF -- I/O error occurred - */ - - struct args -@@ -293,7 +294,8 @@ mime8to7(mci, header, e, boundaries, fla - mci->mci_flags |= MCIF_INMIME; - - /* skip the early "comment" prologue */ -- putline("", mci); -+ if (!putline("", mci)) -+ goto writeerr; - mci->mci_flags &= ~MCIF_INHEADER; - bt = MBT_FINAL; - while (sm_io_fgets(e->e_dfp, SM_TIME_DEFAULT, buf, sizeof buf) -@@ -302,8 +304,9 @@ mime8to7(mci, header, e, boundaries, fla - bt = mimeboundary(buf, boundaries); - if (bt != MBT_NOTSEP) - break; -- putxline(buf, strlen(buf), mci, -- PXLF_MAPFROM|PXLF_STRIP8BIT); -+ if (!putxline(buf, strlen(buf), mci, -+ PXLF_MAPFROM|PXLF_STRIP8BIT)) -+ goto writeerr; - if (tTd(43, 99)) - sm_dprintf(" ...%s", buf); - } -@@ -314,19 +317,24 @@ mime8to7(mci, header, e, boundaries, fla - auto HDR *hdr = NULL; - - (void) sm_strlcpyn(buf, sizeof buf, 2, "--", bbuf); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - if (tTd(43, 35)) - sm_dprintf(" ...%s\n", buf); - collect(e->e_dfp, false, &hdr, e); - if (tTd(43, 101)) - putline("+++after collect", mci); -- putheader(mci, hdr, e, flags); -+ if (!putheader(mci, hdr, e, flags)) -+ goto writeerr; - if (tTd(43, 101)) - putline("+++after putheader", mci); - bt = mime8to7(mci, hdr, e, boundaries, flags); -+ if (bt == SM_IO_EOF) -+ goto writeerr; - } - (void) sm_strlcpyn(buf, sizeof buf, 3, "--", bbuf, "--"); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - if (tTd(43, 35)) - sm_dprintf(" ...%s\n", buf); - boundaries[i] = NULL; -@@ -339,8 +347,9 @@ mime8to7(mci, header, e, boundaries, fla - bt = mimeboundary(buf, boundaries); - if (bt != MBT_NOTSEP) - break; -- putxline(buf, strlen(buf), mci, -- PXLF_MAPFROM|PXLF_STRIP8BIT); -+ if (!putxline(buf, strlen(buf), mci, -+ PXLF_MAPFROM|PXLF_STRIP8BIT)) -+ goto writeerr; - if (tTd(43, 99)) - sm_dprintf(" ...%s", buf); - } -@@ -368,17 +377,20 @@ mime8to7(mci, header, e, boundaries, fla - { - auto HDR *hdr = NULL; - -- putline("", mci); -+ if (!putline("", mci)) -+ goto writeerr; - - mci->mci_flags |= MCIF_INMIME; - collect(e->e_dfp, false, &hdr, e); - if (tTd(43, 101)) - putline("+++after collect", mci); -- putheader(mci, hdr, e, flags); -+ if (!putheader(mci, hdr, e, flags)) -+ goto writeerr; - if (tTd(43, 101)) - putline("+++after putheader", mci); - if (hvalue("MIME-Version", hdr) == NULL) -- putline("MIME-Version: 1.0", mci); -+ if (!putline("MIME-Version: 1.0", mci)) -+ goto writeerr; - bt = mime8to7(mci, hdr, e, boundaries, flags); - mci->mci_flags &= ~MCIF_INMIME; - return bt; -@@ -474,11 +486,13 @@ mime8to7(mci, header, e, boundaries, fla - - (void) sm_snprintf(buf, sizeof buf, - "Content-Transfer-Encoding: %.200s", cte); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - if (tTd(43, 36)) - sm_dprintf(" ...%s\n", buf); - } -- putline("", mci); -+ if (!putline("", mci)) -+ goto writeerr; - mci->mci_flags &= ~MCIF_INHEADER; - while (sm_io_fgets(e->e_dfp, SM_TIME_DEFAULT, buf, sizeof buf) - != NULL) -@@ -486,7 +500,8 @@ mime8to7(mci, header, e, boundaries, fla - bt = mimeboundary(buf, boundaries); - if (bt != MBT_NOTSEP) - break; -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - } - if (sm_io_eof(e->e_dfp)) - bt = MBT_FINAL; -@@ -499,12 +514,13 @@ mime8to7(mci, header, e, boundaries, fla - - if (tTd(43, 36)) - sm_dprintf(" ...Content-Transfer-Encoding: base64\n"); -- putline("Content-Transfer-Encoding: base64", mci); -+ if (!putline("Content-Transfer-Encoding: base64", mci)) -+ goto writeerr; - (void) sm_snprintf(buf, sizeof buf, - "X-MIME-Autoconverted: from 8bit to base64 by %s id %s", - MyHostName, e->e_id); -- putline(buf, mci); -- putline("", mci); -+ if (!putline(buf, mci) || !putline("", mci)) -+ goto writeerr; - mci->mci_flags &= ~MCIF_INHEADER; - while ((c1 = mime_getchar_crlf(e->e_dfp, boundaries, &bt)) != - SM_IO_EOF) -@@ -512,7 +528,8 @@ mime8to7(mci, header, e, boundaries, fla - if (linelen > 71) - { - *bp = '\0'; -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - linelen = 0; - bp = buf; - } -@@ -542,7 +559,8 @@ mime8to7(mci, header, e, boundaries, fla - *bp++ = Base64Code[c2 & 0x3f]; - } - *bp = '\0'; -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - } - else - { -@@ -565,12 +583,14 @@ mime8to7(mci, header, e, boundaries, fla - - if (tTd(43, 36)) - sm_dprintf(" ...Content-Transfer-Encoding: quoted-printable\n"); -- putline("Content-Transfer-Encoding: quoted-printable", mci); -+ if (!putline("Content-Transfer-Encoding: quoted-printable", -+ mci)) -+ goto writeerr; - (void) sm_snprintf(buf, sizeof buf, - "X-MIME-Autoconverted: from 8bit to quoted-printable by %s id %s", - MyHostName, e->e_id); -- putline(buf, mci); -- putline("", mci); -+ if (!putline(buf, mci) || !putline("", mci)) -+ goto writeerr; - mci->mci_flags &= ~MCIF_INHEADER; - fromstate = 0; - c2 = '\n'; -@@ -592,7 +612,8 @@ mime8to7(mci, header, e, boundaries, fla - *bp++ = Base16Code['.' & 0x0f]; - } - *bp = '\0'; -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - linelen = fromstate = 0; - bp = buf; - c2 = c1; -@@ -621,7 +642,8 @@ mime8to7(mci, header, e, boundaries, fla - c2 = '\n'; - *bp++ = '='; - *bp = '\0'; -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - linelen = fromstate = 0; - bp = buf; - if (c2 == '.') -@@ -659,13 +681,17 @@ mime8to7(mci, header, e, boundaries, fla - if (linelen > 0 || boundaries[0] != NULL) - { - *bp = '\0'; -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - } - - } - if (tTd(43, 3)) - sm_dprintf("\t\t\tmime8to7=>%s (basic)\n", MimeBoundaryNames[bt]); - return bt; -+ -+ writeerr: -+ return SM_IO_EOF; - } - /* - ** MIME_GETCHAR -- get a character for MIME processing -@@ -948,7 +974,7 @@ static int mime_fromqp __P((unsigned cha - ** e -- envelope. - ** - ** Returns: --** none. -+** true iff body was written successfully - */ - - static char index_64[128] = -@@ -965,7 +991,7 @@ static char index_64[128] = - - # define CHAR64(c) (((c) < 0 || (c) > 127) ? -1 : index_64[(c)]) - --void -+bool - mime7to8(mci, header, e) - register MCI *mci; - HDR *header; -@@ -998,25 +1024,31 @@ mime7to8(mci, header, e) - { - (void) sm_snprintf(buf, sizeof buf, - "Content-Transfer-Encoding: %s", p); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - } -- putline("", mci); -+ if (!putline("", mci)) -+ goto writeerr; - mci->mci_flags &= ~MCIF_INHEADER; - while (sm_io_fgets(e->e_dfp, SM_TIME_DEFAULT, buf, sizeof buf) - != NULL) -- putline(buf, mci); -- return; -+ { -+ if (!putline(buf, mci)) -+ goto writeerr; -+ } -+ return true; - } - cataddr(pvp, NULL, buf, sizeof buf, '\0'); - cte = sm_rpool_strdup_x(e->e_rpool, buf); - - mci->mci_flags |= MCIF_INHEADER; -- putline("Content-Transfer-Encoding: 8bit", mci); -+ if (!putline("Content-Transfer-Encoding: 8bit", mci)) -+ goto writeerr; - (void) sm_snprintf(buf, sizeof buf, - "X-MIME-Autoconverted: from %.200s to 8bit by %s id %s", - cte, MyHostName, e->e_id); -- putline(buf, mci); -- putline("", mci); -+ if (!putline(buf, mci) || !putline("", mci)) -+ goto writeerr; - mci->mci_flags &= ~MCIF_INHEADER; - - /* -@@ -1130,8 +1162,11 @@ again: - continue; - - if (fbufp - fbuf > 0) -- putxline((char *) fbuf, fbufp - fbuf - 1, mci, -- pxflags); -+ { -+ if (!putxline((char *) fbuf, fbufp - fbuf - 1, -+ mci, pxflags)) -+ goto writeerr; -+ } - fbufp = fbuf; - if (off >= 0 && buf[off] != '\0') - { -@@ -1147,7 +1182,8 @@ again: - if (fbufp > fbuf) - { - *fbufp = '\0'; -- putxline((char *) fbuf, fbufp - fbuf, mci, pxflags); -+ if (!putxline((char *) fbuf, fbufp - fbuf, mci, pxflags)) -+ goto writeerr; - } - - /* -@@ -1157,10 +1193,15 @@ again: - ** but so is auto-converting MIME in the first place. - */ - -- putline("", mci); -+ if (!putline("", mci)) -+ goto writeerr; - - if (tTd(43, 3)) - sm_dprintf("\t\t\tmime7to8 => %s to 8bit done\n", cte); -+ return true; -+ -+ writeerr: -+ return false; - } - /* - ** The following is based on Borenstein's "codes.c" module, with simplifying -diff -u -p -Nr --exclude CVS sendmail-8.12.3.orig/sendmail/parseaddr.c sendmail-8.12.3/sendmail/parseaddr.c ---- sendmail-8.12.3.orig/sendmail/parseaddr.c 2006-03-22 22:27:15.000000000 +0100 -+++ sendmail-8.12.3/sendmail/parseaddr.c 2006-03-22 22:42:45.000000000 +0100 -@@ -1330,7 +1330,7 @@ rewrite(pvp, ruleset, reclevel, e, maxat - /* $&x replacement */ - char *mval = macvalue(rp[1], e); - char **xpvp; -- int trsize = 0; -+ size_t trsize = 0; - static size_t pvpb1_size = 0; - static char **pvpb1 = NULL; - char pvpbuf[PSBUFSIZE]; -@@ -1345,7 +1345,7 @@ rewrite(pvp, ruleset, reclevel, e, maxat - /* save the remainder of the input */ - for (xpvp = pvp; *xpvp != NULL; xpvp++) - trsize += sizeof *xpvp; -- if ((size_t) trsize > pvpb1_size) -+ if (trsize > pvpb1_size) - { - if (pvpb1 != NULL) - sm_free(pvpb1); -@@ -1400,7 +1400,7 @@ rewrite(pvp, ruleset, reclevel, e, maxat - { - char **hbrvp; - char **xpvp; -- int trsize; -+ size_t trsize; - char *replac; - int endtoken; - STAB *map; -@@ -1489,7 +1489,7 @@ rewrite(pvp, ruleset, reclevel, e, maxat - *++arg_rvp = NULL; - - /* save the remainder of the input string */ -- trsize = (int) (avp - rvp + 1) * sizeof *rvp; -+ trsize = (avp - rvp + 1) * sizeof *rvp; - memmove((char *) pvpb1, (char *) rvp, trsize); - - /* look it up */ -@@ -2924,7 +2924,7 @@ rscheck(rwset, p1, p2, e, rmcomm, cnt, l - char *logid; - { - char *volatile buf; -- int bufsize; -+ size_t bufsize; - int saveexitstat; - int volatile rstat = EX_OK; - char **pvp; -@@ -3138,7 +3138,7 @@ rscap(rwset, p1, p2, e, pvp, pvpbuf, siz - int size; - { - char *volatile buf; -- int bufsize; -+ size_t bufsize; - int volatile rstat = EX_OK; - int rsno; - bool saveQuickAbort = QuickAbort; -diff -u -p -Nr --exclude CVS sendmail-8.12.3.orig/sendmail/savemail.c sendmail-8.12.3/sendmail/savemail.c ---- sendmail-8.12.3.orig/sendmail/savemail.c 2001-12-28 23:32:19.000000000 +0100 -+++ sendmail-8.12.3/sendmail/savemail.c 2006-03-22 22:42:45.000000000 +0100 -@@ -15,7 +15,7 @@ - - SM_RCSID("@(#)$Id: savemail.c,v 8.297 2001/12/28 22:32:19 ca Exp $") - --static void errbody __P((MCI *, ENVELOPE *, char *)); -+static bool errbody __P((MCI *, ENVELOPE *, char *)); - static bool pruneroute __P((char *)); - - /* -@@ -426,12 +426,13 @@ savemail(e, sendbody) - p = macvalue('g', e); - macdefine(&e->e_macro, A_PERM, 'g', e->e_sender); - -- putfromline(&mcibuf, e); -- (*e->e_puthdr)(&mcibuf, e->e_header, e, M87F_OUTER); -- (*e->e_putbody)(&mcibuf, e, NULL); -- putline("\n", &mcibuf); /* XXX EOL from FileMailer? */ -- (void) sm_io_flush(fp, SM_TIME_DEFAULT); -- if (sm_io_error(fp) || -+ if (!putfromline(&mcibuf, e) || -+ !(*e->e_puthdr)(&mcibuf, e->e_header, e, -+ M87F_OUTER) || -+ !(*e->e_putbody)(&mcibuf, e, NULL) || -+ !putline("\n", &mcibuf) || -+ sm_io_flush(fp, SM_TIME_DEFAULT) == SM_IO_EOF || -+ sm_io_error(fp) || - sm_io_close(fp, SM_TIME_DEFAULT) < 0) - state = ESM_PANIC; - else -@@ -744,14 +745,14 @@ returntosender(msg, returnq, flags, e) - ** separator -- any possible MIME separator (unused). - ** - ** Returns: --** none -+** success - ** - ** Side Effects: - ** Outputs the body of an error message. - */ - - /* ARGSUSED2 */ --static void -+static bool - errbody(mci, e, separator) - register MCI *mci; - register ENVELOPE *e; -@@ -769,14 +770,16 @@ errbody(mci, e, separator) - - if (bitset(MCIF_INHEADER, mci->mci_flags)) - { -- putline("", mci); -+ if (!putline("", mci)) -+ goto writeerr; - mci->mci_flags &= ~MCIF_INHEADER; - } - if (e->e_parent == NULL) - { - syserr("errbody: null parent"); -- putline(" ----- Original message lost -----\n", mci); -- return; -+ if (!putline(" ----- Original message lost -----\n", mci)) -+ goto writeerr; -+ return true; - } - - /* -@@ -785,11 +788,12 @@ errbody(mci, e, separator) - - if (e->e_msgboundary != NULL) - { -- putline("This is a MIME-encapsulated message", mci); -- putline("", mci); - (void) sm_strlcpyn(buf, sizeof buf, 2, "--", e->e_msgboundary); -- putline(buf, mci); -- putline("", mci); -+ if (!putline("This is a MIME-encapsulated message", mci) || -+ !putline("", mci) || -+ !putline(buf, mci) || -+ !putline("", mci)) -+ goto writeerr; - } - - /* -@@ -811,31 +815,36 @@ errbody(mci, e, separator) - if (!pm_notify && q == NULL && - !bitset(EF_FATALERRS|EF_SENDRECEIPT, e->e_parent->e_flags)) - { -- putline(" **********************************************", -- mci); -- putline(" ** THIS IS A WARNING MESSAGE ONLY **", -- mci); -- putline(" ** YOU DO NOT NEED TO RESEND YOUR MESSAGE **", -- mci); -- putline(" **********************************************", -- mci); -- putline("", mci); -+ if (!putline(" **********************************************", -+ mci) || -+ !putline(" ** THIS IS A WARNING MESSAGE ONLY **", -+ mci) || -+ !putline(" ** YOU DO NOT NEED TO RESEND YOUR MESSAGE **", -+ mci) || -+ !putline(" **********************************************", -+ mci) || -+ !putline("", mci)) -+ goto writeerr; - } - (void) sm_snprintf(buf, sizeof buf, - "The original message was received at %s", - arpadate(ctime(&e->e_parent->e_ctime))); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - expand("from \201_", buf, sizeof buf, e->e_parent); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - - /* include id in postmaster copies */ - if (pm_notify && e->e_parent->e_id != NULL) - { - (void) sm_strlcpyn(buf, sizeof buf, 2, "with id ", - e->e_parent->e_id); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - } -- putline("", mci); -+ if (!putline("", mci)) -+ goto writeerr; - - /* - ** Output error message header (if specified and available). -@@ -861,17 +870,19 @@ errbody(mci, e, separator) - { - translate_dollars(buf); - expand(buf, buf, sizeof buf, e); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - } - (void) sm_io_close(xfile, SM_TIME_DEFAULT); -- putline("\n", mci); -+ if (!putline("\n", mci)) -+ goto writeerr; - } - } - else - { - expand(ErrMsgFile, buf, sizeof buf, e); -- putline(buf, mci); -- putline("", mci); -+ if (!putline(buf, mci) || !putline("", mci)) -+ goto writeerr; - } - } - -@@ -889,21 +900,24 @@ errbody(mci, e, separator) - - if (printheader) - { -- putline(" ----- The following addresses had permanent fatal errors -----", -- mci); -+ if (!putline(" ----- The following addresses had permanent fatal errors -----", -+ mci)) -+ goto writeerr; - printheader = false; - } - - (void) sm_strlcpy(buf, shortenstring(q->q_paddr, MAXSHORTSTR), - sizeof buf); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - if (q->q_rstatus != NULL) - { - (void) sm_snprintf(buf, sizeof buf, - " (reason: %s)", - shortenstring(exitstat(q->q_rstatus), - MAXSHORTSTR)); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - } - if (q->q_alias != NULL) - { -@@ -911,11 +925,12 @@ errbody(mci, e, separator) - " (expanded from: %s)", - shortenstring(q->q_alias->q_paddr, - MAXSHORTSTR)); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - } - } -- if (!printheader) -- putline("", mci); -+ if (!printheader && !putline("", mci)) -+ goto writeerr; - - /* transient non-fatal errors */ - printheader = true; -@@ -929,25 +944,28 @@ errbody(mci, e, separator) - - if (printheader) - { -- putline(" ----- The following addresses had transient non-fatal errors -----", -- mci); -+ if (!putline(" ----- The following addresses had transient non-fatal errors -----", -+ mci)) -+ goto writeerr; - printheader = false; - } - - (void) sm_strlcpy(buf, shortenstring(q->q_paddr, MAXSHORTSTR), - sizeof buf); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - if (q->q_alias != NULL) - { - (void) sm_snprintf(buf, sizeof buf, - " (expanded from: %s)", - shortenstring(q->q_alias->q_paddr, - MAXSHORTSTR)); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - } - } -- if (!printheader) -- putline("", mci); -+ if (!printheader && !putline("", mci)) -+ goto writeerr; - - /* successful delivery notifications */ - printheader = true; -@@ -980,25 +998,28 @@ errbody(mci, e, separator) - - if (printheader) - { -- putline(" ----- The following addresses had successful delivery notifications -----", -- mci); -+ if (!putline(" ----- The following addresses had successful delivery notifications -----", -+ mci)) -+ goto writeerr; - printheader = false; - } - - (void) sm_snprintf(buf, sizeof buf, "%s (%s)", - shortenstring(q->q_paddr, MAXSHORTSTR), p); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - if (q->q_alias != NULL) - { - (void) sm_snprintf(buf, sizeof buf, - " (expanded from: %s)", - shortenstring(q->q_alias->q_paddr, - MAXSHORTSTR)); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - } - } -- if (!printheader) -- putline("", mci); -+ if (!printheader && !putline("", mci)) -+ goto writeerr; - - /* - ** Output transcript of errors -@@ -1007,8 +1028,9 @@ errbody(mci, e, separator) - (void) sm_io_flush(smioout, SM_TIME_DEFAULT); - if (e->e_parent->e_xfp == NULL) - { -- putline(" ----- Transcript of session is unavailable -----\n", -- mci); -+ if (!putline(" ----- Transcript of session is unavailable -----\n", -+ mci)) -+ goto writeerr; - } - else - { -@@ -1019,11 +1041,12 @@ errbody(mci, e, separator) - while (sm_io_fgets(e->e_parent->e_xfp, SM_TIME_DEFAULT, buf, - sizeof buf) != NULL) - { -- if (printheader) -- putline(" ----- Transcript of session follows -----\n", -- mci); -+ if (printheader && !putline(" ----- Transcript of session follows -----\n", -+ mci)) -+ goto writeerr; - printheader = false; -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - } - } - errno = 0; -@@ -1035,11 +1058,12 @@ errbody(mci, e, separator) - - if (e->e_msgboundary != NULL) - { -- putline("", mci); - (void) sm_strlcpyn(buf, sizeof buf, 2, "--", e->e_msgboundary); -- putline(buf, mci); -- putline("Content-Type: message/delivery-status", mci); -- putline("", mci); -+ if (!putline("", mci) || -+ !putline(buf, mci) || -+ !putline("Content-Type: message/delivery-status", mci) || -+ !putline("", mci)) -+ goto writeerr; - - /* - ** Output per-message information. -@@ -1051,13 +1075,15 @@ errbody(mci, e, separator) - (void) sm_snprintf(buf, sizeof buf, - "Original-Envelope-Id: %.800s", - xuntextify(e->e_parent->e_envid)); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - } - - /* Reporting-MTA: is us (required) */ - (void) sm_snprintf(buf, sizeof buf, - "Reporting-MTA: dns; %.800s", MyHostName); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - - /* DSN-Gateway: not relevant since we are not translating */ - -@@ -1071,13 +1097,15 @@ errbody(mci, e, separator) - (void) sm_snprintf(buf, sizeof buf, - "Received-From-MTA: %s; %.800s", - p, RealHostName); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - } - - /* Arrival-Date: -- when it arrived here */ - (void) sm_strlcpyn(buf, sizeof buf, 2, "Arrival-Date: ", - arpadate(ctime(&e->e_parent->e_ctime))); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - - /* Deliver-By-Date: -- when it should have been delivered */ - if (IS_DLVR_BY(e->e_parent)) -@@ -1088,7 +1116,8 @@ errbody(mci, e, separator) - (void) sm_strlcpyn(buf, sizeof buf, 2, - "Deliver-By-Date: ", - arpadate(ctime(&dbyd))); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - } - - /* -@@ -1131,7 +1160,8 @@ errbody(mci, e, separator) - else - continue; - -- putline("", mci); -+ if (!putline("", mci)) -+ goto writeerr; - - /* Original-Recipient: -- passed from on high */ - if (q->q_orcpt != NULL) -@@ -1139,7 +1169,8 @@ errbody(mci, e, separator) - (void) sm_snprintf(buf, sizeof buf, - "Original-Recipient: %.800s", - q->q_orcpt); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - } - - /* Figure out actual recipient */ -@@ -1188,7 +1219,8 @@ errbody(mci, e, separator) - (void) sm_snprintf(buf, sizeof buf, - "Final-Recipient: %s", - q->q_finalrcpt); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - } - - /* X-Actual-Recipient: -- the real problem address */ -@@ -1199,13 +1231,15 @@ errbody(mci, e, separator) - (void) sm_snprintf(buf, sizeof buf, - "X-Actual-Recipient: %s", - actual); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - } - - /* Action: -- what happened? */ - (void) sm_strlcpyn(buf, sizeof buf, 2, "Action: ", - action); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - - /* Status: -- what _really_ happened? */ - if (q->q_status != NULL) -@@ -1217,7 +1251,8 @@ errbody(mci, e, separator) - else - p = "2.0.0"; - (void) sm_strlcpyn(buf, sizeof buf, 2, "Status: ", p); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - - /* Remote-MTA: -- who was I talking to? */ - if (q->q_statmta != NULL) -@@ -1231,7 +1266,8 @@ errbody(mci, e, separator) - p = &buf[strlen(buf) - 1]; - if (*p == '.') - *p = '\0'; -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - } - - /* Diagnostic-Code: -- actual result from other end */ -@@ -1243,7 +1279,8 @@ errbody(mci, e, separator) - (void) sm_snprintf(buf, sizeof buf, - "Diagnostic-Code: %s; %.800s", - p, q->q_rstatus); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - } - - /* Last-Attempt-Date: -- fine granularity */ -@@ -1252,7 +1289,8 @@ errbody(mci, e, separator) - (void) sm_strlcpyn(buf, sizeof buf, 2, - "Last-Attempt-Date: ", - arpadate(ctime(&q->q_statdate))); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - - /* Will-Retry-Until: -- for delayed messages only */ - if (QS_IS_QUEUEUP(q->q_state)) -@@ -1264,7 +1302,8 @@ errbody(mci, e, separator) - (void) sm_strlcpyn(buf, sizeof buf, 2, - "Will-Retry-Until: ", - arpadate(ctime(&xdate))); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - } - } - } -@@ -1274,7 +1313,8 @@ errbody(mci, e, separator) - ** Output text of original message - */ - -- putline("", mci); -+ if (!putline("", mci)) -+ goto writeerr; - if (bitset(EF_HAS_DF, e->e_parent->e_flags)) - { - sendbody = !bitset(EF_NO_BODY_RETN, e->e_parent->e_flags) && -@@ -1282,21 +1322,27 @@ errbody(mci, e, separator) - - if (e->e_msgboundary == NULL) - { -- if (sendbody) -- putline(" ----- Original message follows -----\n", mci); -- else -- putline(" ----- Message header follows -----\n", mci); -+ if (!putline( -+ sendbody -+ ? " ----- Original message follows -----\n" -+ : " ----- Message header follows -----\n", -+ mci)) -+ { -+ goto writeerr; -+ } - } - else - { - (void) sm_strlcpyn(buf, sizeof buf, 2, "--", - e->e_msgboundary); - -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - (void) sm_strlcpyn(buf, sizeof buf, 2, "Content-Type: ", - sendbody ? "message/rfc822" - : "text/rfc822-headers"); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - - p = hvalue("Content-Transfer-Encoding", - e->e_parent->e_header); -@@ -1310,43 +1356,62 @@ errbody(mci, e, separator) - (void) sm_snprintf(buf, sizeof buf, - "Content-Transfer-Encoding: %s", - p); -- putline(buf, mci); -+ if (!putline(buf, mci)) -+ goto writeerr; - } - } -- putline("", mci); -+ if (!putline("", mci)) -+ goto writeerr; - save_errno = errno; -- putheader(mci, e->e_parent->e_header, e->e_parent, M87F_OUTER); -+ if (!putheader(mci, e->e_parent->e_header, e->e_parent, -+ M87F_OUTER)) -+ goto writeerr; - errno = save_errno; - if (sendbody) -- putbody(mci, e->e_parent, e->e_msgboundary); -+ { -+ if (!putbody(mci, e->e_parent, e->e_msgboundary)) -+ goto writeerr; -+ } - else if (e->e_msgboundary == NULL) - { -- putline("", mci); -- putline(" ----- Message body suppressed -----", mci); -+ if (!putline("", mci) || -+ !putline(" ----- Message body suppressed -----", -+ mci)) -+ { -+ goto writeerr; -+ } - } - } - else if (e->e_msgboundary == NULL) - { -- putline(" ----- No message was collected -----\n", mci); -+ if (!putline(" ----- No message was collected -----\n", mci)) -+ goto writeerr; - } - - if (e->e_msgboundary != NULL) - { -- putline("", mci); - (void) sm_strlcpyn(buf, sizeof buf, 3, "--", e->e_msgboundary, - "--"); -- putline(buf, mci); -+ if (!putline("", mci) || !putline(buf, mci)) -+ goto writeerr; - } -- putline("", mci); -- (void) sm_io_flush(mci->mci_out, SM_TIME_DEFAULT); -+ if (!putline("", mci) || -+ sm_io_flush(mci->mci_out, SM_TIME_DEFAULT) == SM_IO_EOF) -+ goto writeerr; - - /* - ** Cleanup and exit - */ - - if (errno != 0) -+ { -+ writeerr: - syserr("errbody: I/O error"); -+ return false; -+ } -+ return true; - } -+ - /* - ** SMTPTODSN -- convert SMTP to DSN status code - ** -diff -u -p -Nr --exclude CVS sendmail-8.12.3.orig/sendmail/sendmail.h sendmail-8.12.3/sendmail/sendmail.h ---- sendmail-8.12.3.orig/sendmail/sendmail.h 2006-03-22 22:27:15.000000000 +0100 -+++ sendmail-8.12.3/sendmail/sendmail.h 2006-03-22 22:42:45.000000000 +0100 -@@ -780,12 +780,12 @@ extern struct hdrinfo HdrInfo[]; - /* functions */ - extern void addheader __P((char *, char *, int, ENVELOPE *)); - extern unsigned long chompheader __P((char *, int, HDR **, ENVELOPE *)); --extern void commaize __P((HDR *, char *, bool, MCI *, ENVELOPE *)); -+extern bool commaize __P((HDR *, char *, bool, MCI *, ENVELOPE *)); - extern HDR *copyheader __P((HDR *, SM_RPOOL_T *)); - extern void eatheader __P((ENVELOPE *, bool, bool)); - extern char *hvalue __P((char *, HDR *)); - extern bool isheader __P((char *)); --extern void putfromline __P((MCI *, ENVELOPE *)); -+extern bool putfromline __P((MCI *, ENVELOPE *)); - extern void setupheaders __P((void)); - - /* -@@ -840,9 +840,9 @@ struct envelope - short e_sendmode; /* message send mode */ - short e_errormode; /* error return mode */ - short e_timeoutclass; /* message timeout class */ -- void (*e_puthdr)__P((MCI *, HDR *, ENVELOPE *, int)); -+ bool (*e_puthdr)__P((MCI *, HDR *, ENVELOPE *, int)); - /* function to put header of message */ -- void (*e_putbody)__P((MCI *, ENVELOPE *, char *)); -+ bool (*e_putbody)__P((MCI *, ENVELOPE *, char *)); - /* function to put body of message */ - ENVELOPE *e_parent; /* the message this one encloses */ - ENVELOPE *e_sibling; /* the next envelope of interest */ -@@ -940,8 +940,8 @@ extern void clearenvelope __P((ENVELOPE - extern void dropenvelope __P((ENVELOPE *, bool, bool)); - extern ENVELOPE *newenvelope __P((ENVELOPE *, ENVELOPE *, SM_RPOOL_T *)); - extern void printenvflags __P((ENVELOPE *)); --extern void putbody __P((MCI *, ENVELOPE *, char *)); --extern void putheader __P((MCI *, HDR *, ENVELOPE *, int)); -+extern bool putbody __P((MCI *, ENVELOPE *, char *)); -+extern bool putheader __P((MCI *, HDR *, ENVELOPE *, int)); - - /* - ** Message priority classes. -@@ -1558,7 +1558,7 @@ EXTERN unsigned long PrivacyFlags; /* pr - #define M87F_NO8TO7 0x0004 /* don't do 8->7 bit conversions */ - - /* functions */ --extern void mime7to8 __P((MCI *, HDR *, ENVELOPE *)); -+extern bool mime7to8 __P((MCI *, HDR *, ENVELOPE *)); - extern int mime8to7 __P((MCI *, HDR *, ENVELOPE *, char **, int)); - - /* -@@ -2087,7 +2087,6 @@ EXTERN bool ColonOkInAddr; /* single col - #if !defined(_USE_SUN_NSSWITCH_) && !defined(_USE_DEC_SVC_CONF_) - EXTERN bool ConfigFileRead; /* configuration file has been read */ - #endif /* !defined(_USE_SUN_NSSWITCH_) && !defined(_USE_DEC_SVC_CONF_) */ --EXTERN bool volatile DataProgress; /* have we sent anything since last check */ - EXTERN bool DisConnected; /* running with OutChannel redirect to transcript file */ - EXTERN bool DontExpandCnames; /* do not $[...$] expand CNAMEs */ - EXTERN bool DontInitGroups; /* avoid initgroups() because of NIS cost */ -@@ -2444,8 +2443,8 @@ extern void printopenfds __P((bool)); - extern void printqueue __P((void)); - extern void printrules __P((void)); - extern pid_t prog_open __P((char **, int *, ENVELOPE *)); --extern void putline __P((char *, MCI *)); --extern void putxline __P((char *, size_t, MCI *, int)); -+extern bool putline __P((char *, MCI *)); -+extern bool putxline __P((char *, size_t, MCI *, int)); - extern void queueup_macros __P((int, SM_FILE_T *, ENVELOPE *)); - extern void readcf __P((char *, bool, ENVELOPE *)); - extern SIGFUNC_DECL reapchild __P((int)); -diff -u -p -Nr --exclude CVS sendmail-8.12.3.orig/sendmail/sfsasl.c sendmail-8.12.3/sendmail/sfsasl.c ---- sendmail-8.12.3.orig/sendmail/sfsasl.c 2002-02-22 05:41:28.000000000 +0100 -+++ sendmail-8.12.3/sendmail/sfsasl.c 2006-03-22 23:53:19.000000000 +0100 -@@ -482,6 +482,125 @@ tls_close(fp) - # define MAX_TLS_IOS 4 - - /* -+** TLS_RETRY -- check whether a failed SSL operation can be retried -+** -+** Parameters: -+** ssl -- TLS structure -+** rfd -- read fd -+** wfd -- write fd -+** tlsstart -- start time of TLS operation -+** timeout -- timeout for TLS operation -+** err -- SSL error -+** where -- description of operation -+** -+** Results: -+** >0 on success -+** 0 on timeout -+** <0 on error -+*/ -+ -+int -+tls_retry(ssl, rfd, wfd, tlsstart, timeout, err, where) -+ SSL *ssl; -+ int rfd; -+ int wfd; -+ time_t tlsstart; -+ int timeout; -+ int err; -+ const char *where; -+{ -+ int ret; -+ time_t left; -+ time_t now = curtime(); -+ struct timeval tv; -+ -+ ret = -1; -+ -+ /* -+ ** For SSL_ERROR_WANT_{READ,WRITE}: -+ ** There is not a complete SSL record available yet -+ ** or there is only a partial SSL record removed from -+ ** the network (socket) buffer into the SSL buffer. -+ ** The SSL_connect will only succeed when a full -+ ** SSL record is available (assuming a "real" error -+ ** doesn't happen). To handle when a "real" error -+ ** does happen the select is set for exceptions too. -+ ** The connection may be re-negotiated during this time -+ ** so both read and write "want errors" need to be handled. -+ ** A select() exception loops back so that a proper SSL -+ ** error message can be gotten. -+ */ -+ -+ left = timeout - (now - tlsstart); -+ if (left <= 0) -+ return 0; /* timeout */ -+ tv.tv_sec = left; -+ tv.tv_usec = 0; -+ -+ if (LogLevel > 14) -+ { -+ sm_syslog(LOG_INFO, NOQID, -+ "STARTTLS=%s, info: fds=%d/%d, err=%d", -+ where, rfd, wfd, err); -+ } -+ -+ if (FD_SETSIZE > 0 && -+ ((err == SSL_ERROR_WANT_READ && rfd >= FD_SETSIZE) || -+ (err == SSL_ERROR_WANT_WRITE && wfd >= FD_SETSIZE))) -+ { -+ if (LogLevel > 5) -+ { -+ sm_syslog(LOG_ERR, NOQID, -+ "STARTTLS=%s, error: fd %d/%d too large", -+ where, rfd, wfd); -+ if (LogLevel > 8) -+ tlslogerr(where); -+ } -+ errno = EINVAL; -+ } -+ else if (err == SSL_ERROR_WANT_READ) -+ { -+ fd_set ssl_maskr, ssl_maskx; -+ -+ FD_ZERO(&ssl_maskr); -+ FD_SET(rfd, &ssl_maskr); -+ FD_ZERO(&ssl_maskx); -+ FD_SET(rfd, &ssl_maskx); -+ do -+ { -+ ret = select(rfd + 1, &ssl_maskr, NULL, &ssl_maskx, -+ &tv); -+ } while (ret < 0 && errno == EINTR); -+ if (ret < 0 && errno > 0) -+ ret = -errno; -+ } -+ else if (err == SSL_ERROR_WANT_WRITE) -+ { -+ fd_set ssl_maskw, ssl_maskx; -+ -+ FD_ZERO(&ssl_maskw); -+ FD_SET(wfd, &ssl_maskw); -+ FD_ZERO(&ssl_maskx); -+ FD_SET(rfd, &ssl_maskx); -+ do -+ { -+ ret = select(wfd + 1, NULL, &ssl_maskw, &ssl_maskx, -+ &tv); -+ } while (ret < 0 && errno == EINTR); -+ if (ret < 0 && errno > 0) -+ ret = -errno; -+ } -+ return ret; -+} -+ -+/* errno to force refill() etc to stop (see IS_IO_ERROR()) */ -+#ifdef ETIMEDOUT -+# define SM_ERR_TIMEOUT ETIMEDOUT -+#else /* ETIMEDOUT */ -+# define SM_ERR_TIMEOUT EIO -+#endif /* ETIMEDOUT */ -+ -+/* - ** TLS_READ -- read secured information for the caller - ** - ** Parameters: -@@ -502,38 +621,42 @@ tls_read(fp, buf, size) - char *buf; - size_t size; - { -- int r; -- static int again = MAX_TLS_IOS; -+ int r, rfd, wfd, try, ssl_err; - struct tls_obj *so = (struct tls_obj *) fp->f_cookie; -+ time_t tlsstart; - char *err; - -+ try = 99; -+ err = NULL; -+ tlsstart = curtime(); -+ -+ retry: - r = SSL_read(so->con, (char *) buf, size); - - if (r > 0) -- { -- again = MAX_TLS_IOS; - return r; -- } - - err = NULL; -- switch (SSL_get_error(so->con, r)) -+ switch (ssl_err = SSL_get_error(so->con, r)) - { - case SSL_ERROR_NONE: - case SSL_ERROR_ZERO_RETURN: -- again = MAX_TLS_IOS; - break; - case SSL_ERROR_WANT_WRITE: -- if (--again <= 0) -- err = "read W BLOCK"; -- else -- errno = EAGAIN; -- break; -+ err = "read W BLOCK"; -+ /* FALLTHROUGH */ - case SSL_ERROR_WANT_READ: -- if (--again <= 0) -+ if (err == NULL) - err = "read R BLOCK"; -- else -- errno = EAGAIN; -+ rfd = SSL_get_rfd(so->con); -+ wfd = SSL_get_wfd(so->con); -+ try = tls_retry(so->con, rfd, wfd, tlsstart, -+ TimeOuts.to_datablock, ssl_err, "read"); -+ if (try > 0) -+ goto retry; -+ errno = SM_ERR_TIMEOUT; - break; -+ - case SSL_ERROR_WANT_X509_LOOKUP: - err = "write X BLOCK"; - break; -@@ -556,7 +679,6 @@ tls_read(fp, buf, size) - int save_errno; - - save_errno = (errno == 0) ? EIO : errno; -- again = MAX_TLS_IOS; - if (LogLevel > 7) - sm_syslog(LOG_WARNING, NOQID, - "STARTTLS: read error=%s (%d)", err, r); -@@ -586,36 +708,39 @@ tls_write(fp, buf, size) - const char *buf; - size_t size; - { -- int r; -- static int again = MAX_TLS_IOS; -+ int r, rfd, wfd, try, ssl_err; - struct tls_obj *so = (struct tls_obj *) fp->f_cookie; -+ time_t tlsstart; - char *err; - -+ try = 99; -+ err = NULL; -+ tlsstart = curtime(); -+ -+ retry: - r = SSL_write(so->con, (char *) buf, size); - - if (r > 0) -- { -- again = MAX_TLS_IOS; - return r; -- } - err = NULL; -- switch (SSL_get_error(so->con, r)) -+ switch (ssl_err = SSL_get_error(so->con, r)) - { - case SSL_ERROR_NONE: - case SSL_ERROR_ZERO_RETURN: -- again = MAX_TLS_IOS; - break; - case SSL_ERROR_WANT_WRITE: -- if (--again <= 0) -- err = "write W BLOCK"; -- else -- errno = EAGAIN; -- break; -+ err = "read W BLOCK"; -+ /* FALLTHROUGH */ - case SSL_ERROR_WANT_READ: -- if (--again <= 0) -- err = "write R BLOCK"; -- else -- errno = EAGAIN; -+ if (err == NULL) -+ err = "read R BLOCK"; -+ rfd = SSL_get_rfd(so->con); -+ wfd = SSL_get_wfd(so->con); -+ try = tls_retry(so->con, rfd, wfd, tlsstart, -+ DATA_PROGRESS_TIMEOUT, ssl_err, "write"); -+ if (try > 0) -+ goto retry; -+ errno = SM_ERR_TIMEOUT; - break; - case SSL_ERROR_WANT_X509_LOOKUP: - err = "write X BLOCK"; -@@ -642,7 +767,6 @@ tls_write(fp, buf, size) - int save_errno; - - save_errno = (errno == 0) ? EIO : errno; -- again = MAX_TLS_IOS; - if (LogLevel > 7) - sm_syslog(LOG_WARNING, NOQID, - "STARTTLS: write error=%s (%d)", err, r); -diff -u -p -Nr --exclude CVS sendmail-8.12.3.orig/sendmail/sfsasl.h sendmail-8.12.3/sendmail/sfsasl.h ---- sendmail-8.12.3.orig/sendmail/sfsasl.h 2000-09-19 23:30:49.000000000 +0200 -+++ sendmail-8.12.3/sendmail/sfsasl.h 2006-03-22 22:42:45.000000000 +0100 -@@ -17,6 +17,8 @@ extern int sfdcsasl __P((SM_FILE_T **, S - #endif /* SASL */ - - # if STARTTLS -+extern int tls_retry __P((SSL *, int, int, time_t, int, int, -+ const char *)); - extern int sfdctls __P((SM_FILE_T **, SM_FILE_T **, SSL *)); - # endif /* STARTTLS */ - -diff -u -p -Nr --exclude CVS sendmail-8.12.3.orig/sendmail/srvrsmtp.c sendmail-8.12.3/sendmail/srvrsmtp.c ---- sendmail-8.12.3.orig/sendmail/srvrsmtp.c 2002-04-02 05:51:02.000000000 +0200 -+++ sendmail-8.12.3/sendmail/srvrsmtp.c 2006-03-23 00:01:40.000000000 +0100 -@@ -1374,70 +1374,20 @@ smtp(nullserver, d_flags, e) - if ((r = SSL_ACC(srv_ssl)) <= 0) - { - int i; -- bool timedout; -- time_t left; -- time_t now = curtime(); -- struct timeval tv; -+ int ssl_err; - -- /* what to do in this case? */ -- i = SSL_get_error(srv_ssl, r); -+ ssl_err = SSL_get_error(srv_ssl, r); -+ i = tls_retry(srv_ssl, rfd, wfd, tlsstart, -+ TimeOuts.to_starttls, ssl_err, -+ "server"); -+ if (i > 0) -+ goto ssl_retry; - -- /* -- ** For SSL_ERROR_WANT_{READ,WRITE}: -- ** There is no SSL record available yet -- ** or there is only a partial SSL record -- ** removed from the network (socket) buffer -- ** into the SSL buffer. The SSL_accept will -- ** only succeed when a full SSL record is -- ** available (assuming a "real" error -- ** doesn't happen). To handle when a "real" -- ** error does happen the select is set for -- ** exceptions too. -- ** The connection may be re-negotiated -- ** during this time so both read and write -- ** "want errors" need to be handled. -- ** A select() exception loops back so that -- ** a proper SSL error message can be gotten. -- */ -- -- left = TimeOuts.to_starttls - (now - tlsstart); -- timedout = left <= 0; -- if (!timedout) -- { -- tv.tv_sec = left; -- tv.tv_usec = 0; -- } -- -- /* XXX what about SSL_pending() ? */ -- if (!timedout && i == SSL_ERROR_WANT_READ) -- { -- fd_set ssl_maskr, ssl_maskx; -- -- FD_ZERO(&ssl_maskr); -- FD_SET(rfd, &ssl_maskr); -- FD_ZERO(&ssl_maskx); -- FD_SET(rfd, &ssl_maskx); -- if (select(rfd + 1, &ssl_maskr, NULL, -- &ssl_maskx, &tv) > 0) -- goto ssl_retry; -- } -- if (!timedout && i == SSL_ERROR_WANT_WRITE) -- { -- fd_set ssl_maskw, ssl_maskx; -- -- FD_ZERO(&ssl_maskw); -- FD_SET(wfd, &ssl_maskw); -- FD_ZERO(&ssl_maskx); -- FD_SET(rfd, &ssl_maskx); -- if (select(wfd + 1, NULL, &ssl_maskw, -- &ssl_maskx, &tv) > 0) -- goto ssl_retry; -- } - if (LogLevel > 5) - { - sm_syslog(LOG_WARNING, NOQID, -- "STARTTLS=server, error: accept failed=%d, SSL_error=%d, timedout=%d", -- r, i, (int) timedout); -+ "STARTTLS=server, error: accept failed=%d, SSL_error=%d, errno=%d", -+ r, i, errno); - if (LogLevel > 8) - tlslogerr("server"); - } -diff -u -p -Nr --exclude CVS sendmail-8.12.3.orig/sendmail/usersmtp.c sendmail-8.12.3/sendmail/usersmtp.c ---- sendmail-8.12.3.orig/sendmail/usersmtp.c 2002-04-03 02:23:25.000000000 +0200 -+++ sendmail-8.12.3/sendmail/usersmtp.c 2006-03-22 22:42:45.000000000 +0100 -@@ -19,7 +19,6 @@ SM_RCSID("@(#)$Id: usersmtp.c,v 8.431 20 - - - extern void markfailure __P((ENVELOPE *, ADDRESS *, MCI *, int, bool)); --static void datatimeout __P((void)); - static void esmtp_check __P((char *, bool, MAILER *, MCI *, ENVELOPE *)); - static void helo_options __P((char *, bool, MAILER *, MCI *, ENVELOPE *)); - static int smtprcptstat __P((ADDRESS *, MAILER *, MCI *, ENVELOPE *)); -@@ -2227,9 +2226,6 @@ smtprcptstat(to, m, mci, e) - ** exit status corresponding to DATA command. - */ - --static jmp_buf CtxDataTimeout; --static SM_EVENT *volatile DataTimeout = NULL; -- - int - smtpdata(m, mci, e, ctladdr, xstart) - MAILER *m; -@@ -2241,7 +2237,7 @@ smtpdata(m, mci, e, ctladdr, xstart) - register int r; - int rstat; - int xstat; -- time_t timeout; -+ int timeout; - char *enhsc; - - /* -@@ -2351,43 +2347,22 @@ smtpdata(m, mci, e, ctladdr, xstart) - ** factor. The main thing is that it should not be infinite. - */ - -- if (setjmp(CtxDataTimeout) != 0) -- { -- mci->mci_errno = errno; -- mci->mci_state = MCIS_ERROR; -- mci_setstat(mci, EX_TEMPFAIL, "4.4.2", NULL); -- -- /* -- ** If putbody() couldn't finish due to a timeout, -- ** rewind it here in the timeout handler. See -- ** comments at the end of putbody() for reasoning. -- */ -- -- if (e->e_dfp != NULL) -- (void) bfrewind(e->e_dfp); -- -- errno = mci->mci_errno; -- syserr("451 4.4.1 timeout writing message to %s", CurHostName); -- smtpquit(m, mci, e); -- return EX_TEMPFAIL; -- } -- - if (tTd(18, 101)) - { - /* simulate a DATA timeout */ -- timeout = 1; -+ timeout = 10; - } - else -- timeout = DATA_PROGRESS_TIMEOUT; -- -- DataTimeout = sm_setevent(timeout, datatimeout, 0); -+ timeout = DATA_PROGRESS_TIMEOUT * 1000; -+ sm_io_setinfo(mci->mci_out, SM_IO_WHAT_TIMEOUT, &timeout); - - - /* - ** Output the actual message. - */ - -- (*e->e_puthdr)(mci, e->e_header, e, M87F_OUTER); -+ if (!(*e->e_puthdr)(mci, e->e_header, e, M87F_OUTER)) -+ goto writeerr; - - if (tTd(18, 101)) - { -@@ -2395,14 +2370,13 @@ smtpdata(m, mci, e, ctladdr, xstart) - (void) sleep(2); - } - -- (*e->e_putbody)(mci, e, NULL); -+ if (!(*e->e_putbody)(mci, e, NULL)) -+ goto writeerr; - - /* - ** Cleanup after sending message. - */ - -- if (DataTimeout != NULL) -- sm_clrevent(DataTimeout); - - #if PIPELINING - } -@@ -2442,7 +2416,9 @@ smtpdata(m, mci, e, ctladdr, xstart) - } - - /* terminate the message */ -- (void) sm_io_fprintf(mci->mci_out, SM_TIME_DEFAULT, ".%s", m->m_eol); -+ if (sm_io_fprintf(mci->mci_out, SM_TIME_DEFAULT, ".%s", m->m_eol) == -+ SM_IO_EOF) -+ goto writeerr; - if (TrafficLogFile != NULL) - (void) sm_io_fprintf(TrafficLogFile, SM_TIME_DEFAULT, - "%05d >>> .\n", (int) CurrentPid); -@@ -2492,50 +2468,27 @@ smtpdata(m, mci, e, ctladdr, xstart) - shortenstring(SmtpReplyBuffer, 403)); - } - return rstat; --} - --static void --datatimeout() --{ -- int save_errno = errno; -+ writeerr: -+ mci->mci_errno = errno; -+ mci->mci_state = MCIS_ERROR; -+ mci_setstat(mci, EX_TEMPFAIL, "4.4.2", NULL); - - /* -- ** NOTE: THIS CAN BE CALLED FROM A SIGNAL HANDLER. DO NOT ADD -- ** ANYTHING TO THIS ROUTINE UNLESS YOU KNOW WHAT YOU ARE -- ** DOING. -+ ** If putbody() couldn't finish due to a timeout, -+ ** rewind it here in the timeout handler. See -+ ** comments at the end of putbody() for reasoning. - */ - -- if (DataProgress) -- { -- time_t timeout; -- -- /* check back again later */ -- if (tTd(18, 101)) -- { -- /* simulate a DATA timeout */ -- timeout = 1; -- } -- else -- timeout = DATA_PROGRESS_TIMEOUT; -- -- /* reset the timeout */ -- DataTimeout = sm_sigsafe_setevent(timeout, datatimeout, 0); -- DataProgress = false; -- } -- else -- { -- /* event is done */ -- DataTimeout = NULL; -- } -+ if (e->e_dfp != NULL) -+ (void) bfrewind(e->e_dfp); - -- /* if no progress was made or problem resetting event, die now */ -- if (DataTimeout == NULL) -- { -- errno = ETIMEDOUT; -- longjmp(CtxDataTimeout, 1); -- } -- errno = save_errno; -+ errno = mci->mci_errno; -+ syserr("451 4.4.1 timeout writing message to %s", CurHostName); -+ smtpquit(m, mci, e); -+ return EX_TEMPFAIL; - } -+ - /* - ** SMTPGETSTAT -- get status code from DATA in LMTP - ** -diff -u -p -Nr --exclude CVS sendmail-8.12.3.orig/sendmail/util.c sendmail-8.12.3/sendmail/util.c ---- sendmail-8.12.3.orig/sendmail/util.c 2002-04-04 23:32:15.000000000 +0200 -+++ sendmail-8.12.3/sendmail/util.c 2006-03-22 22:42:45.000000000 +0100 -@@ -878,18 +878,18 @@ fixcrlf(line, stripnl) - ** mci -- the mailer connection information. - ** - ** Returns: --** none -+** true iff line was written successfully - ** - ** Side Effects: - ** output of l to mci->mci_out. - */ - --void -+bool - putline(l, mci) - register char *l; - register MCI *mci; - { -- putxline(l, strlen(l), mci, PXLF_MAPFROM); -+ return putxline(l, strlen(l), mci, PXLF_MAPFROM); - } - /* - ** PUTXLINE -- putline with flags bits. -@@ -908,13 +908,13 @@ putline(l, mci) - ** PXLF_NOADDEOL -- don't add an EOL if one wasn't present. - ** - ** Returns: --** none -+** true iff line was written successfully - ** - ** Side Effects: - ** output of l to mci->mci_out. - */ - --void -+bool - putxline(l, len, mci, pxflags) - register char *l; - size_t len; -@@ -966,11 +966,6 @@ putxline(l, len, mci, pxflags) - if (sm_io_putc(mci->mci_out, SM_TIME_DEFAULT, - '.') == SM_IO_EOF) - dead = true; -- else -- { -- /* record progress for DATA timeout */ -- DataProgress = true; -- } - if (TrafficLogFile != NULL) - (void) sm_io_putc(TrafficLogFile, - SM_TIME_DEFAULT, '.'); -@@ -983,11 +978,6 @@ putxline(l, len, mci, pxflags) - if (sm_io_putc(mci->mci_out, SM_TIME_DEFAULT, - '>') == SM_IO_EOF) - dead = true; -- else -- { -- /* record progress for DATA timeout */ -- DataProgress = true; -- } - if (TrafficLogFile != NULL) - (void) sm_io_putc(TrafficLogFile, - SM_TIME_DEFAULT, -@@ -999,16 +989,11 @@ putxline(l, len, mci, pxflags) - while (l < q) - { - if (sm_io_putc(mci->mci_out, SM_TIME_DEFAULT, -- (unsigned char) *l++) == SM_IO_EOF) -+ (unsigned char) *l++) == SM_IO_EOF) - { - dead = true; - break; - } -- else -- { -- /* record progress for DATA timeout */ -- DataProgress = true; -- } - } - if (dead) - break; -@@ -1024,11 +1009,6 @@ putxline(l, len, mci, pxflags) - dead = true; - break; - } -- else -- { -- /* record progress for DATA timeout */ -- DataProgress = true; -- } - if (TrafficLogFile != NULL) - { - for (l = l_base; l < q; l++) -@@ -1052,11 +1032,9 @@ putxline(l, len, mci, pxflags) - { - if (sm_io_putc(mci->mci_out, SM_TIME_DEFAULT, '.') == - SM_IO_EOF) -- break; -- else - { -- /* record progress for DATA timeout */ -- DataProgress = true; -+ dead = true; -+ break; - } - if (TrafficLogFile != NULL) - (void) sm_io_putc(TrafficLogFile, -@@ -1069,11 +1047,9 @@ putxline(l, len, mci, pxflags) - { - if (sm_io_putc(mci->mci_out, SM_TIME_DEFAULT, '>') == - SM_IO_EOF) -- break; -- else - { -- /* record progress for DATA timeout */ -- DataProgress = true; -+ dead = true; -+ break; - } - if (TrafficLogFile != NULL) - (void) sm_io_putc(TrafficLogFile, -@@ -1091,11 +1067,6 @@ putxline(l, len, mci, pxflags) - dead = true; - break; - } -- else -- { -- /* record progress for DATA timeout */ -- DataProgress = true; -- } - } - if (dead) - break; -@@ -1106,11 +1077,9 @@ putxline(l, len, mci, pxflags) - if ((!bitset(PXLF_NOADDEOL, pxflags) || !noeol) && - sm_io_fputs(mci->mci_out, SM_TIME_DEFAULT, - mci->mci_mailer->m_eol) == SM_IO_EOF) -- break; -- else - { -- /* record progress for DATA timeout */ -- DataProgress = true; -+ dead = true; -+ break; - } - if (l < end && *l == '\n') - { -@@ -1119,11 +1088,9 @@ putxline(l, len, mci, pxflags) - { - if (sm_io_putc(mci->mci_out, SM_TIME_DEFAULT, - ' ') == SM_IO_EOF) -- break; -- else - { -- /* record progress for DATA timeout */ -- DataProgress = true; -+ dead = true; -+ break; - } - - if (TrafficLogFile != NULL) -@@ -1132,10 +1099,10 @@ putxline(l, len, mci, pxflags) - } - } - -- /* record progress for DATA timeout */ -- DataProgress = true; - } while (l < end); -+ return !dead; - } -+ - /* - ** XUNLINK -- unlink a file, doing logging as appropriate. - ** diff --git a/debian/patches/8.13/8.13.3/client_helo.patch b/debian/patches/8.13/8.13.3/client_helo.patch new file mode 100644 index 0000000..5ee742a --- /dev/null +++ b/debian/patches/8.13/8.13.3/client_helo.patch @@ -0,0 +1,152 @@ +#------------------------------------------------------------------------------ +# Who: +# Richard Nelson <cowboy@{cavein,debian}.org> +# What: +# 1) New macro ${client_helo} containing the EHLO/HELO text (or null) +# 2) New ruleset check_helo called after the EHLO/HELO and before the +# milter callout. This ruleset invocation and handling are modeled +# after the existing check_* rulesets +# Why: +# 0) $s is transient, and not set until MAIL FROM: is seen - I want the +# ability to check the EHLO/HELO string elsewere (like check_vrfy). +# ${client_helo} is set upon seeing the EHLO/HELO command and +# remains valid forever. +# 1) There is an IBM internal system check routine for AIX and Linux that +# I'm thinking will soon be a requirement to pass its audit... Like +# all such tools, it is limited - it requires that vrfy,expn are +# disabled... well, I don't do that... if you can relay through the +# box, then you can query it. If you can't relay, you get 5.7.1 ! +# using the new macro - I can specifically deny the scanner - even +# though other traffic is unaffected. +# 2) It can provide the same function as -DPICKY_HELO_CHECK, dynamically +# by making those checks in the new check_helo ruleset - as outlined +# below (NOT RECOMMENDED) +# 3) It can be passed to the milters, if they choose (like mimedefang) +# to apparently not support the helo callout +# 4) I was bored stiff being in the bowels of a COBOL compiler and +# needed a sanity break :) +# Design questions: +# Testing: +# 1) Running on three boxes, two of which make use of the macro and +# ruleset to block. The new function works great - and no ill +# affects seen on any of the boxes. +# Documentation: +# See below for the new macro and ruleset +# TODO: +# add to milter macro specifications +# Changes: +# 1) deliver.c -- remove client_helo from the envelope like all the +# other client_* macros +# 2) srvrsmtp.c +# A) A new boolean variable indicating that the helo string is valid +# gothelo is not sufficient here... the new scope is very small... +# B) A new character pointer holding the helo string address +# C) After obtaining a valid helo string, or accepting an invalid +# one, create a copy of the string for permanence +# D) Update the client_helo macro variable with the helo string +#------------------------------------------------------------------------------ +#5.2. D -- Define Macro +# ... +# ${client_helo} +# The string specified by the SMTP client on the EHLO/HELO +# command, or null if no EHLO/HELO was seen. Defined in the +# SMTP server only. Unlike the $s macro, which is transient +# and not available in all rulesets, the {client_helo} macro +# is available to all rulesets after the EHLO/HELO greeting. +# ... +#------------------------------------------------------------------------------ +#5.1.4.?. check_helo +# +# The check_helo ruleset is passed the address +# or name parameter of the SMTP EHLO/HELO command. It can +# accept or reject the address. Note that rejecting mail +# based upon this check is a violation of the standards! +# +# One could impliment an improved -PICKY_HELO_CHECK test +# here by checking the values of {client_name}, {client_addr}, +# against {client_helo} and {daemon_addr}. +#------------------------------------------------------------------------------ +diff -c 'deliver.orig' 'deliver.c' +Index: ./deliver.orig +Prereq: 8.983 +*** ./sendmail-8.13.3/sendmail/deliver.c Tue Aug 10 17:50:11 2004 +--- ./deliver.c Tue Aug 10 17:44:04 2004 +*************** +*** 1363,1368 **** +--- 1363,1369 ---- + macdefine(&e->e_macro, A_PERM, macid("{client_addr}"), ""); + macdefine(&e->e_macro, A_PERM, macid("{client_port}"), ""); + macdefine(&e->e_macro, A_PERM, macid("{client_resolve}"), ""); ++ macdefine(&e->e_macro, A_PERM, macid("{client_helo}"), ""); + } + + SM_TRY +diff -c 'srvrsmtp.orig' 'srvrsmtp.c' +Index: ./srvrsmtp.orig +Prereq: 8.902 +*** ./sendmail-8.13.3/sendmail/srvrsmtp.c Tue Aug 10 17:50:23 2004 +--- ./srvrsmtp.c Tue Aug 10 17:42:54 2004 +*************** +*** 444,449 **** +--- 444,451 ---- + char *volatile protocol; /* sending protocol */ + char *volatile sendinghost; /* sending hostname */ + char *volatile peerhostname; /* name of SMTP peer or "localhost" */ ++ char *volatile helo_name; /* client_helo string */ ++ bool helo_accept = false; /* helo/ehlo command accepted */ + auto char *delimptr; + char *id; + volatile unsigned int n_badcmds = 0; /* count of bad commands */ +*************** +*** 1976,1981 **** +--- 1978,1987 ---- + { + q = "pleased to meet you"; + sendinghost = sm_strdup_x(p); ++ helo_accept = true; ++ helo_name = sm_strdup_x(p); ++ macdefine(&e->e_macro, A_PERM, macid("{client_helo}"), ++ helo_name); + } + else if (!AllowBogusHELO) + { +*************** +*** 1989,1994 **** +--- 1995,2004 ---- + else + { + q = "accepting invalid domain name"; ++ helo_accept = true; ++ helo_name = sm_strdup_x(p); ++ macdefine(&e->e_macro, A_PERM, macid("{client_helo}"), ++ helo_name); + } + + if (gothelo) +*************** +*** 1996,2001 **** +--- 2006,2028 ---- + CLEAR_STATE(cmdbuf); + } + ++ if (helo_accept) { ++ if (rscheck("check_helo", helo_name, ++ NULL, e, RSF_RMCOMM|RSF_COUNT, 3, ++ NULL, e->e_id) != EX_OK || ++ Errors > 0) ++ sm_exc_raisenew_x(&EtypeQuickAbort, 1); ++ ++ if (MaxMessageSize > 0 && ++ (e->e_msgsize > MaxMessageSize || ++ e->e_msgsize < 0)) ++ { ++ usrerr("552 5.2.3 Message size exceeds fixed maximum message size (%ld)", ++ MaxMessageSize); ++ sm_exc_raisenew_x(&EtypeQuickAbort, 1); ++ } ++ } ++ + #if MILTER + if (smtp.sm_milterlist && smtp.sm_milterize && + !bitset(EF_DISCARD, e->e_flags)) + diff --git a/debian/patches/8.13/8.13.3/close_wait.p2 b/debian/patches/8.13/8.13.3/close_wait.p2 new file mode 100644 index 0000000..247fada --- /dev/null +++ b/debian/patches/8.13/8.13.3/close_wait.p2 @@ -0,0 +1,109 @@ +--- mci.c.orig Wed Aug 4 14:11:31 2004 ++++ ./sendmail-8.13.3/sendmail/mci.c Mon Jan 17 10:29:28 2005 +@@ -398,6 +398,57 @@ + + return mci; + } ++ ++/* ++** MCI_CLOSE -- (forcefully) close files used for a connection. ++** Note: this is a last resort, usually smtpquit() or endmailer() ++** should be used to close a connection. ++** ++** Parameters: ++** mci -- the connection to close. ++** where -- where has this been called? ++** ++** Returns: ++** none. ++*/ ++ ++void ++mci_close(mci, where) ++ MCI *mci; ++ char *where; ++{ ++ bool dumped; ++ ++ if (mci == NULL) ++ return; ++ dumped = false; ++ if (mci->mci_out != NULL) ++ { ++ if (tTd(56, 1)) ++ { ++ sm_dprintf("mci_close: mci_out!=NULL, where=%s\n", ++ where); ++ mci_dump(sm_debug_file(), mci, false); ++ dumped = true; ++ } ++ (void) sm_io_close(mci->mci_out, SM_TIME_DEFAULT); ++ mci->mci_out = NULL; ++ } ++ if (mci->mci_in != NULL) ++ { ++ if (tTd(56, 1)) ++ { ++ sm_dprintf("mci_close: mci_in!=NULL, where=%s\n", ++ where); ++ if (!dumped) ++ mci_dump(sm_debug_file(), mci, false); ++ } ++ (void) sm_io_close(mci->mci_in, SM_TIME_DEFAULT); ++ mci->mci_in = NULL; ++ } ++ mci->mci_state = MCIS_CLOSED; ++} ++ + /* + ** MCI_NEW -- allocate new MCI structure + ** +--- sendmail.h.orig Tue Nov 9 11:45:46 2004 ++++ ./sendmail-8.13.3/sendmail/sendmail.h Mon Jan 17 09:39:56 2005 +@@ -728,6 +728,7 @@ + + /* functions */ + extern void mci_cache __P((MCI *)); ++extern void mci_close __P((MCI *, char *where)); + extern void mci_dump __P((SM_FILE_T *, MCI *, bool)); + extern void mci_dump_all __P((SM_FILE_T *, bool)); + extern void mci_flush __P((bool, MCI *)); +--- usersmtp.c.orig Fri Jan 14 07:34:00 2005 ++++ ./sendmail-8.13.3/sendmail/usersmtp.c Mon Jan 17 09:40:57 2005 +@@ -89,6 +89,7 @@ + */ + + SmtpError[0] = '\0'; ++ SmtpMsgBuffer[0] = '\0'; + CurHostName = mci->mci_host; /* XXX UGLY XXX */ + if (CurHostName == NULL) + CurHostName = MyHostName; +@@ -2899,7 +2900,10 @@ + char *oldcurhost; + + if (mci->mci_state == MCIS_CLOSED) ++ { ++ mci_close(mci, "smtpquit:1"); + return; ++ } + + oldcurhost = CurHostName; + CurHostName = mci->mci_host; /* XXX UGLY XXX */ +@@ -3133,7 +3137,7 @@ + if (strncmp(SmtpMsgBuffer, "QUIT", 4) == 0) + { + errno = mci->mci_errno; +- mci->mci_state = MCIS_CLOSED; ++ mci_close(mci, "reply:1"); + return -1; + } + mci->mci_state = MCIS_ERROR; +@@ -3158,7 +3162,7 @@ + /* errors on QUIT should be ignored */ + if (strncmp(SmtpMsgBuffer, "QUIT", 4) == 0) + { +- mci->mci_state = MCIS_CLOSED; ++ mci_close(mci, "reply:2"); + return -1; + } + diff --git a/debian/patches/8.13/8.13.3/cyrusv2.m4.debian-patch b/debian/patches/8.13/8.13.3/cyrusv2.m4.debian-patch new file mode 100644 index 0000000..5e2c8c3 --- /dev/null +++ b/debian/patches/8.13/8.13.3/cyrusv2.m4.debian-patch @@ -0,0 +1,11 @@ +--- sendmail-8.13.3/cf/mailer/cyrusv2.m4 Sat Jun 1 15:14:57 2002 ++++ cyrusv2.m4.new Wed Jun 5 04:21:34 2002 +@@ -12,7 +12,7 @@ + + _DEFIFNOT(`_DEF_CYRUSV2_MAILER_FLAGS', `lsDFMnqXz') + _DEFIFNOT(`CYRUSV2_MAILER_FLAGS', `A@/:|m') +-ifdef(`CYRUSV2_MAILER_ARGS',, `define(`CYRUSV2_MAILER_ARGS', `FILE /var/imap/socket/lmtp')') ++ifdef(`CYRUSV2_MAILER_ARGS',, `define(`CYRUSV2_MAILER_ARGS', `FILE /var/run/cyrus/socket/lmtp')') + define(`_CYRUSV2_QGRP', `ifelse(defn(`CYRUSV2_MAILER_QGRP'),`',`', ` Q=CYRUSV2_MAILER_QGRP,')')dnl + + POPDIVERT diff --git a/debian/patches/8.12/8.12.3/dpatch.001 b/debian/patches/8.13/8.13.3/dpatch.001 index 972c1c2..fe7dcf9 100644 --- a/debian/patches/8.12/8.12.3/dpatch.001 +++ b/debian/patches/8.13/8.13.3/dpatch.001 @@ -18,8 +18,8 @@ #### Patch data follows #### diff -c 'cf/feature/local_procmail.m4' 'debian/patches/local_procmail.m4' Index: ./cf/feature/local_procmail.m4 -Prereq: 8.21 -*** sendmail-8.12.3/cf/feature/local_procmail.m4 Sat Nov 20 15:26:21 1999 +Prereq: 8.22 +*** sendmail-8.13.3/cf/feature/local_procmail.m4 Sat Nov 20 15:26:21 1999 --- ./debian/patches/local_procmail.m4 Sat Nov 20 15:39:46 1999 *************** *** 27,32 **** diff --git a/debian/patches/8.12/8.12.3/dpatch.002 b/debian/patches/8.13/8.13.3/dpatch.002 index 6f569d9..8337978 100644 --- a/debian/patches/8.12/8.12.3/dpatch.002 +++ b/debian/patches/8.13/8.13.3/dpatch.002 @@ -1,4 +1,4 @@ ---- sendmail-8.12.3/cf/mailer/cyrus.m4 Tue May 2 14:40:24 2000 +--- sendmail-8.13.3/cf/mailer/cyrus.m4 Tue May 2 14:40:24 2000 +++ ./debian/patches/cf/mailer/cyrus.m4 Tue May 2 14:41:21 2000 @@ -36,12 +36,12 @@ # diff --git a/debian/patches/8.12/8.12.3/dpatch.003 b/debian/patches/8.13/8.13.3/dpatch.003 index 511d2b0..3ebe7f5 100644 --- a/debian/patches/8.12/8.12.3/dpatch.003 +++ b/debian/patches/8.13/8.13.3/dpatch.003 @@ -19,7 +19,7 @@ diff -c 'rmail/rmail.c' 'debian/patches/rmail.c' Index: ./rmail/rmail.c Prereq: 8.61 -*** sendmail-8.12.3/rmail/rmail.c Sat Sep 16 18:20:25 2000 +*** sendmail-8.13.3/rmail/rmail.c Sat Sep 16 18:20:25 2000 --- ./debian/patches/rmail.c Thu Sep 28 17:00:59 2000 *************** *** 318,324 **** diff --git a/debian/patches/8.12/8.12.3/dpatch.004 b/debian/patches/8.13/8.13.3/dpatch.004 index 867a195..dff0134 100644 --- a/debian/patches/8.12/8.12.3/dpatch.004 +++ b/debian/patches/8.13/8.13.3/dpatch.004 @@ -18,8 +18,8 @@ #### Patch data follows #### diff -c 'sendmail/control.c' 'debian/patches/control.c' Index: ./sendmail/control.c -Prereq: 8.118 -*** sendmail-8.12.3/sendmail/control.c Sat Nov 20 15:26:23 1999 +Prereq: 8.126 +*** sendmail-8.13.3/sendmail/control.c Sat Nov 20 15:26:23 1999 --- ./debian/patches/control.c Sat Nov 20 15:39:52 1999 *************** *** 92,98 **** diff --git a/debian/patches/8.12/8.12.3/dpatch.005 b/debian/patches/8.13/8.13.3/dpatch.005 index c4ba0c5..bdb930e 100644 --- a/debian/patches/8.12/8.12.3/dpatch.005 +++ b/debian/patches/8.13/8.13.3/dpatch.005 @@ -19,7 +19,7 @@ diff -c './cf/mailer/fax.m4' 'fax.m4' Index: ./cf/mailer/fax.m4 Prereq: 8.16 -*** sendmail-8.12.3/cf/mailer/fax.m4 Mon Oct 18 02:35:28 1999 +*** sendmail-8.13.3/cf/mailer/fax.m4 Mon Oct 18 02:35:28 1999 --- ./fax.m4 Wed Jan 3 14:26:13 2001 *************** *** 19,26 **** diff --git a/debian/patches/8.13/8.13.3/drac.patch b/debian/patches/8.13/8.13.3/drac.patch new file mode 100644 index 0000000..4675b97 --- /dev/null +++ b/debian/patches/8.13/8.13.3/drac.patch @@ -0,0 +1,24 @@ +--- sendmail-8.13.3/cf/m4/proto.m4.orig 2003-03-29 02:20:53.000000000 +0900 ++++ sendmail-8.13.3/cf/m4/proto.m4 2003-03-30 13:22:18.731049640 +0900 +@@ -2110,6 +2110,13 @@ + R127.0.0.1 $@ RELAY originated locally + RIPv6:::1 $@ RELAY originated locally + R$=R $* $@ RELAY relayable IP address ++ifdef(`_DRAC_', `dnl ++R$* $: <> $(drac $1 $: <?> $1 $) ++R<> <?> $+ $: $1 ++R<> $+ $@ RELAY authenticated IP address ++RIPv6:$* $: <> $(drac $1 $: <?> IPv6:$1 $) ++R<> <?> $+ $: $1 ++R<> $+ $@ RELAY authenticated IP address',`dnl') + ifdef(`_ACCESS_TABLE_', `dnl + R$* $: $>A <$1> <?> <+ Connect> <$1> + R<RELAY> $* $@ RELAY relayable IP address +--- /dev/null 2002-01-01 00:00:00.000000000 +0900 ++++ sendmail-8.13.3/cf/feature/drac.m4 2002-04-18 21:33:31.716576810 +0900 +@@ -0,0 +1,5 @@ ++define(`_DRAC_', `') ++ ++LOCAL_CONFIG ++Kdrac ifelse(defn(`_ARG_'), `', DATABASE_MAP_TYPE MAIL_SETTINGS_DIR`drac', ++ `_ARG_') diff --git a/debian/patches/8.13/8.13.3/ldap_url_search.p0 b/debian/patches/8.13/8.13.3/ldap_url_search.p0 new file mode 100644 index 0000000..9b8d70b --- /dev/null +++ b/debian/patches/8.13/8.13.3/ldap_url_search.p0 @@ -0,0 +1,24 @@ +Index: ldap.c +=================================================================== +RCS file: /cvs/libsm/ldap.c,v +retrieving revision 1.51 +retrieving revision 1.53 +diff -u -r1.51 -r1.53 +--- ./sendmail-8.13.3/libsm/ldap.c 30 Oct 2003 23:11:12 -0000 1.51 ++++ ldap.c 30 Oct 2003 23:33:10 -0000 1.53 +@@ -1043,6 +1043,7 @@ + NULL : lmap->ldap_attr), + lmap->ldap_attrsonly); + } ++#if SM_CONF_LDAP_URL_SEARCH + else if (rl->lr_type == SM_LDAP_ATTR_URL) + { + /* do new URL search */ +@@ -1051,6 +1052,7 @@ + lmap->ldap_attrsonly); + newflags |= SM_LDAP_USE_ALLATTR; + } ++#endif /* SM_CONF_LDAP_URL_SEARCH */ + else + { + /* unknown or illegal attribute type */ diff --git a/debian/patches/8.12/8.12.3/maxseq.patch b/debian/patches/8.13/8.13.3/maxseq.patch index 3b2009b..c5fe6c8 100644 --- a/debian/patches/8.12/8.12.3/maxseq.patch +++ b/debian/patches/8.13/8.13.3/maxseq.patch @@ -18,8 +18,8 @@ #### Patch data follows #### diff -c 'conf.h' 'conf.h.new' Index: ./conf.h -Prereq: 8.560 -*** ./sendmail-8.12.3/sendmail/conf.h Fri Sep 21 19:01:46 2001 +Prereq: 8.567 +*** ./sendmail-8.13.3/sendmail/conf.h Fri Sep 21 19:01:46 2001 --- ./conf.h.new Wed Oct 10 09:24:41 2001 *************** *** 71,76 **** diff --git a/debian/patches/8.13/8.13.3/qtool.patch b/debian/patches/8.13/8.13.3/qtool.patch new file mode 100644 index 0000000..5474c63 --- /dev/null +++ b/debian/patches/8.13/8.13.3/qtool.patch @@ -0,0 +1,101 @@ +*** ./sendmail-8.13.3/contrib/qtool.pl Wed Mar 5 16:11:54 2003 +--- ./sendmail-8.13.3/contrib/qtool.pl Wed Mar 5 15:59:10 2003 +*************** +*** 355,373 **** + sub lock_file + { + my $file_name = shift; + my $result; + + $result = sysopen(FILE_TO_LOCK, $file_name, Fcntl::O_RDWR); + if (!$result) + { + return (undef, "Unable to open '$file_name': $!"); + } + +! $result = flock(FILE_TO_LOCK, Fcntl::LOCK_EX | Fcntl::LOCK_NB); +! if (!$result) + { + return (undef, "Could not obtain lock on '$file_name': $!"); + } + + return (\*FILE_TO_LOCK, undef); + } +--- 355,394 ---- + sub lock_file + { + my $file_name = shift; + my $result; + ++ my $FLOCK_STRUCT; ++ my $fcntllock; ++ ++ # Supposedly under linux ++ # my $FLOCK_STRUCT = 's s l l i'; ++ # But I think perl's using __off64_t instead of __off_t ++ # my $FLOCK_STRUCT = 's s l l l l i'; ++ # Screw it, its all zero anyway... ++ ++ $FLOCK_STRUCT = 's H60'; ++ $fcntllock = pack($FLOCK_STRUCT, F_WRLCK, ++ "000000000000000000000000000000000000000000000000000000000000"); ++ + $result = sysopen(FILE_TO_LOCK, $file_name, Fcntl::O_RDWR); + if (!$result) + { ++ # print "Unable to open '$file_name': $!"; + return (undef, "Unable to open '$file_name': $!"); + } + +! $result = fcntl (FILE_TO_LOCK, F_SETLK, $fcntllock); +! +! # print "Fcntl Lock result on $file_name = $result\n"; +! +! # $result = flock(FILE_TO_LOCK, Fcntl::LOCK_EX | Fcntl::LOCK_NB); +! # print "Lock result on $file_name = $result\n"; +! # if (!$result) +! if ($result ne "0 but true") + { ++ # print "Could not obtain lock on '$file_name': $!\n"; + return (undef, "Could not obtain lock on '$file_name': $!"); + } + + return (\*FILE_TO_LOCK, undef); + } +*************** +*** 387,399 **** + + sub unlock_file + { + my $file = shift; + my $result; + +! $result = flock($file, Fcntl::LOCK_UN); +! if (!$result) + { + return "Unlock failed on '$result': $!"; + } + + return undef; +--- 408,428 ---- + + sub unlock_file + { + my $file = shift; + my $result; ++ my $FLOCK_STRUCT; ++ my $fcntllock; + +! $FLOCK_STRUCT = 's H60'; +! $fcntllock = pack($FLOCK_STRUCT, F_UNLCK, +! "000000000000000000000000000000000000000000000000000000000000"); +! $result = fcntl (FILE_TO_LOCK, F_SETLK, $fcntllock); +! +! if ($result ne "0 but true") +! # $result = flock($file, Fcntl::LOCK_UN); +! # if (!$result) + { + return "Unlock failed on '$result': $!"; + } + + return undef; diff --git a/debian/patches/8.13/srvrsmtp.c b/debian/patches/8.13/srvrsmtp.c new file mode 100644 index 0000000..728a5fc --- /dev/null +++ b/debian/patches/8.13/srvrsmtp.c @@ -0,0 +1,4702 @@ +/* + * Copyright (c) 1998-2004 Sendmail, Inc. and its suppliers. + * All rights reserved. + * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * By using this file, you agree to the terms and conditions set + * forth in the LICENSE file which can be found at the top level of + * the sendmail distribution. + * + */ + +#include <sendmail.h> +#if MILTER +# include <libmilter/mfapi.h> +# include <libmilter/mfdef.h> +#endif /* MILTER */ + +SM_RCSID("@(#)$Id: srvrsmtp.c,v 8.900 2004/07/08 23:29:33 ca Exp $") + +#include <sys/time.h> +#include <sm/fdset.h> + +#if SASL || STARTTLS +# include "sfsasl.h" +#endif /* SASL || STARTTLS */ +#if SASL +# define ENC64LEN(l) (((l) + 2) * 4 / 3 + 1) +static int saslmechs __P((sasl_conn_t *, char **)); +#endif /* SASL */ +#if STARTTLS +# include <sysexits.h> + +static SSL_CTX *srv_ctx = NULL; /* TLS server context */ +static SSL *srv_ssl = NULL; /* per connection context */ + +static bool tls_ok_srv = false; + +extern void tls_set_verify __P((SSL_CTX *, SSL *, bool)); +# define TLS_VERIFY_CLIENT() tls_set_verify(srv_ctx, srv_ssl, \ + bitset(SRV_VRFY_CLT, features)) +#endif /* STARTTLS */ + +/* server features */ +#define SRV_NONE 0x0000 /* none... */ +#define SRV_OFFER_TLS 0x0001 /* offer STARTTLS */ +#define SRV_VRFY_CLT 0x0002 /* request a cert */ +#define SRV_OFFER_AUTH 0x0004 /* offer AUTH */ +#define SRV_OFFER_ETRN 0x0008 /* offer ETRN */ +#define SRV_OFFER_VRFY 0x0010 /* offer VRFY (not yet used) */ +#define SRV_OFFER_EXPN 0x0020 /* offer EXPN */ +#define SRV_OFFER_VERB 0x0040 /* offer VERB */ +#define SRV_OFFER_DSN 0x0080 /* offer DSN */ +#if PIPELINING +# define SRV_OFFER_PIPE 0x0100 /* offer PIPELINING */ +# if _FFR_NO_PIPE +# define SRV_NO_PIPE 0x0200 /* disable PIPELINING, sleep if used */ +# endif /* _FFR_NO_PIPE */ +#endif /* PIPELINING */ +#define SRV_REQ_AUTH 0x0400 /* require AUTH */ +#define SRV_REQ_SEC 0x0800 /* require security - equiv to AuthOptions=p */ +#define SRV_TMP_FAIL 0x1000 /* ruleset caused a temporary failure */ + +static unsigned int srvfeatures __P((ENVELOPE *, char *, unsigned int)); + +#define STOP_ATTACK ((time_t) -1) +static time_t checksmtpattack __P((volatile unsigned int *, unsigned int, + bool, char *, ENVELOPE *)); +static void mail_esmtp_args __P((char *, char *, ENVELOPE *)); +static void printvrfyaddr __P((ADDRESS *, bool, bool)); +static void rcpt_esmtp_args __P((ADDRESS *, char *, char *, ENVELOPE *)); +static char *skipword __P((char *volatile, char *)); +static void setup_smtpd_io __P((void)); + +#if SASL +# if SASL >= 20000 +static int reset_saslconn __P((sasl_conn_t **_conn, char *_hostname, + char *_remoteip, char *_localip, + char *_auth_id, sasl_ssf_t *_ext_ssf)); + +# define RESET_SASLCONN \ + result = reset_saslconn(&conn, AuthRealm, remoteip, localip, auth_id, \ + &ext_ssf); \ + if (result != SASL_OK) \ + { \ + /* This is pretty fatal */ \ + goto doquit; \ + } + +# else /* SASL >= 20000 */ +static int reset_saslconn __P((sasl_conn_t **_conn, char *_hostname, + struct sockaddr_in *_saddr_r, + struct sockaddr_in *_saddr_l, + sasl_external_properties_t *_ext_ssf)); +# define RESET_SASLCONN \ + result = reset_saslconn(&conn, AuthRealm, &saddr_r, &saddr_l, &ext_ssf); \ + if (result != SASL_OK) \ + { \ + /* This is pretty fatal */ \ + goto doquit; \ + } + +# endif /* SASL >= 20000 */ +#endif /* SASL */ + +extern ENVELOPE BlankEnvelope; + +#define NBADRCPTS \ + do \ + { \ + char buf[16]; \ + (void) sm_snprintf(buf, sizeof buf, "%d", \ + BadRcptThrottle > 0 && n_badrcpts > BadRcptThrottle \ + ? n_badrcpts - 1 : n_badrcpts); \ + macdefine(&e->e_macro, A_TEMP, macid("{nbadrcpts}"), buf); \ + } while (0) + +#define SKIP_SPACE(s) while (isascii(*s) && isspace(*s)) \ + (s)++ + +/* +** SMTP -- run the SMTP protocol. +** +** Parameters: +** nullserver -- if non-NULL, rejection message for +** (almost) all SMTP commands. +** d_flags -- daemon flags +** e -- the envelope. +** +** Returns: +** never. +** +** Side Effects: +** Reads commands from the input channel and processes them. +*/ + +/* +** Notice: The smtp server doesn't have a session context like the client +** side has (mci). Therefore some data (session oriented) is allocated +** or assigned to the "wrong" structure (esp. STARTTLS, AUTH). +** This should be fixed in a successor version. +*/ + +struct cmd +{ + char *cmd_name; /* command name */ + int cmd_code; /* internal code, see below */ +}; + +/* values for cmd_code */ +#define CMDERROR 0 /* bad command */ +#define CMDMAIL 1 /* mail -- designate sender */ +#define CMDRCPT 2 /* rcpt -- designate recipient */ +#define CMDDATA 3 /* data -- send message text */ +#define CMDRSET 4 /* rset -- reset state */ +#define CMDVRFY 5 /* vrfy -- verify address */ +#define CMDEXPN 6 /* expn -- expand address */ +#define CMDNOOP 7 /* noop -- do nothing */ +#define CMDQUIT 8 /* quit -- close connection and die */ +#define CMDHELO 9 /* helo -- be polite */ +#define CMDHELP 10 /* help -- give usage info */ +#define CMDEHLO 11 /* ehlo -- extended helo (RFC 1425) */ +#define CMDETRN 12 /* etrn -- flush queue */ +#if SASL +# define CMDAUTH 13 /* auth -- SASL authenticate */ +#endif /* SASL */ +#if STARTTLS +# define CMDSTLS 14 /* STARTTLS -- start TLS session */ +#endif /* STARTTLS */ +/* non-standard commands */ +#define CMDVERB 17 /* verb -- go into verbose mode */ +/* unimplemented commands from RFC 821 */ +#define CMDUNIMPL 19 /* unimplemented rfc821 commands */ +/* use this to catch and log "door handle" attempts on your system */ +#define CMDLOGBOGUS 23 /* bogus command that should be logged */ +/* debugging-only commands, only enabled if SMTPDEBUG is defined */ +#define CMDDBGQSHOW 24 /* showq -- show send queue */ +#define CMDDBGDEBUG 25 /* debug -- set debug mode */ + +/* +** Note: If you change this list, remember to update 'helpfile' +*/ + +static struct cmd CmdTab[] = +{ + { "mail", CMDMAIL }, + { "rcpt", CMDRCPT }, + { "data", CMDDATA }, + { "rset", CMDRSET }, + { "vrfy", CMDVRFY }, + { "expn", CMDEXPN }, + { "help", CMDHELP }, + { "noop", CMDNOOP }, + { "quit", CMDQUIT }, + { "helo", CMDHELO }, + { "ehlo", CMDEHLO }, + { "etrn", CMDETRN }, + { "verb", CMDVERB }, + { "send", CMDUNIMPL }, + { "saml", CMDUNIMPL }, + { "soml", CMDUNIMPL }, + { "turn", CMDUNIMPL }, +#if SASL + { "auth", CMDAUTH, }, +#endif /* SASL */ +#if STARTTLS + { "starttls", CMDSTLS, }, +#endif /* STARTTLS */ + /* remaining commands are here only to trap and log attempts to use them */ + { "showq", CMDDBGQSHOW }, + { "debug", CMDDBGDEBUG }, + { "wiz", CMDLOGBOGUS }, + + { NULL, CMDERROR } +}; + +static char *CurSmtpClient; /* who's at the other end of channel */ + +#ifndef MAXBADCOMMANDS +# define MAXBADCOMMANDS 25 /* maximum number of bad commands */ +#endif /* ! MAXBADCOMMANDS */ +#ifndef MAXNOOPCOMMANDS +# define MAXNOOPCOMMANDS 20 /* max "noise" commands before slowdown */ +#endif /* ! MAXNOOPCOMMANDS */ +#ifndef MAXHELOCOMMANDS +# define MAXHELOCOMMANDS 3 /* max HELO/EHLO commands before slowdown */ +#endif /* ! MAXHELOCOMMANDS */ +#ifndef MAXVRFYCOMMANDS +# define MAXVRFYCOMMANDS 6 /* max VRFY/EXPN commands before slowdown */ +#endif /* ! MAXVRFYCOMMANDS */ +#ifndef MAXETRNCOMMANDS +# define MAXETRNCOMMANDS 8 /* max ETRN commands before slowdown */ +#endif /* ! MAXETRNCOMMANDS */ +#ifndef MAXTIMEOUT +# define MAXTIMEOUT (4 * 60) /* max timeout for bad commands */ +#endif /* ! MAXTIMEOUT */ + +/* +** Maximum shift value to compute timeout for bad commands. +** This introduces an upper limit of 2^MAXSHIFT for the timeout. +*/ + +#ifndef MAXSHIFT +# define MAXSHIFT 8 +#endif /* ! MAXSHIFT */ +#if MAXSHIFT > 31 + ERROR _MAXSHIFT > 31 is invalid +#endif /* MAXSHIFT */ + + +#if MAXBADCOMMANDS > 0 +# define STOP_IF_ATTACK(r) do \ + { \ + if ((r) == STOP_ATTACK) \ + goto stopattack; \ + } while (0) + +#else /* MAXBADCOMMANDS > 0 */ +# define STOP_IF_ATTACK(r) r +#endif /* MAXBADCOMMANDS > 0 */ + + +#if SM_HEAP_CHECK +static SM_DEBUG_T DebugLeakSmtp = SM_DEBUG_INITIALIZER("leak_smtp", + "@(#)$Debug: leak_smtp - trace memory leaks during SMTP processing $"); +#endif /* SM_HEAP_CHECK */ + +typedef struct +{ + bool sm_gotmail; /* mail command received */ + unsigned int sm_nrcpts; /* number of successful RCPT commands */ + bool sm_discard; +#if MILTER + bool sm_milterize; + bool sm_milterlist; /* any filters in the list? */ +#endif /* MILTER */ + char *sm_quarmsg; /* carry quarantining across messages */ +} SMTP_T; + +static bool smtp_data __P((SMTP_T *, ENVELOPE *)); + +#define MSG_TEMPFAIL "451 4.3.2 Please try again later" + +#if MILTER +# define MILTER_ABORT(e) milter_abort((e)) + +# define MILTER_REPLY(str) \ + { \ + int savelogusrerrs = LogUsrErrs; \ + \ + switch (state) \ + { \ + case SMFIR_REPLYCODE: \ + if (MilterLogLevel > 3) \ + { \ + sm_syslog(LOG_INFO, e->e_id, \ + "Milter: %s=%s, reject=%s", \ + str, addr, response); \ + LogUsrErrs = false; \ + } \ + if (strncmp(response, "421 ", 4) == 0) \ + { \ + bool tsave = QuickAbort; \ + \ + QuickAbort = false; \ + usrerr(response); \ + QuickAbort = tsave; \ + e->e_sendqueue = NULL; \ + goto doquit; \ + } \ + else \ + usrerr(response); \ + break; \ + \ + case SMFIR_REJECT: \ + if (MilterLogLevel > 3) \ + { \ + sm_syslog(LOG_INFO, e->e_id, \ + "Milter: %s=%s, reject=550 5.7.1 Command rejected", \ + str, addr); \ + LogUsrErrs = false; \ + } \ + usrerr("550 5.7.1 Command rejected"); \ + break; \ + \ + case SMFIR_DISCARD: \ + if (MilterLogLevel > 3) \ + sm_syslog(LOG_INFO, e->e_id, \ + "Milter: %s=%s, discard", \ + str, addr); \ + e->e_flags |= EF_DISCARD; \ + break; \ + \ + case SMFIR_TEMPFAIL: \ + if (MilterLogLevel > 3) \ + { \ + sm_syslog(LOG_INFO, e->e_id, \ + "Milter: %s=%s, reject=%s", \ + str, addr, MSG_TEMPFAIL); \ + LogUsrErrs = false; \ + } \ + usrerr(MSG_TEMPFAIL); \ + break; \ + } \ + LogUsrErrs = savelogusrerrs; \ + if (response != NULL) \ + sm_free(response); /* XXX */ \ + } + +#else /* MILTER */ +# define MILTER_ABORT(e) +#endif /* MILTER */ + +/* clear all SMTP state (for HELO/EHLO/RSET) */ +#define CLEAR_STATE(cmd) \ +do \ +{ \ + /* abort milter filters */ \ + MILTER_ABORT(e); \ + \ + if (smtp.sm_nrcpts > 0) \ + { \ + logundelrcpts(e, cmd, 10, false); \ + smtp.sm_nrcpts = 0; \ + macdefine(&e->e_macro, A_PERM, \ + macid("{nrcpts}"), "0"); \ + } \ + \ + e->e_sendqueue = NULL; \ + e->e_flags |= EF_CLRQUEUE; \ + \ + if (LogLevel > 4 && bitset(EF_LOGSENDER, e->e_flags)) \ + logsender(e, NULL); \ + e->e_flags &= ~EF_LOGSENDER; \ + \ + /* clean up a bit */ \ + smtp.sm_gotmail = false; \ + SuprErrs = true; \ + dropenvelope(e, true, false); \ + sm_rpool_free(e->e_rpool); \ + e = newenvelope(e, CurEnv, sm_rpool_new_x(NULL)); \ + CurEnv = e; \ + \ + /* put back discard bit */ \ + if (smtp.sm_discard) \ + e->e_flags |= EF_DISCARD; \ + \ + /* restore connection quarantining */ \ + if (smtp.sm_quarmsg == NULL) \ + { \ + e->e_quarmsg = NULL; \ + macdefine(&e->e_macro, A_PERM, \ + macid("{quarantine}"), ""); \ + } \ + else \ + { \ + e->e_quarmsg = sm_rpool_strdup_x(e->e_rpool, \ + smtp.sm_quarmsg); \ + macdefine(&e->e_macro, A_PERM, macid("{quarantine}"), \ + e->e_quarmsg); \ + } \ +} while (0) + +/* sleep to flatten out connection load */ +#define MIN_DELAY_LOG 15 /* wait before logging this again */ + +/* is it worth setting the process title for 1s? */ +#define DELAY_CONN(cmd) \ + if (DelayLA > 0 && (CurrentLA = getla()) >= DelayLA) \ + { \ + time_t dnow; \ + \ + sm_setproctitle(true, e, \ + "%s: %s: delaying %s: load average: %d", \ + qid_printname(e), CurSmtpClient, \ + cmd, DelayLA); \ + if (LogLevel > 8 && (dnow = curtime()) > log_delay) \ + { \ + sm_syslog(LOG_INFO, e->e_id, \ + "delaying=%s, load average=%d >= %d", \ + cmd, CurrentLA, DelayLA); \ + log_delay = dnow + MIN_DELAY_LOG; \ + } \ + (void) sleep(1); \ + sm_setproctitle(true, e, "%s %s: %.80s", \ + qid_printname(e), CurSmtpClient, inp); \ + } + + +void +smtp(nullserver, d_flags, e) + char *volatile nullserver; + BITMAP256 d_flags; + register ENVELOPE *volatile e; +{ + register char *volatile p; + register struct cmd *volatile c = NULL; + char *cmd; + auto ADDRESS *vrfyqueue; + ADDRESS *a; + volatile bool gothello; /* helo command received */ + bool vrfy; /* set if this is a vrfy command */ + char *volatile protocol; /* sending protocol */ + char *volatile sendinghost; /* sending hostname */ + char *volatile peerhostname; /* name of SMTP peer or "localhost" */ + char *volatile hello_name; /* client_hello string */ + bool hello_acceptd = false; /* helo/ehlo command accepted */ + auto char *delimptr; + char *id; + volatile unsigned int n_badcmds = 0; /* count of bad commands */ + volatile unsigned int n_badrcpts = 0; /* number of rejected RCPT */ + volatile unsigned int n_verifies = 0; /* count of VRFY/EXPN */ + volatile unsigned int n_etrn = 0; /* count of ETRN */ + volatile unsigned int n_noop = 0; /* count of NOOP/VERB/etc */ + volatile unsigned int n_helo = 0; /* count of HELO/EHLO */ + volatile int save_sevenbitinput; + bool ok; +#if _FFR_BLOCK_PROXIES + volatile bool first; +#endif /* _FFR_BLOCK_PROXIES */ + volatile bool tempfail = false; + volatile time_t wt; /* timeout after too many commands */ + volatile time_t previous; /* time after checksmtpattack() */ + volatile bool lognullconnection = true; + register char *q; + SMTP_T smtp; + char *addr; + char *greetcode = "220"; + char *hostname; /* my hostname ($j) */ + QUEUE_CHAR *new; + int argno; + char *args[MAXSMTPARGS]; + char inp[MAXLINE]; + char cmdbuf[MAXLINE]; +#if SASL + sasl_conn_t *conn; + volatile bool sasl_ok; + volatile unsigned int n_auth = 0; /* count of AUTH commands */ + bool ismore; + int result; + volatile int authenticating; + char *user; + char *in, *out2; +# if SASL >= 20000 + char *auth_id; + const char *out; + sasl_ssf_t ext_ssf; + char localip[60], remoteip[60]; +# else /* SASL >= 20000 */ + char *out; + const char *errstr; + sasl_external_properties_t ext_ssf; + struct sockaddr_in saddr_l; + struct sockaddr_in saddr_r; +# endif /* SASL >= 20000 */ + sasl_security_properties_t ssp; + sasl_ssf_t *ssf; + unsigned int inlen, out2len; + unsigned int outlen; + char *volatile auth_type; + char *mechlist; + volatile unsigned int n_mechs; + unsigned int len; +#endif /* SASL */ + int r; +#if STARTTLS + int fdfl; + int rfd, wfd; + volatile bool tls_active = false; + volatile bool smtps = bitnset(D_SMTPS, d_flags); + bool saveQuickAbort; + bool saveSuprErrs; + time_t tlsstart; +#endif /* STARTTLS */ + volatile unsigned int features; +#if PIPELINING +# if _FFR_NO_PIPE + int np_log = 0; +# endif /* _FFR_NO_PIPE */ +#endif /* PIPELINING */ + volatile time_t log_delay = (time_t) 0; + + save_sevenbitinput = SevenBitInput; + smtp.sm_nrcpts = 0; +#if MILTER + smtp.sm_milterize = (nullserver == NULL); + smtp.sm_milterlist = false; +#endif /* MILTER */ + + /* setup I/O fd correctly for the SMTP server */ + setup_smtpd_io(); + +#if SM_HEAP_CHECK + if (sm_debug_active(&DebugLeakSmtp, 1)) + { + sm_heap_newgroup(); + sm_dprintf("smtp() heap group #%d\n", sm_heap_group()); + } +#endif /* SM_HEAP_CHECK */ + + /* XXX the rpool should be set when e is initialized in main() */ + e->e_rpool = sm_rpool_new_x(NULL); + e->e_macro.mac_rpool = e->e_rpool; + + settime(e); + sm_getla(); + peerhostname = RealHostName; + if (peerhostname == NULL) + peerhostname = "localhost"; + CurHostName = peerhostname; + CurSmtpClient = macvalue('_', e); + if (CurSmtpClient == NULL) + CurSmtpClient = CurHostName; + + /* check_relay may have set discard bit, save for later */ + smtp.sm_discard = bitset(EF_DISCARD, e->e_flags); + +#if PIPELINING + /* auto-flush output when reading input */ + (void) sm_io_autoflush(InChannel, OutChannel); +#endif /* PIPELINING */ + + sm_setproctitle(true, e, "server %s startup", CurSmtpClient); + + /* Set default features for server. */ + features = ((bitset(PRIV_NOETRN, PrivacyFlags) || + bitnset(D_NOETRN, d_flags)) ? SRV_NONE : SRV_OFFER_ETRN) + | (bitnset(D_AUTHREQ, d_flags) ? SRV_REQ_AUTH : SRV_NONE) + | (bitset(PRIV_NOEXPN, PrivacyFlags) ? SRV_NONE + : (SRV_OFFER_EXPN + | (bitset(PRIV_NOVERB, PrivacyFlags) + ? SRV_NONE : SRV_OFFER_VERB))) + | (bitset(PRIV_NORECEIPTS, PrivacyFlags) ? SRV_NONE + : SRV_OFFER_DSN) +#if SASL + | (bitnset(D_NOAUTH, d_flags) ? SRV_NONE : SRV_OFFER_AUTH) + | (bitset(SASL_SEC_NOPLAINTEXT, SASLOpts) ? SRV_REQ_SEC + : SRV_NONE) +#endif /* SASL */ +#if PIPELINING + | SRV_OFFER_PIPE +#endif /* PIPELINING */ +#if STARTTLS + | (bitnset(D_NOTLS, d_flags) ? SRV_NONE : SRV_OFFER_TLS) + | (bitset(TLS_I_NO_VRFY, TLS_Srv_Opts) ? SRV_NONE + : SRV_VRFY_CLT) +#endif /* STARTTLS */ + ; + if (nullserver == NULL) + { + features = srvfeatures(e, CurSmtpClient, features); + if (bitset(SRV_TMP_FAIL, features)) + { + if (LogLevel > 4) + sm_syslog(LOG_ERR, NOQID, + "ERROR: srv_features=tempfail, relay=%.100s, access temporarily disabled", + CurSmtpClient); + nullserver = "450 4.3.0 Please try again later."; + } + else + { +#if PIPELINING +# if _FFR_NO_PIPE + if (bitset(SRV_NO_PIPE, features)) + { + /* for consistency */ + features &= ~SRV_OFFER_PIPE; + } +# endif /* _FFR_NO_PIPE */ +#endif /* PIPELINING */ +#if SASL + if (bitset(SRV_REQ_SEC, features)) + SASLOpts |= SASL_SEC_NOPLAINTEXT; + else + SASLOpts &= ~SASL_SEC_NOPLAINTEXT; +#endif /* SASL */ + } + } + else if (strncmp(nullserver, "421 ", 4) == 0) + { + message(nullserver); + goto doquit; + } + + hostname = macvalue('j', e); +#if SASL + if (AuthRealm == NULL) + AuthRealm = hostname; + sasl_ok = bitset(SRV_OFFER_AUTH, features); + n_mechs = 0; + authenticating = SASL_NOT_AUTH; + + /* SASL server new connection */ + if (sasl_ok) + { +# if SASL >= 20000 + result = sasl_server_new("smtp", AuthRealm, NULL, NULL, NULL, + NULL, 0, &conn); +# elif SASL > 10505 + /* use empty realm: only works in SASL > 1.5.5 */ + result = sasl_server_new("smtp", AuthRealm, "", NULL, 0, &conn); +# else /* SASL >= 20000 */ + /* use no realm -> realm is set to hostname by SASL lib */ + result = sasl_server_new("smtp", AuthRealm, NULL, NULL, 0, + &conn); +# endif /* SASL >= 20000 */ + sasl_ok = result == SASL_OK; + if (!sasl_ok) + { + if (LogLevel > 9) + sm_syslog(LOG_WARNING, NOQID, + "AUTH error: sasl_server_new failed=%d", + result); + } + } + if (sasl_ok) + { + /* + ** SASL set properties for sasl + ** set local/remote IP + ** XXX Cyrus SASL v1 only supports IPv4 + ** + ** XXX where exactly are these used/required? + ** Kerberos_v4 + */ + +# if SASL >= 20000 +# if NETINET || NETINET6 + in = macvalue(macid("{daemon_family}"), e); + if (in != NULL && ( +# if NETINET6 + strcmp(in, "inet6") == 0 || +# endif /* NETINET6 */ + strcmp(in, "inet") == 0)) + { + SOCKADDR_LEN_T addrsize; + SOCKADDR saddr_l; + SOCKADDR saddr_r; + + addrsize = sizeof(saddr_r); + if (getpeername(sm_io_getinfo(InChannel, SM_IO_WHAT_FD, + NULL), + (struct sockaddr *) &saddr_r, + &addrsize) == 0) + { + if (iptostring(&saddr_r, addrsize, + remoteip, sizeof remoteip)) + { + sasl_setprop(conn, SASL_IPREMOTEPORT, + remoteip); + } + addrsize = sizeof(saddr_l); + if (getsockname(sm_io_getinfo(InChannel, + SM_IO_WHAT_FD, + NULL), + (struct sockaddr *) &saddr_l, + &addrsize) == 0) + { + if (iptostring(&saddr_l, addrsize, + localip, + sizeof localip)) + { + sasl_setprop(conn, + SASL_IPLOCALPORT, + localip); + } + } + } + } +# endif /* NETINET || NETINET6 */ +# else /* SASL >= 20000 */ +# if NETINET + in = macvalue(macid("{daemon_family}"), e); + if (in != NULL && strcmp(in, "inet") == 0) + { + SOCKADDR_LEN_T addrsize; + + addrsize = sizeof(struct sockaddr_in); + if (getpeername(sm_io_getinfo(InChannel, SM_IO_WHAT_FD, + NULL), + (struct sockaddr *)&saddr_r, + &addrsize) == 0) + { + sasl_setprop(conn, SASL_IP_REMOTE, &saddr_r); + addrsize = sizeof(struct sockaddr_in); + if (getsockname(sm_io_getinfo(InChannel, + SM_IO_WHAT_FD, + NULL), + (struct sockaddr *)&saddr_l, + &addrsize) == 0) + sasl_setprop(conn, SASL_IP_LOCAL, + &saddr_l); + } + } +# endif /* NETINET */ +# endif /* SASL >= 20000 */ + + auth_type = NULL; + mechlist = NULL; + user = NULL; +# if 0 + macdefine(&BlankEnvelope.e_macro, A_PERM, + macid("{auth_author}"), NULL); +# endif /* 0 */ + + /* set properties */ + (void) memset(&ssp, '\0', sizeof ssp); + + /* XXX should these be options settable via .cf ? */ + /* ssp.min_ssf = 0; is default due to memset() */ +# if STARTTLS +# endif /* STARTTLS */ + { + ssp.max_ssf = MaxSLBits; + ssp.maxbufsize = MAXOUTLEN; + } + ssp.security_flags = SASLOpts & SASL_SEC_MASK; + sasl_ok = sasl_setprop(conn, SASL_SEC_PROPS, &ssp) == SASL_OK; + + if (sasl_ok) + { + /* + ** external security strength factor; + ** currently we have none so zero + */ + +# if SASL >= 20000 + ext_ssf = 0; + auth_id = NULL; + sasl_ok = ((sasl_setprop(conn, SASL_SSF_EXTERNAL, + &ext_ssf) == SASL_OK) && + (sasl_setprop(conn, SASL_AUTH_EXTERNAL, + auth_id) == SASL_OK)); +# else /* SASL >= 20000 */ + ext_ssf.ssf = 0; + ext_ssf.auth_id = NULL; + sasl_ok = sasl_setprop(conn, SASL_SSF_EXTERNAL, + &ext_ssf) == SASL_OK; +# endif /* SASL >= 20000 */ + } + if (sasl_ok) + n_mechs = saslmechs(conn, &mechlist); + } +#endif /* SASL */ + +#if STARTTLS +#endif /* STARTTLS */ + +#if MILTER + if (smtp.sm_milterize) + { + char state; + + /* initialize mail filter connection */ + smtp.sm_milterlist = milter_init(e, &state); + switch (state) + { + case SMFIR_REJECT: + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: initialization failed, rejecting commands"); + greetcode = "554"; + nullserver = "Command rejected"; + smtp.sm_milterize = false; + break; + + case SMFIR_TEMPFAIL: + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: initialization failed, temp failing commands"); + tempfail = true; + smtp.sm_milterize = false; + break; + } + } + + if (smtp.sm_milterlist && smtp.sm_milterize && + !bitset(EF_DISCARD, e->e_flags)) + { + char state; + char *response; + + response = milter_connect(peerhostname, RealHostAddr, + e, &state); + switch (state) + { + case SMFIR_REPLYCODE: /* REPLYCODE shouldn't happen */ + case SMFIR_REJECT: + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: connect: host=%s, addr=%s, rejecting commands", + peerhostname, + anynet_ntoa(&RealHostAddr)); + greetcode = "554"; + nullserver = "Command rejected"; + smtp.sm_milterize = false; + break; + + case SMFIR_TEMPFAIL: + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: connect: host=%s, addr=%s, temp failing commands", + peerhostname, + anynet_ntoa(&RealHostAddr)); + tempfail = true; + smtp.sm_milterize = false; + break; + + case SMFIR_SHUTDOWN: + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: connect: host=%s, addr=%s, shutdown", + peerhostname, + anynet_ntoa(&RealHostAddr)); + tempfail = true; + smtp.sm_milterize = false; + message("421 4.7.0 %s closing connection", + MyHostName); + + /* arrange to ignore send list */ + e->e_sendqueue = NULL; + goto doquit; + } + if (response != NULL) + sm_free(response); /* XXX */ + } +#endif /* MILTER */ + + /* + ** Broken proxies and SMTP slammers + ** push data without waiting, catch them + */ + + if ( +#if STARTTLS + !smtps && +#endif /* STARTTLS */ + *greetcode == '2') + { + time_t msecs = 0; + char **pvp; + char pvpbuf[PSBUFSIZE]; + + /* Ask the rulesets how long to pause */ + pvp = NULL; + r = rscap("greet_pause", peerhostname, + anynet_ntoa(&RealHostAddr), e, + &pvp, pvpbuf, sizeof(pvpbuf)); + if (r == EX_OK && pvp != NULL && pvp[0] != NULL && + (pvp[0][0] & 0377) == CANONNET && pvp[1] != NULL) + { + msecs = strtol(pvp[1], NULL, 10); + } + + if (msecs > 0) + { + int fd; + fd_set readfds; + struct timeval timeout; + + /* pause for a moment */ + timeout.tv_sec = msecs / 1000; + timeout.tv_usec = (msecs % 1000) * 1000; + + /* Obey RFC 2821: 4.3.5.2: 220 timeout of 5 minutes */ + if (timeout.tv_sec >= 300) + { + timeout.tv_sec = 300; + timeout.tv_usec = 0; + } + + /* check if data is on the socket during the pause */ + fd = sm_io_getinfo(InChannel, SM_IO_WHAT_FD, NULL); + FD_ZERO(&readfds); + SM_FD_SET(fd, &readfds); + if (select(fd + 1, FDSET_CAST &readfds, + NULL, NULL, &timeout) > 0 && + FD_ISSET(fd, &readfds)) + { + greetcode = "554"; + nullserver = "Command rejected"; + sm_syslog(LOG_INFO, e->e_id, + "rejecting commands from %s [%s] due to pre-greeting traffic", + peerhostname, + anynet_ntoa(&RealHostAddr)); + } + } + } + +#if STARTTLS + /* If this an smtps connection, start TLS now */ + if (smtps) + { + Errors = 0; + goto starttls; + } + + greeting: + +#endif /* STARTTLS */ + + /* output the first line, inserting "ESMTP" as second word */ + if (*greetcode == '5') + (void) sm_snprintf(inp, sizeof inp, "%s not accepting messages", + hostname); + else + expand(SmtpGreeting, inp, sizeof inp, e); + + p = strchr(inp, '\n'); + if (p != NULL) + *p++ = '\0'; + id = strchr(inp, ' '); + if (id == NULL) + id = &inp[strlen(inp)]; + if (p == NULL) + (void) sm_snprintf(cmdbuf, sizeof cmdbuf, + "%s %%.*s ESMTP%%s", greetcode); + else + (void) sm_snprintf(cmdbuf, sizeof cmdbuf, + "%s-%%.*s ESMTP%%s", greetcode); + message(cmdbuf, (int) (id - inp), inp, id); + + /* output remaining lines */ + while ((id = p) != NULL && (p = strchr(id, '\n')) != NULL) + { + *p++ = '\0'; + if (isascii(*id) && isspace(*id)) + id++; + (void) sm_strlcpyn(cmdbuf, sizeof cmdbuf, 2, greetcode, "-%s"); + message(cmdbuf, id); + } + if (id != NULL) + { + if (isascii(*id) && isspace(*id)) + id++; + (void) sm_strlcpyn(cmdbuf, sizeof cmdbuf, 2, greetcode, " %s"); + message(cmdbuf, id); + } + + protocol = NULL; + sendinghost = macvalue('s', e); + + /* If quarantining by a connect/ehlo action, save between messages */ + if (e->e_quarmsg == NULL) + smtp.sm_quarmsg = NULL; + else + smtp.sm_quarmsg = newstr(e->e_quarmsg); + + /* sendinghost's storage must outlive the current envelope */ + if (sendinghost != NULL) + sendinghost = sm_strdup_x(sendinghost); +#if _FFR_BLOCK_PROXIES + first = true; +#endif /* _FFR_BLOCK_PROXIES */ + gothello = false; + smtp.sm_gotmail = false; + for (;;) + { + SM_TRY + { + QuickAbort = false; + HoldErrs = false; + SuprErrs = false; + LogUsrErrs = false; + OnlyOneError = true; + e->e_flags &= ~(EF_VRFYONLY|EF_GLOBALERRS); + + /* setup for the read */ + e->e_to = NULL; + Errors = 0; + FileName = NULL; + (void) sm_io_flush(smioout, SM_TIME_DEFAULT); + + /* read the input line */ + SmtpPhase = "server cmd read"; + sm_setproctitle(true, e, "server %s cmd read", CurSmtpClient); +#if SASL + /* + ** XXX SMTP AUTH requires accepting any length, + ** at least for challenge/response + */ +#endif /* SASL */ + + /* handle errors */ + if (sm_io_error(OutChannel) || + (p = sfgets(inp, sizeof inp, InChannel, + TimeOuts.to_nextcommand, SmtpPhase)) == NULL) + { + char *d; + + d = macvalue(macid("{daemon_name}"), e); + if (d == NULL) + d = "stdin"; + /* end of file, just die */ + disconnect(1, e); + +#if MILTER + /* close out milter filters */ + milter_quit(e); +#endif /* MILTER */ + + message("421 4.4.1 %s Lost input channel from %s", + MyHostName, CurSmtpClient); + if (LogLevel > (smtp.sm_gotmail ? 1 : 19)) + sm_syslog(LOG_NOTICE, e->e_id, + "lost input channel from %s to %s after %s", + CurSmtpClient, d, + (c == NULL || c->cmd_name == NULL) ? "startup" : c->cmd_name); + /* + ** If have not accepted mail (DATA), do not bounce + ** bad addresses back to sender. + */ + + if (bitset(EF_CLRQUEUE, e->e_flags)) + e->e_sendqueue = NULL; + goto doquit; + } + +#if _FFR_BLOCK_PROXIES + if (first) + { + size_t inplen, cmdlen; + int idx; + char *http_cmd; + static char *http_cmds[] = { "GET", "POST", + "CONNECT", "USER", NULL }; + + inplen = strlen(inp); + for (idx = 0; (http_cmd = http_cmds[idx]) != NULL; + idx++) + { + cmdlen = strlen(http_cmd); + if (cmdlen < inplen && + sm_strncasecmp(inp, http_cmd, cmdlen) == 0 && + isascii(inp[cmdlen]) && isspace(inp[cmdlen])) + { + /* Open proxy, drop it */ + message("421 4.7.0 %s Rejecting open proxy %s", + MyHostName, CurSmtpClient); + sm_syslog(LOG_INFO, e->e_id, + "%s: probable open proxy: command=%.40s", + CurSmtpClient, inp); + goto doquit; + } + } + first = false; + } +#endif /* _FFR_BLOCK_PROXIES */ + + /* clean up end of line */ + fixcrlf(inp, true); + +#if PIPELINING +# if _FFR_NO_PIPE + /* + ** if there is more input and pipelining is disabled: + ** delay ... (and maybe discard the input?) + ** XXX this doesn't really work, at least in tests using + ** telnet SM_IO_IS_READABLE only returns 1 if there were + ** more than 2 input lines available. + */ + + if (bitset(SRV_NO_PIPE, features) && + sm_io_getinfo(InChannel, SM_IO_IS_READABLE, NULL) > 0) + { + if (++np_log < 3) + sm_syslog(LOG_INFO, NOQID, + "unauthorized PIPELINING, sleeping"); + sleep(1); + } + +# endif /* _FFR_NO_PIPE */ +#endif /* PIPELINING */ + +#if SASL + if (authenticating == SASL_PROC_AUTH) + { +# if 0 + if (*inp == '\0') + { + authenticating = SASL_NOT_AUTH; + message("501 5.5.2 missing input"); + RESET_SASLCONN; + continue; + } +# endif /* 0 */ + if (*inp == '*' && *(inp + 1) == '\0') + { + authenticating = SASL_NOT_AUTH; + + /* rfc 2254 4. */ + message("501 5.0.0 AUTH aborted"); + RESET_SASLCONN; + continue; + } + + /* could this be shorter? XXX */ +# if SASL >= 20000 + in = xalloc(strlen(inp) + 1); + result = sasl_decode64(inp, strlen(inp), in, + strlen(inp), &inlen); +# else /* SASL >= 20000 */ + out = xalloc(strlen(inp)); + result = sasl_decode64(inp, strlen(inp), out, &outlen); +# endif /* SASL >= 20000 */ + if (result != SASL_OK) + { + authenticating = SASL_NOT_AUTH; + + /* rfc 2254 4. */ + message("501 5.5.4 cannot decode AUTH parameter %s", + inp); +# if SASL >= 20000 + sm_free(in); +# endif /* SASL >= 20000 */ + RESET_SASLCONN; + continue; + } + +# if SASL >= 20000 + result = sasl_server_step(conn, in, inlen, + &out, &outlen); + sm_free(in); +# else /* SASL >= 20000 */ + result = sasl_server_step(conn, out, outlen, + &out, &outlen, &errstr); +# endif /* SASL >= 20000 */ + + /* get an OK if we're done */ + if (result == SASL_OK) + { + authenticated: + message("235 2.0.0 OK Authenticated"); + authenticating = SASL_IS_AUTH; + macdefine(&BlankEnvelope.e_macro, A_TEMP, + macid("{auth_type}"), auth_type); + +# if SASL >= 20000 + user = macvalue(macid("{auth_authen}"), e); + + /* get security strength (features) */ + result = sasl_getprop(conn, SASL_SSF, + (const void **) &ssf); +# else /* SASL >= 20000 */ + result = sasl_getprop(conn, SASL_USERNAME, + (void **)&user); + if (result != SASL_OK) + { + user = ""; + macdefine(&BlankEnvelope.e_macro, + A_PERM, + macid("{auth_authen}"), NULL); + } + else + { + macdefine(&BlankEnvelope.e_macro, + A_TEMP, + macid("{auth_authen}"), + xtextify(user, "<>\")")); + } + +# if 0 + /* get realm? */ + sasl_getprop(conn, SASL_REALM, (void **) &data); +# endif /* 0 */ + + /* get security strength (features) */ + result = sasl_getprop(conn, SASL_SSF, + (void **) &ssf); +# endif /* SASL >= 20000 */ + if (result != SASL_OK) + { + macdefine(&BlankEnvelope.e_macro, + A_PERM, + macid("{auth_ssf}"), "0"); + ssf = NULL; + } + else + { + char pbuf[8]; + + (void) sm_snprintf(pbuf, sizeof pbuf, + "%u", *ssf); + macdefine(&BlankEnvelope.e_macro, + A_TEMP, + macid("{auth_ssf}"), pbuf); + if (tTd(95, 8)) + sm_dprintf("AUTH auth_ssf: %u\n", + *ssf); + } + + /* + ** Only switch to encrypted connection + ** if a security layer has been negotiated + */ + + if (ssf != NULL && *ssf > 0) + { + /* + ** Convert I/O layer to use SASL. + ** If the call fails, the connection + ** is aborted. + */ + + if (sfdcsasl(&InChannel, &OutChannel, + conn) == 0) + { + /* restart dialogue */ + n_helo = 0; +# if PIPELINING + (void) sm_io_autoflush(InChannel, + OutChannel); +# endif /* PIPELINING */ + } + else + syserr("503 5.3.3 SASL TLS failed"); + } + + /* NULL pointer ok since it's our function */ + if (LogLevel > 8) + sm_syslog(LOG_INFO, NOQID, + "AUTH=server, relay=%s, authid=%.128s, mech=%.16s, bits=%d", + CurSmtpClient, + shortenstring(user, 128), + auth_type, *ssf); + } + else if (result == SASL_CONTINUE) + { + len = ENC64LEN(outlen); + out2 = xalloc(len); + result = sasl_encode64(out, outlen, out2, len, + &out2len); + if (result != SASL_OK) + { + /* correct code? XXX */ + /* 454 Temp. authentication failure */ + message("454 4.5.4 Internal error: unable to encode64"); + if (LogLevel > 5) + sm_syslog(LOG_WARNING, e->e_id, + "AUTH encode64 error [%d for \"%s\"]", + result, out); + /* start over? */ + authenticating = SASL_NOT_AUTH; + } + else + { + message("334 %s", out2); + if (tTd(95, 2)) + sm_dprintf("AUTH continue: msg='%s' len=%u\n", + out2, out2len); + } +# if SASL >= 20000 + sm_free(out2); +# endif /* SASL >= 20000 */ + } + else + { + /* not SASL_OK or SASL_CONT */ + message("535 5.7.0 authentication failed"); + if (LogLevel > 9) + sm_syslog(LOG_WARNING, e->e_id, + "AUTH failure (%s): %s (%d) %s", + auth_type, + sasl_errstring(result, NULL, + NULL), + result, +# if SASL >= 20000 + sasl_errdetail(conn)); +# else /* SASL >= 20000 */ + errstr == NULL ? "" : errstr); +# endif /* SASL >= 20000 */ + RESET_SASLCONN; + authenticating = SASL_NOT_AUTH; + } + } + else + { + /* don't want to do any of this if authenticating */ +#endif /* SASL */ + + /* echo command to transcript */ + if (e->e_xfp != NULL) + (void) sm_io_fprintf(e->e_xfp, SM_TIME_DEFAULT, + "<<< %s\n", inp); + + if (LogLevel > 14) + sm_syslog(LOG_INFO, e->e_id, "<-- %s", inp); + + /* break off command */ + for (p = inp; isascii(*p) && isspace(*p); p++) + continue; + cmd = cmdbuf; + while (*p != '\0' && + !(isascii(*p) && isspace(*p)) && + cmd < &cmdbuf[sizeof cmdbuf - 2]) + *cmd++ = *p++; + *cmd = '\0'; + + /* throw away leading whitespace */ + SKIP_SPACE(p); + + /* decode command */ + for (c = CmdTab; c->cmd_name != NULL; c++) + { + if (sm_strcasecmp(c->cmd_name, cmdbuf) == 0) + break; + } + + /* reset errors */ + errno = 0; + + /* check whether a "non-null" command has been used */ + switch (c->cmd_code) + { +#if SASL + case CMDAUTH: + /* avoid information leak; take first two words? */ + q = "AUTH"; + break; +#endif /* SASL */ + + case CMDMAIL: + case CMDEXPN: + case CMDVRFY: + case CMDETRN: + lognullconnection = false; + /* FALLTHROUGH */ + default: + q = inp; + break; + } + + if (e->e_id == NULL) + sm_setproctitle(true, e, "%s: %.80s", + CurSmtpClient, q); + else + sm_setproctitle(true, e, "%s %s: %.80s", + qid_printname(e), + CurSmtpClient, q); + + /* + ** Process command. + ** + ** If we are running as a null server, return 550 + ** to almost everything. + */ + + if (nullserver != NULL || bitnset(D_ETRNONLY, d_flags)) + { + switch (c->cmd_code) + { + case CMDQUIT: + case CMDHELO: + case CMDEHLO: + case CMDNOOP: + case CMDRSET: + case CMDERROR: + /* process normally */ + break; + + case CMDETRN: + if (bitnset(D_ETRNONLY, d_flags) && + nullserver == NULL) + break; + DELAY_CONN("ETRN"); + /* FALLTHROUGH */ + + default: +#if MAXBADCOMMANDS > 0 + /* theoretically this could overflow */ + if (nullserver != NULL && + ++n_badcmds > MAXBADCOMMANDS) + { + message("421 4.7.0 %s Too many bad commands; closing connection", + MyHostName); + + /* arrange to ignore send list */ + e->e_sendqueue = NULL; + goto doquit; + } +#endif /* MAXBADCOMMANDS > 0 */ + if (nullserver != NULL) + { + if (ISSMTPREPLY(nullserver)) + usrerr(nullserver); + else + usrerr("550 5.0.0 %s", + nullserver); + } + else + usrerr("452 4.4.5 Insufficient disk space; try again later"); + continue; + } + } + + switch (c->cmd_code) + { +#if SASL + case CMDAUTH: /* sasl */ + DELAY_CONN("AUTH"); + if (!sasl_ok || n_mechs <= 0) + { + message("503 5.3.3 AUTH not available"); + break; + } + if (authenticating == SASL_IS_AUTH) + { + message("503 5.5.0 Already Authenticated"); + break; + } + if (smtp.sm_gotmail) + { + message("503 5.5.0 AUTH not permitted during a mail transaction"); + break; + } + if (tempfail) + { + if (LogLevel > 9) + sm_syslog(LOG_INFO, e->e_id, + "SMTP AUTH command (%.100s) from %s tempfailed (due to previous checks)", + p, CurSmtpClient); + usrerr("454 4.3.0 Please try again later"); + break; + } + + ismore = false; + + /* crude way to avoid crack attempts */ + STOP_IF_ATTACK(checksmtpattack(&n_auth, n_mechs + 1, + true, "AUTH", e)); + + /* make sure mechanism (p) is a valid string */ + for (q = p; *q != '\0' && isascii(*q); q++) + { + if (isspace(*q)) + { + *q = '\0'; + while (*++q != '\0' && + isascii(*q) && isspace(*q)) + continue; + *(q - 1) = '\0'; + ismore = (*q != '\0'); + break; + } + } + + if (*p == '\0') + { + message("501 5.5.2 AUTH mechanism must be specified"); + break; + } + + /* check whether mechanism is available */ + if (iteminlist(p, mechlist, " ") == NULL) + { + message("504 5.3.3 AUTH mechanism %.32s not available", + p); + break; + } + + if (ismore) + { + /* could this be shorter? XXX */ +# if SASL >= 20000 + in = xalloc(strlen(q) + 1); + result = sasl_decode64(q, strlen(q), in, + strlen(q), &inlen); +# else /* SASL >= 20000 */ + in = sm_rpool_malloc(e->e_rpool, strlen(q)); + result = sasl_decode64(q, strlen(q), in, + &inlen); +# endif /* SASL >= 20000 */ + if (result != SASL_OK) + { + message("501 5.5.4 cannot BASE64 decode '%s'", + q); + if (LogLevel > 5) + sm_syslog(LOG_WARNING, e->e_id, + "AUTH decode64 error [%d for \"%s\"]", + result, q); + /* start over? */ + authenticating = SASL_NOT_AUTH; +# if SASL >= 20000 + sm_free(in); +# endif /* SASL >= 20000 */ + in = NULL; + inlen = 0; + break; + } + } + else + { + in = NULL; + inlen = 0; + } + + /* see if that auth type exists */ +# if SASL >= 20000 + result = sasl_server_start(conn, p, in, inlen, + &out, &outlen); + if (in != NULL) + sm_free(in); +# else /* SASL >= 20000 */ + result = sasl_server_start(conn, p, in, inlen, + &out, &outlen, &errstr); +# endif /* SASL >= 20000 */ + + if (result != SASL_OK && result != SASL_CONTINUE) + { + message("535 5.7.0 authentication failed"); + if (LogLevel > 9) + sm_syslog(LOG_ERR, e->e_id, + "AUTH failure (%s): %s (%d) %s", + p, + sasl_errstring(result, NULL, + NULL), + result, +# if SASL >= 20000 + sasl_errdetail(conn)); +# else /* SASL >= 20000 */ + errstr); +# endif /* SASL >= 20000 */ + RESET_SASLCONN; + break; + } + auth_type = newstr(p); + + if (result == SASL_OK) + { + /* ugly, but same code */ + goto authenticated; + /* authenticated by the initial response */ + } + + /* len is at least 2 */ + len = ENC64LEN(outlen); + out2 = xalloc(len); + result = sasl_encode64(out, outlen, out2, len, + &out2len); + + if (result != SASL_OK) + { + message("454 4.5.4 Temporary authentication failure"); + if (LogLevel > 5) + sm_syslog(LOG_WARNING, e->e_id, + "AUTH encode64 error [%d for \"%s\"]", + result, out); + + /* start over? */ + authenticating = SASL_NOT_AUTH; + RESET_SASLCONN; + } + else + { + message("334 %s", out2); + authenticating = SASL_PROC_AUTH; + } +# if SASL >= 20000 + sm_free(out2); +# endif /* SASL >= 20000 */ + break; +#endif /* SASL */ + +#if STARTTLS + case CMDSTLS: /* starttls */ + DELAY_CONN("STARTTLS"); + if (*p != '\0') + { + message("501 5.5.2 Syntax error (no parameters allowed)"); + break; + } + if (!bitset(SRV_OFFER_TLS, features)) + { + message("503 5.5.0 TLS not available"); + break; + } + if (!tls_ok_srv) + { + message("454 4.3.3 TLS not available after start"); + break; + } + if (smtp.sm_gotmail) + { + message("503 5.5.0 TLS not permitted during a mail transaction"); + break; + } + if (tempfail) + { + if (LogLevel > 9) + sm_syslog(LOG_INFO, e->e_id, + "SMTP STARTTLS command (%.100s) from %s tempfailed (due to previous checks)", + p, CurSmtpClient); + usrerr("454 4.7.0 Please try again later"); + break; + } + starttls: +# if TLS_NO_RSA + /* + ** XXX do we need a temp key ? + */ +# else /* TLS_NO_RSA */ +# endif /* TLS_NO_RSA */ + +# if TLS_VRFY_PER_CTX + /* + ** Note: this sets the verification globally + ** (per SSL_CTX) + ** it's ok since it applies only to one transaction + */ + + TLS_VERIFY_CLIENT(); +# endif /* TLS_VRFY_PER_CTX */ + + if (srv_ssl != NULL) + SSL_clear(srv_ssl); + else if ((srv_ssl = SSL_new(srv_ctx)) == NULL) + { + message("454 4.3.3 TLS not available: error generating SSL handle"); + if (LogLevel > 8) + tlslogerr("server"); + goto tls_done; + } + +# if !TLS_VRFY_PER_CTX + /* + ** this could be used if it were possible to set + ** verification per SSL (connection) + ** not just per SSL_CTX (global) + */ + + TLS_VERIFY_CLIENT(); +# endif /* !TLS_VRFY_PER_CTX */ + + rfd = sm_io_getinfo(InChannel, SM_IO_WHAT_FD, NULL); + wfd = sm_io_getinfo(OutChannel, SM_IO_WHAT_FD, NULL); + + if (rfd < 0 || wfd < 0 || + SSL_set_rfd(srv_ssl, rfd) <= 0 || + SSL_set_wfd(srv_ssl, wfd) <= 0) + { + message("454 4.3.3 TLS not available: error set fd"); + SSL_free(srv_ssl); + srv_ssl = NULL; + goto tls_done; + } + if (!smtps) + message("220 2.0.0 Ready to start TLS"); +# if PIPELINING + (void) sm_io_flush(OutChannel, SM_TIME_DEFAULT); +# endif /* PIPELINING */ + + SSL_set_accept_state(srv_ssl); + +# define SSL_ACC(s) SSL_accept(s) + + tlsstart = curtime(); + fdfl = fcntl(rfd, F_GETFL); + if (fdfl != -1) + fcntl(rfd, F_SETFL, fdfl|O_NONBLOCK); + ssl_retry: + if ((r = SSL_ACC(srv_ssl)) <= 0) + { + int i; + bool timedout; + time_t left; + time_t now = curtime(); + struct timeval tv; + + /* what to do in this case? */ + i = SSL_get_error(srv_ssl, r); + + /* + ** For SSL_ERROR_WANT_{READ,WRITE}: + ** There is no SSL record available yet + ** or there is only a partial SSL record + ** removed from the network (socket) buffer + ** into the SSL buffer. The SSL_accept will + ** only succeed when a full SSL record is + ** available (assuming a "real" error + ** doesn't happen). To handle when a "real" + ** error does happen the select is set for + ** exceptions too. + ** The connection may be re-negotiated + ** during this time so both read and write + ** "want errors" need to be handled. + ** A select() exception loops back so that + ** a proper SSL error message can be gotten. + */ + + left = TimeOuts.to_starttls - (now - tlsstart); + timedout = left <= 0; + if (!timedout) + { + tv.tv_sec = left; + tv.tv_usec = 0; + } + + if (!timedout && FD_SETSIZE > 0 && + (rfd >= FD_SETSIZE || + (i == SSL_ERROR_WANT_WRITE && + wfd >= FD_SETSIZE))) + { + if (LogLevel > 5) + { + sm_syslog(LOG_ERR, NOQID, + "STARTTLS=server, error: fd %d/%d too large", + rfd, wfd); + if (LogLevel > 8) + tlslogerr("server"); + } + goto tlsfail; + } + + /* XXX what about SSL_pending() ? */ + if (!timedout && i == SSL_ERROR_WANT_READ) + { + fd_set ssl_maskr, ssl_maskx; + + FD_ZERO(&ssl_maskr); + FD_SET(rfd, &ssl_maskr); + FD_ZERO(&ssl_maskx); + FD_SET(rfd, &ssl_maskx); + if (select(rfd + 1, &ssl_maskr, NULL, + &ssl_maskx, &tv) > 0) + goto ssl_retry; + } + if (!timedout && i == SSL_ERROR_WANT_WRITE) + { + fd_set ssl_maskw, ssl_maskx; + + FD_ZERO(&ssl_maskw); + FD_SET(wfd, &ssl_maskw); + FD_ZERO(&ssl_maskx); + FD_SET(rfd, &ssl_maskx); + if (select(wfd + 1, NULL, &ssl_maskw, + &ssl_maskx, &tv) > 0) + goto ssl_retry; + } + if (LogLevel > 5) + { + sm_syslog(LOG_WARNING, NOQID, + "STARTTLS=server, error: accept failed=%d, SSL_error=%d, timedout=%d, errno=%d", + r, i, (int) timedout, errno); + if (LogLevel > 8) + tlslogerr("server"); + } +tlsfail: + tls_ok_srv = false; + SSL_free(srv_ssl); + srv_ssl = NULL; + + /* + ** according to the next draft of + ** RFC 2487 the connection should be dropped + */ + + /* arrange to ignore any current send list */ + e->e_sendqueue = NULL; + goto doquit; + } + + if (fdfl != -1) + fcntl(rfd, F_SETFL, fdfl); + + /* ignore return code for now, it's in {verify} */ + (void) tls_get_info(srv_ssl, true, + CurSmtpClient, + &BlankEnvelope.e_macro, + bitset(SRV_VRFY_CLT, features)); + + /* + ** call Stls_client to find out whether + ** to accept the connection from the client + */ + + saveQuickAbort = QuickAbort; + saveSuprErrs = SuprErrs; + SuprErrs = true; + QuickAbort = false; + if (rscheck("tls_client", + macvalue(macid("{verify}"), e), + "STARTTLS", e, + RSF_RMCOMM|RSF_COUNT, + 5, NULL, NOQID) != EX_OK || + Errors > 0) + { + extern char MsgBuf[]; + + if (MsgBuf[0] != '\0' && ISSMTPREPLY(MsgBuf)) + nullserver = newstr(MsgBuf); + else + nullserver = "503 5.7.0 Authentication required."; + } + QuickAbort = saveQuickAbort; + SuprErrs = saveSuprErrs; + + tls_ok_srv = false; /* don't offer STARTTLS again */ + n_helo = 0; +# if SASL + if (sasl_ok) + { + int cipher_bits; + bool verified; + char *s, *v, *c; + + s = macvalue(macid("{cipher_bits}"), e); + v = macvalue(macid("{verify}"), e); + c = macvalue(macid("{cert_subject}"), e); + verified = (v != NULL && strcmp(v, "OK") == 0); + if (s != NULL && (cipher_bits = atoi(s)) > 0) + { +# if SASL >= 20000 + ext_ssf = cipher_bits; + auth_id = verified ? c : NULL; + sasl_ok = ((sasl_setprop(conn, + SASL_SSF_EXTERNAL, + &ext_ssf) == SASL_OK) && + (sasl_setprop(conn, + SASL_AUTH_EXTERNAL, + auth_id) == SASL_OK)); +# else /* SASL >= 20000 */ + ext_ssf.ssf = cipher_bits; + ext_ssf.auth_id = verified ? c : NULL; + sasl_ok = sasl_setprop(conn, + SASL_SSF_EXTERNAL, + &ext_ssf) == SASL_OK; +# endif /* SASL >= 20000 */ + mechlist = NULL; + if (sasl_ok) + n_mechs = saslmechs(conn, + &mechlist); + } + } +# endif /* SASL */ + + /* switch to secure connection */ + if (sfdctls(&InChannel, &OutChannel, srv_ssl) == 0) + { + tls_active = true; +# if PIPELINING + (void) sm_io_autoflush(InChannel, OutChannel); +# endif /* PIPELINING */ + } + else + { + /* + ** XXX this is an internal error + ** how to deal with it? + ** we can't generate an error message + ** since the other side switched to an + ** encrypted layer, but we could not... + ** just "hang up"? + */ + + nullserver = "454 4.3.3 TLS not available: can't switch to encrypted layer"; + syserr("STARTTLS: can't switch to encrypted layer"); + } + tls_done: + if (smtps) + { + if (tls_active) + goto greeting; + else + goto doquit; + } + break; +#endif /* STARTTLS */ + + case CMDHELO: /* hello -- introduce yourself */ + case CMDEHLO: /* extended hello */ + DELAY_CONN("EHLO"); + if (c->cmd_code == CMDEHLO) + { + protocol = "ESMTP"; + SmtpPhase = "server EHLO"; + } + else + { + protocol = "SMTP"; + SmtpPhase = "server HELO"; + } + + /* avoid denial-of-service */ + STOP_IF_ATTACK(checksmtpattack(&n_helo, MAXHELOCOMMANDS, + true, "HELO/EHLO", e)); + +#if 0 + /* RFC2821 4.1.4 allows duplicate HELO/EHLO */ + /* check for duplicate HELO/EHLO per RFC 1651 4.2 */ + if (gothello) + { + usrerr("503 %s Duplicate HELO/EHLO", + MyHostName); + break; + } +#endif /* 0 */ + + /* check for valid domain name (re 1123 5.2.5) */ + if (*p == '\0' && !AllowBogusHELO) + { + usrerr("501 %s requires domain address", + cmdbuf); + break; + } + + /* check for long domain name (hides Received: info) */ + if (strlen(p) > MAXNAME) + { + usrerr("501 Invalid domain name"); + if (LogLevel > 9) + sm_syslog(LOG_INFO, CurEnv->e_id, + "invalid domain name (too long) from %s", + CurSmtpClient); + break; + } + + ok = true; + for (q = p; *q != '\0'; q++) + { + if (!isascii(*q)) + break; + if (isalnum(*q)) + continue; + if (isspace(*q)) + { + *q = '\0'; + + /* only complain if strict check */ + ok = AllowBogusHELO; + break; + } + if (strchr("[].-_#:", *q) == NULL) + break; + } + + if (*q == '\0' && ok) + { + q = "pleased to meet you"; + sendinghost = sm_strdup_x(p); + hello_accept = true; + hello_name = sm_strdup_x(p); + macdefine(&e->e_macro, A_PERM, macid("{client_hello}"), + hello_name); + } + else if (!AllowBogusHELO) + { + usrerr("501 Invalid domain name"); + if (LogLevel > 9) + sm_syslog(LOG_INFO, CurEnv->e_id, + "invalid domain name (%s) from %.100s", + p, CurSmtpClient); + break; + } + else + { + q = "accepting invalid domain name"; + hello_accept = true; + hello_name = sm_strdup_x(p); + macdefine(&e->e_macro, A_PERM, macid("{client_hello}"), + hello_name); + } + + if (gothello) + { + CLEAR_STATE(cmdbuf); + } + + if (hello_accept) { + if (rscheck("check_hello", hello_name, + NULL, e, RSF_RMCOMM|RSF_COUNT, 3, + NULL, e->e_id) != EX_OK || + Errors > 0) + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + + if (MaxMessageSize > 0 && + (e->e_msgsize > MaxMessageSize || + e->e_msgsize < 0)) + { + usrerr("552 5.2.3 Message size exceeds fixed maximum message size (%ld)", + MaxMessageSize); + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + } + } + +#if MILTER + if (smtp.sm_milterlist && smtp.sm_milterize && + !bitset(EF_DISCARD, e->e_flags)) + { + char state; + char *response; + + response = milter_helo(p, e, &state); + switch (state) + { + case SMFIR_REPLYCODE: + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: helo=%s, reject=%s", + p, response); + nullserver = newstr(response); + smtp.sm_milterize = false; + break; + + case SMFIR_REJECT: + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: helo=%s, reject=Command rejected", + p); + nullserver = "Command rejected"; + smtp.sm_milterize = false; + break; + + case SMFIR_TEMPFAIL: + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: helo=%s, reject=%s", + p, MSG_TEMPFAIL); + tempfail = true; + smtp.sm_milterize = false; + break; + } + if (response != NULL) + sm_free(response); + + /* + ** If quarantining by a connect/ehlo action, + ** save between messages + */ + + if (smtp.sm_quarmsg == NULL && + e->e_quarmsg != NULL) + smtp.sm_quarmsg = newstr(e->e_quarmsg); + } +#endif /* MILTER */ + gothello = true; + + /* print HELO response message */ + if (c->cmd_code != CMDEHLO) + { + message("250 %s Hello %s, %s", + MyHostName, CurSmtpClient, q); + break; + } + + message("250-%s Hello %s, %s", + MyHostName, CurSmtpClient, q); + + /* offer ENHSC even for nullserver */ + if (nullserver != NULL) + { + message("250 ENHANCEDSTATUSCODES"); + break; + } + + /* + ** print EHLO features list + ** + ** Note: If you change this list, + ** remember to update 'helpfile' + */ + + message("250-ENHANCEDSTATUSCODES"); +#if PIPELINING + if (bitset(SRV_OFFER_PIPE, features)) + message("250-PIPELINING"); +#endif /* PIPELINING */ + if (bitset(SRV_OFFER_EXPN, features)) + { + message("250-EXPN"); + if (bitset(SRV_OFFER_VERB, features)) + message("250-VERB"); + } +#if MIME8TO7 + message("250-8BITMIME"); +#endif /* MIME8TO7 */ + if (MaxMessageSize > 0) + message("250-SIZE %ld", MaxMessageSize); + else + message("250-SIZE"); +#if DSN + if (SendMIMEErrors && bitset(SRV_OFFER_DSN, features)) + message("250-DSN"); +#endif /* DSN */ + if (bitset(SRV_OFFER_ETRN, features)) + message("250-ETRN"); +#if SASL + if (sasl_ok && mechlist != NULL && *mechlist != '\0') + message("250-AUTH %s", mechlist); +#endif /* SASL */ +#if STARTTLS + if (tls_ok_srv && + bitset(SRV_OFFER_TLS, features)) + message("250-STARTTLS"); +#endif /* STARTTLS */ + if (DeliverByMin > 0) + message("250-DELIVERBY %ld", + (long) DeliverByMin); + else if (DeliverByMin == 0) + message("250-DELIVERBY"); + + /* < 0: no deliver-by */ + + message("250 HELP"); + break; + + case CMDMAIL: /* mail -- designate sender */ + SmtpPhase = "server MAIL"; + DELAY_CONN("MAIL"); + + /* check for validity of this command */ + if (!gothello && bitset(PRIV_NEEDMAILHELO, PrivacyFlags)) + { + usrerr("503 5.0.0 Polite people say HELO first"); + break; + } + if (smtp.sm_gotmail) + { + usrerr("503 5.5.0 Sender already specified"); + break; + } +#if SASL + if (bitset(SRV_REQ_AUTH, features) && + authenticating != SASL_IS_AUTH) + { + usrerr("530 5.7.0 Authentication required"); + break; + } +#endif /* SASL */ + + p = skipword(p, "from"); + if (p == NULL) + break; + if (tempfail) + { + if (LogLevel > 9) + sm_syslog(LOG_INFO, e->e_id, + "SMTP MAIL command (%.100s) from %s tempfailed (due to previous checks)", + p, CurSmtpClient); + usrerr(MSG_TEMPFAIL); + break; + } + + /* make sure we know who the sending host is */ + if (sendinghost == NULL) + sendinghost = peerhostname; + + +#if SM_HEAP_CHECK + if (sm_debug_active(&DebugLeakSmtp, 1)) + { + sm_heap_newgroup(); + sm_dprintf("smtp() heap group #%d\n", + sm_heap_group()); + } +#endif /* SM_HEAP_CHECK */ + + if (Errors > 0) + goto undo_no_pm; + if (!gothello) + { + auth_warning(e, "%s didn't use HELO protocol", + CurSmtpClient); + } +#ifdef PICKY_HELO_CHECK + if (sm_strcasecmp(sendinghost, peerhostname) != 0 && + (sm_strcasecmp(peerhostname, "localhost") != 0 || + sm_strcasecmp(sendinghost, MyHostName) != 0)) + { + auth_warning(e, "Host %s claimed to be %s", + CurSmtpClient, sendinghost); + } +#endif /* PICKY_HELO_CHECK */ + + if (protocol == NULL) + protocol = "SMTP"; + macdefine(&e->e_macro, A_PERM, 'r', protocol); + macdefine(&e->e_macro, A_PERM, 's', sendinghost); + + if (Errors > 0) + goto undo_no_pm; + smtp.sm_nrcpts = 0; + n_badrcpts = 0; + macdefine(&e->e_macro, A_PERM, macid("{ntries}"), "0"); + macdefine(&e->e_macro, A_PERM, macid("{nrcpts}"), "0"); + macdefine(&e->e_macro, A_PERM, macid("{nbadrcpts}"), + "0"); + e->e_flags |= EF_CLRQUEUE; + sm_setproctitle(true, e, "%s %s: %.80s", + qid_printname(e), + CurSmtpClient, inp); + + /* do the processing */ + SM_TRY + { + extern char *FullName; + + QuickAbort = true; + SM_FREE_CLR(FullName); + + /* must parse sender first */ + delimptr = NULL; + setsender(p, e, &delimptr, ' ', false); + if (delimptr != NULL && *delimptr != '\0') + *delimptr++ = '\0'; + if (Errors > 0) + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + + /* Successfully set e_from, allow logging */ + e->e_flags |= EF_LOGSENDER; + + /* put resulting triple from parseaddr() into macros */ + if (e->e_from.q_mailer != NULL) + macdefine(&e->e_macro, A_PERM, + macid("{mail_mailer}"), + e->e_from.q_mailer->m_name); + else + macdefine(&e->e_macro, A_PERM, + macid("{mail_mailer}"), NULL); + if (e->e_from.q_host != NULL) + macdefine(&e->e_macro, A_PERM, + macid("{mail_host}"), + e->e_from.q_host); + else + macdefine(&e->e_macro, A_PERM, + macid("{mail_host}"), "localhost"); + if (e->e_from.q_user != NULL) + macdefine(&e->e_macro, A_PERM, + macid("{mail_addr}"), + e->e_from.q_user); + else + macdefine(&e->e_macro, A_PERM, + macid("{mail_addr}"), NULL); + if (Errors > 0) + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + + /* check for possible spoofing */ + if (RealUid != 0 && OpMode == MD_SMTP && + !wordinclass(RealUserName, 't') && + (!bitnset(M_LOCALMAILER, + e->e_from.q_mailer->m_flags) || + strcmp(e->e_from.q_user, RealUserName) != 0)) + { + auth_warning(e, "%s owned process doing -bs", + RealUserName); + } + + /* reset to default value */ + SevenBitInput = save_sevenbitinput; + + /* now parse ESMTP arguments */ + e->e_msgsize = 0; + addr = p; + argno = 0; + args[argno++] = p; + p = delimptr; + while (p != NULL && *p != '\0') + { + char *kp; + char *vp = NULL; + char *equal = NULL; + + /* locate the beginning of the keyword */ + SKIP_SPACE(p); + if (*p == '\0') + break; + kp = p; + + /* skip to the value portion */ + while ((isascii(*p) && isalnum(*p)) || *p == '-') + p++; + if (*p == '=') + { + equal = p; + *p++ = '\0'; + vp = p; + + /* skip to the end of the value */ + while (*p != '\0' && *p != ' ' && + !(isascii(*p) && iscntrl(*p)) && + *p != '=') + p++; + } + + if (*p != '\0') + *p++ = '\0'; + + if (tTd(19, 1)) + sm_dprintf("MAIL: got arg %s=\"%s\"\n", kp, + vp == NULL ? "<null>" : vp); + + mail_esmtp_args(kp, vp, e); + if (equal != NULL) + *equal = '='; + args[argno++] = kp; + if (argno >= MAXSMTPARGS - 1) + usrerr("501 5.5.4 Too many parameters"); + if (Errors > 0) + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + } + args[argno] = NULL; + if (Errors > 0) + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + +#if SASL +# if _FFR_AUTH_PASSING + /* set the default AUTH= if the sender didn't */ + if (e->e_auth_param == NULL) + { + /* XXX only do this for an MSA? */ + e->e_auth_param = macvalue(macid("{auth_authen}"), + e); + if (e->e_auth_param == NULL) + e->e_auth_param = "<>"; + + /* + ** XXX should we invoke Strust_auth now? + ** authorizing as the client that just + ** authenticated, so we'll trust implicitly + */ + } +# endif /* _FFR_AUTH_PASSING */ +#endif /* SASL */ + + /* do config file checking of the sender */ + macdefine(&e->e_macro, A_PERM, + macid("{addr_type}"), "e s"); +#if _FFR_MAIL_MACRO + /* make the "real" sender address available */ + macdefine(&e->e_macro, A_TEMP, macid("{mail_from}"), + e->e_from.q_paddr); +#endif /* _FFR_MAIL_MACRO */ + if (rscheck("check_mail", addr, + NULL, e, RSF_RMCOMM|RSF_COUNT, 3, + NULL, e->e_id) != EX_OK || + Errors > 0) + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + macdefine(&e->e_macro, A_PERM, + macid("{addr_type}"), NULL); + + if (MaxMessageSize > 0 && + (e->e_msgsize > MaxMessageSize || + e->e_msgsize < 0)) + { + usrerr("552 5.2.3 Message size exceeds fixed maximum message size (%ld)", + MaxMessageSize); + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + } + + /* + ** XXX always check whether there is at least one fs + ** with enough space? + ** However, this may not help much: the queue group + ** selection may later on select a FS that hasn't + ** enough space. + */ + + if ((NumFileSys == 1 || NumQueue == 1) && + !enoughdiskspace(e->e_msgsize, e) +#if _FFR_ANY_FREE_FS + && !filesys_free(e->e_msgsize) +#endif /* _FFR_ANY_FREE_FS */ + ) + { + /* + ** We perform this test again when the + ** queue directory is selected, in collect. + */ + + usrerr("452 4.4.5 Insufficient disk space; try again later"); + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + } + if (Errors > 0) + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + + LogUsrErrs = true; +#if MILTER + if (smtp.sm_milterlist && smtp.sm_milterize && + !bitset(EF_DISCARD, e->e_flags)) + { + char state; + char *response; + + response = milter_envfrom(args, e, &state); + MILTER_REPLY("from"); + } +#endif /* MILTER */ + if (Errors > 0) + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + + message("250 2.1.0 Sender ok"); + smtp.sm_gotmail = true; + } + SM_EXCEPT(exc, "[!F]*") + { + /* + ** An error occurred while processing a MAIL command. + ** Jump to the common error handling code. + */ + + sm_exc_free(exc); + goto undo_no_pm; + } + SM_END_TRY + break; + + undo_no_pm: + e->e_flags &= ~EF_PM_NOTIFY; + undo: + break; + + case CMDRCPT: /* rcpt -- designate recipient */ + DELAY_CONN("RCPT"); + if (BadRcptThrottle > 0 && + n_badrcpts >= BadRcptThrottle) + { + if (LogLevel > 5 && + n_badrcpts == BadRcptThrottle) + { + sm_syslog(LOG_INFO, e->e_id, + "%s: Possible SMTP RCPT flood, throttling.", + CurSmtpClient); + + /* To avoid duplicated message */ + n_badrcpts++; + } + NBADRCPTS; + + /* + ** Don't use exponential backoff for now. + ** Some servers will open more connections + ** and actually overload the receiver even + ** more. + */ + + (void) sleep(1); + } + if (!smtp.sm_gotmail) + { + usrerr("503 5.0.0 Need MAIL before RCPT"); + break; + } + SmtpPhase = "server RCPT"; + SM_TRY + { + QuickAbort = true; + LogUsrErrs = true; + + /* limit flooding of our machine */ + if (MaxRcptPerMsg > 0 && + smtp.sm_nrcpts >= MaxRcptPerMsg) + { + /* sleep(1); / * slow down? */ + usrerr("452 4.5.3 Too many recipients"); + goto rcpt_done; + } + + if (e->e_sendmode != SM_DELIVER) + e->e_flags |= EF_VRFYONLY; + +#if MILTER + /* + ** If the filter will be deleting recipients, + ** don't expand them at RCPT time (in the call + ** to recipient()). If they are expanded, it + ** is impossible for removefromlist() to figure + ** out the expanded members of the original + ** recipient and mark them as QS_DONTSEND. + */ + + if (milter_can_delrcpts()) + e->e_flags |= EF_VRFYONLY; +#endif /* MILTER */ + + p = skipword(p, "to"); + if (p == NULL) + goto rcpt_done; + macdefine(&e->e_macro, A_PERM, + macid("{addr_type}"), "e r"); + a = parseaddr(p, NULLADDR, RF_COPYALL, ' ', &delimptr, + e, true); + macdefine(&e->e_macro, A_PERM, + macid("{addr_type}"), NULL); + if (Errors > 0) + goto rcpt_done; + if (a == NULL) + { + usrerr("501 5.0.0 Missing recipient"); + goto rcpt_done; + } + + if (delimptr != NULL && *delimptr != '\0') + *delimptr++ = '\0'; + + /* put resulting triple from parseaddr() into macros */ + if (a->q_mailer != NULL) + macdefine(&e->e_macro, A_PERM, + macid("{rcpt_mailer}"), + a->q_mailer->m_name); + else + macdefine(&e->e_macro, A_PERM, + macid("{rcpt_mailer}"), NULL); + if (a->q_host != NULL) + macdefine(&e->e_macro, A_PERM, + macid("{rcpt_host}"), a->q_host); + else + macdefine(&e->e_macro, A_PERM, + macid("{rcpt_host}"), "localhost"); + if (a->q_user != NULL) + macdefine(&e->e_macro, A_PERM, + macid("{rcpt_addr}"), a->q_user); + else + macdefine(&e->e_macro, A_PERM, + macid("{rcpt_addr}"), NULL); + if (Errors > 0) + goto rcpt_done; + + /* now parse ESMTP arguments */ + addr = p; + argno = 0; + args[argno++] = p; + p = delimptr; + while (p != NULL && *p != '\0') + { + char *kp; + char *vp = NULL; + char *equal = NULL; + + /* locate the beginning of the keyword */ + SKIP_SPACE(p); + if (*p == '\0') + break; + kp = p; + + /* skip to the value portion */ + while ((isascii(*p) && isalnum(*p)) || *p == '-') + p++; + if (*p == '=') + { + equal = p; + *p++ = '\0'; + vp = p; + + /* skip to the end of the value */ + while (*p != '\0' && *p != ' ' && + !(isascii(*p) && iscntrl(*p)) && + *p != '=') + p++; + } + + if (*p != '\0') + *p++ = '\0'; + + if (tTd(19, 1)) + sm_dprintf("RCPT: got arg %s=\"%s\"\n", kp, + vp == NULL ? "<null>" : vp); + + rcpt_esmtp_args(a, kp, vp, e); + if (equal != NULL) + *equal = '='; + args[argno++] = kp; + if (argno >= MAXSMTPARGS - 1) + usrerr("501 5.5.4 Too many parameters"); + if (Errors > 0) + break; + } + args[argno] = NULL; + if (Errors > 0) + goto rcpt_done; + + /* do config file checking of the recipient */ + macdefine(&e->e_macro, A_PERM, + macid("{addr_type}"), "e r"); + if (rscheck("check_rcpt", addr, + NULL, e, RSF_RMCOMM|RSF_COUNT, 3, + NULL, e->e_id) != EX_OK || + Errors > 0) + goto rcpt_done; + macdefine(&e->e_macro, A_PERM, + macid("{addr_type}"), NULL); + + /* If discarding, don't bother to verify user */ + if (bitset(EF_DISCARD, e->e_flags)) + a->q_state = QS_VERIFIED; + +#if MILTER + if (smtp.sm_milterlist && smtp.sm_milterize && + !bitset(EF_DISCARD, e->e_flags)) + { + char state; + char *response; + + response = milter_envrcpt(args, e, &state); + MILTER_REPLY("to"); + } +#endif /* MILTER */ + + macdefine(&e->e_macro, A_PERM, + macid("{rcpt_mailer}"), NULL); + macdefine(&e->e_macro, A_PERM, + macid("{rcpt_host}"), NULL); + macdefine(&e->e_macro, A_PERM, + macid("{rcpt_addr}"), NULL); + macdefine(&e->e_macro, A_PERM, + macid("{dsn_notify}"), NULL); + if (Errors > 0) + goto rcpt_done; + + /* save in recipient list after ESMTP mods */ + a = recipient(a, &e->e_sendqueue, 0, e); + if (Errors > 0) + goto rcpt_done; + + /* no errors during parsing, but might be a duplicate */ + e->e_to = a->q_paddr; + if (!QS_IS_BADADDR(a->q_state)) + { + if (smtp.sm_nrcpts == 0) + initsys(e); + message("250 2.1.5 Recipient ok%s", + QS_IS_QUEUEUP(a->q_state) ? + " (will queue)" : ""); + smtp.sm_nrcpts++; + } + else + { + /* punt -- should keep message in ADDRESS.... */ + usrerr("550 5.1.1 Addressee unknown"); + } + rcpt_done: + if (Errors > 0) + { + ++n_badrcpts; + NBADRCPTS; + } + } + SM_EXCEPT(exc, "[!F]*") + { + /* An exception occurred while processing RCPT */ + e->e_flags &= ~(EF_FATALERRS|EF_PM_NOTIFY); + ++n_badrcpts; + NBADRCPTS; + } + SM_END_TRY + break; + + case CMDDATA: /* data -- text of mail */ + DELAY_CONN("DATA"); + if (!smtp_data(&smtp, e)) + goto doquit; + break; + + case CMDRSET: /* rset -- reset state */ + if (tTd(94, 100)) + message("451 4.0.0 Test failure"); + else + message("250 2.0.0 Reset state"); + CLEAR_STATE(cmdbuf); + break; + + case CMDVRFY: /* vrfy -- verify address */ + case CMDEXPN: /* expn -- expand address */ + vrfy = c->cmd_code == CMDVRFY; + DELAY_CONN(vrfy ? "VRFY" : "EXPN"); + if (tempfail) + { + if (LogLevel > 9) + sm_syslog(LOG_INFO, e->e_id, + "SMTP %s command (%.100s) from %s tempfailed (due to previous checks)", + vrfy ? "VRFY" : "EXPN", + p, CurSmtpClient); + + /* RFC 821 doesn't allow 4xy reply code */ + usrerr("550 5.7.1 Please try again later"); + break; + } + wt = checksmtpattack(&n_verifies, MAXVRFYCOMMANDS, + false, vrfy ? "VRFY" : "EXPN", e); + STOP_IF_ATTACK(wt); + previous = curtime(); + if ((vrfy && bitset(PRIV_NOVRFY, PrivacyFlags)) || + (!vrfy && !bitset(SRV_OFFER_EXPN, features))) + { + if (vrfy) + message("252 2.5.2 Cannot VRFY user; try RCPT to attempt delivery (or try finger)"); + else + message("502 5.7.0 Sorry, we do not allow this operation"); + if (LogLevel > 5) + sm_syslog(LOG_INFO, e->e_id, + "%s: %s [rejected]", + CurSmtpClient, + shortenstring(inp, MAXSHORTSTR)); + break; + } + else if (!gothello && + bitset(vrfy ? PRIV_NEEDVRFYHELO : PRIV_NEEDEXPNHELO, + PrivacyFlags)) + { + usrerr("503 5.0.0 I demand that you introduce yourself first"); + break; + } + if (Errors > 0) + break; + if (LogLevel > 5) + sm_syslog(LOG_INFO, e->e_id, "%s: %s", + CurSmtpClient, + shortenstring(inp, MAXSHORTSTR)); + SM_TRY + { + QuickAbort = true; + vrfyqueue = NULL; + if (vrfy) + e->e_flags |= EF_VRFYONLY; + while (*p != '\0' && isascii(*p) && isspace(*p)) + p++; + if (*p == '\0') + { + usrerr("501 5.5.2 Argument required"); + } + else + { + /* do config file checking of the address */ + if (rscheck(vrfy ? "check_vrfy" : "check_expn", + p, NULL, e, RSF_RMCOMM, + 3, NULL, NOQID) != EX_OK || + Errors > 0) + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + (void) sendtolist(p, NULLADDR, &vrfyqueue, 0, e); + } + if (wt > 0) + { + time_t t; + + t = wt - (curtime() - previous); + if (t > 0) + (void) sleep(t); + } + if (Errors > 0) + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + if (vrfyqueue == NULL) + { + usrerr("554 5.5.2 Nothing to %s", vrfy ? "VRFY" : "EXPN"); + } + while (vrfyqueue != NULL) + { + if (!QS_IS_UNDELIVERED(vrfyqueue->q_state)) + { + vrfyqueue = vrfyqueue->q_next; + continue; + } + + /* see if there is more in the vrfy list */ + a = vrfyqueue; + while ((a = a->q_next) != NULL && + (!QS_IS_UNDELIVERED(a->q_state))) + continue; + printvrfyaddr(vrfyqueue, a == NULL, vrfy); + vrfyqueue = a; + } + } + SM_EXCEPT(exc, "[!F]*") + { + /* + ** An exception occurred while processing VRFY/EXPN + */ + + sm_exc_free(exc); + goto undo; + } + SM_END_TRY + break; + + case CMDETRN: /* etrn -- force queue flush */ + DELAY_CONN("ETRN"); + + /* Don't leak queue information via debug flags */ + if (!bitset(SRV_OFFER_ETRN, features) || UseMSP || + (RealUid != 0 && RealUid != TrustedUid && + OpMode == MD_SMTP)) + { + /* different message for MSA ? */ + message("502 5.7.0 Sorry, we do not allow this operation"); + if (LogLevel > 5) + sm_syslog(LOG_INFO, e->e_id, + "%s: %s [rejected]", + CurSmtpClient, + shortenstring(inp, MAXSHORTSTR)); + break; + } + if (tempfail) + { + if (LogLevel > 9) + sm_syslog(LOG_INFO, e->e_id, + "SMTP ETRN command (%.100s) from %s tempfailed (due to previous checks)", + p, CurSmtpClient); + usrerr(MSG_TEMPFAIL); + break; + } + + if (strlen(p) <= 0) + { + usrerr("500 5.5.2 Parameter required"); + break; + } + + /* crude way to avoid denial-of-service attacks */ + STOP_IF_ATTACK(checksmtpattack(&n_etrn, MAXETRNCOMMANDS, + true, "ETRN", e)); + + /* + ** Do config file checking of the parameter. + ** Even though we have srv_features now, we still + ** need this ruleset because the former is called + ** when the connection has been established, while + ** this ruleset is called when the command is + ** actually issued and therefore has all information + ** available to make a decision. + */ + + if (rscheck("check_etrn", p, NULL, e, + RSF_RMCOMM, 3, NULL, NOQID) != EX_OK || + Errors > 0) + break; + + if (LogLevel > 5) + sm_syslog(LOG_INFO, e->e_id, + "%s: ETRN %s", CurSmtpClient, + shortenstring(p, MAXSHORTSTR)); + + id = p; + if (*id == '#') + { + int i, qgrp; + + id++; + qgrp = name2qid(id); + if (!ISVALIDQGRP(qgrp)) + { + usrerr("459 4.5.4 Queue %s unknown", + id); + break; + } + for (i = 0; i < NumQueue && Queue[i] != NULL; + i++) + Queue[i]->qg_nextrun = (time_t) -1; + Queue[qgrp]->qg_nextrun = 0; + ok = run_work_group(Queue[qgrp]->qg_wgrp, + RWG_FORK|RWG_FORCE); + if (ok && Errors == 0) + message("250 2.0.0 Queuing for queue group %s started", id); + break; + } + + if (*id == '@') + id++; + else + *--id = '@'; + + new = (QUEUE_CHAR *) sm_malloc(sizeof(QUEUE_CHAR)); + if (new == NULL) + { + syserr("500 5.5.0 ETRN out of memory"); + break; + } + new->queue_match = id; + new->queue_negate = false; + new->queue_next = NULL; + QueueLimitRecipient = new; + ok = runqueue(true, false, false, true); + sm_free(QueueLimitRecipient); /* XXX */ + QueueLimitRecipient = NULL; + if (ok && Errors == 0) + message("250 2.0.0 Queuing for node %s started", p); + break; + + case CMDHELP: /* help -- give user info */ + DELAY_CONN("HELP"); + help(p, e); + break; + + case CMDNOOP: /* noop -- do nothing */ + DELAY_CONN("NOOP"); + STOP_IF_ATTACK(checksmtpattack(&n_noop, MAXNOOPCOMMANDS, + true, "NOOP", e)); + message("250 2.0.0 OK"); + break; + + case CMDQUIT: /* quit -- leave mail */ + message("221 2.0.0 %s closing connection", MyHostName); +#if PIPELINING + (void) sm_io_flush(OutChannel, SM_TIME_DEFAULT); +#endif /* PIPELINING */ + + if (smtp.sm_nrcpts > 0) + logundelrcpts(e, "aborted by sender", 9, false); + + /* arrange to ignore any current send list */ + e->e_sendqueue = NULL; + +#if STARTTLS + /* shutdown TLS connection */ + if (tls_active) + { + (void) endtls(srv_ssl, "server"); + tls_active = false; + } +#endif /* STARTTLS */ +#if SASL + if (authenticating == SASL_IS_AUTH) + { + sasl_dispose(&conn); + authenticating = SASL_NOT_AUTH; + /* XXX sasl_done(); this is a child */ + } +#endif /* SASL */ + +doquit: + /* avoid future 050 messages */ + disconnect(1, e); + +#if MILTER + /* close out milter filters */ + milter_quit(e); +#endif /* MILTER */ + + if (LogLevel > 4 && bitset(EF_LOGSENDER, e->e_flags)) + logsender(e, NULL); + e->e_flags &= ~EF_LOGSENDER; + + if (lognullconnection && LogLevel > 5 && + nullserver == NULL) + { + char *d; + + d = macvalue(macid("{daemon_name}"), e); + if (d == NULL) + d = "stdin"; + + /* + ** even though this id is "bogus", it makes + ** it simpler to "grep" related events, e.g., + ** timeouts for the same connection. + */ + + sm_syslog(LOG_INFO, e->e_id, + "%s did not issue MAIL/EXPN/VRFY/ETRN during connection to %s", + CurSmtpClient, d); + } + if (tTd(93, 100)) + { + /* return to handle next connection */ + return; + } + finis(true, true, ExitStat); + /* NOTREACHED */ + + case CMDVERB: /* set verbose mode */ + DELAY_CONN("VERB"); + if (!bitset(SRV_OFFER_EXPN, features) || + !bitset(SRV_OFFER_VERB, features)) + { + /* this would give out the same info */ + message("502 5.7.0 Verbose unavailable"); + break; + } + STOP_IF_ATTACK(checksmtpattack(&n_noop, MAXNOOPCOMMANDS, + true, "VERB", e)); + Verbose = 1; + set_delivery_mode(SM_DELIVER, e); + message("250 2.0.0 Verbose mode"); + break; + +#if SMTPDEBUG + case CMDDBGQSHOW: /* show queues */ + (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, + "Send Queue="); + printaddr(smioout, e->e_sendqueue, true); + break; + + case CMDDBGDEBUG: /* set debug mode */ + tTsetup(tTdvect, sizeof tTdvect, "0-99.1"); + tTflag(p); + message("200 2.0.0 Debug set"); + break; + +#else /* SMTPDEBUG */ + case CMDDBGQSHOW: /* show queues */ + case CMDDBGDEBUG: /* set debug mode */ +#endif /* SMTPDEBUG */ + case CMDLOGBOGUS: /* bogus command */ + DELAY_CONN("Bogus"); + if (LogLevel > 0) + sm_syslog(LOG_CRIT, e->e_id, + "\"%s\" command from %s (%.100s)", + c->cmd_name, CurSmtpClient, + anynet_ntoa(&RealHostAddr)); + /* FALLTHROUGH */ + + case CMDERROR: /* unknown command */ +#if MAXBADCOMMANDS > 0 + if (++n_badcmds > MAXBADCOMMANDS) + { + stopattack: + message("421 4.7.0 %s Too many bad commands; closing connection", + MyHostName); + + /* arrange to ignore any current send list */ + e->e_sendqueue = NULL; + goto doquit; + } +#endif /* MAXBADCOMMANDS > 0 */ + +#if MILTER && SMFI_VERSION > 2 + if (smtp.sm_milterlist && smtp.sm_milterize && + !bitset(EF_DISCARD, e->e_flags)) + { + char state; + char *response; + + if (MilterLogLevel > 9) + sm_syslog(LOG_INFO, e->e_id, + "Sending \"%s\" to Milter", inp); + response = milter_unknown(inp, e, &state); + MILTER_REPLY("unknown"); + if (state == SMFIR_REPLYCODE || + state == SMFIR_REJECT || + state == SMFIR_TEMPFAIL) + { + /* MILTER_REPLY already gave an error */ + break; + } + } +#endif /* MILTER && SMFI_VERSION > 2 */ + + usrerr("500 5.5.1 Command unrecognized: \"%s\"", + shortenstring(inp, MAXSHORTSTR)); + break; + + case CMDUNIMPL: + DELAY_CONN("Unimpl"); + usrerr("502 5.5.1 Command not implemented: \"%s\"", + shortenstring(inp, MAXSHORTSTR)); + break; + + default: + DELAY_CONN("default"); + errno = 0; + syserr("500 5.5.0 smtp: unknown code %d", c->cmd_code); + break; + } +#if SASL + } +#endif /* SASL */ + } + SM_EXCEPT(exc, "[!F]*") + { + /* + ** The only possible exception is "E:mta.quickabort". + ** There is nothing to do except fall through and loop. + */ + } + SM_END_TRY + } +} +/* +** SMTP_DATA -- implement the SMTP DATA command. +** +** Parameters: +** smtp -- status of SMTP connection. +** e -- envelope. +** +** Returns: +** true iff SMTP session can continue. +** +** Side Effects: +** possibly sends message. +*/ + +static bool +smtp_data(smtp, e) + SMTP_T *smtp; + ENVELOPE *e; +{ +#if MILTER + bool milteraccept; +#endif /* MILTER */ + bool aborting; + bool doublequeue; + ADDRESS *a; + ENVELOPE *ee; + char *id; + char *oldid; + char buf[32]; + + SmtpPhase = "server DATA"; + if (!smtp->sm_gotmail) + { + usrerr("503 5.0.0 Need MAIL command"); + return true; + } + else if (smtp->sm_nrcpts <= 0) + { + usrerr("503 5.0.0 Need RCPT (recipient)"); + return true; + } + (void) sm_snprintf(buf, sizeof buf, "%u", smtp->sm_nrcpts); + if (rscheck("check_data", buf, NULL, e, + RSF_RMCOMM|RSF_UNSTRUCTURED|RSF_COUNT, 3, NULL, + e->e_id) != EX_OK) + return true; + +#if MILTER && SMFI_VERSION > 3 + if (smtp->sm_milterlist && smtp->sm_milterize && + !bitset(EF_DISCARD, e->e_flags)) + { + char state; + char *response; + int savelogusrerrs = LogUsrErrs; + + response = milter_data_cmd(e, &state); + switch (state) + { + case SMFIR_REPLYCODE: + if (MilterLogLevel > 3) + { + sm_syslog(LOG_INFO, e->e_id, + "Milter: cmd=data, reject=%s", + response); + LogUsrErrs = false; + } + usrerr(response); + if (strncmp(response, "421 ", 4) == 0) + { + e->e_sendqueue = NULL; + return false; + } + return true; + + case SMFIR_REJECT: + if (MilterLogLevel > 3) + { + sm_syslog(LOG_INFO, e->e_id, + "Milter: cmd=data, reject=550 5.7.1 Command rejected"); + LogUsrErrs = false; + } + usrerr("550 5.7.1 Command rejected"); + return true; + + case SMFIR_DISCARD: + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: cmd=data, discard"); + e->e_flags |= EF_DISCARD; + break; + + case SMFIR_TEMPFAIL: + if (MilterLogLevel > 3) + { + sm_syslog(LOG_INFO, e->e_id, + "Milter: cmd=data, reject=%s", + MSG_TEMPFAIL); + LogUsrErrs = false; + } + usrerr(MSG_TEMPFAIL); + return true; + } + LogUsrErrs = savelogusrerrs; + if (response != NULL) + sm_free(response); /* XXX */ + } +#endif /* MILTER && SMFI_VERSION > 3 */ + + /* put back discard bit */ + if (smtp->sm_discard) + e->e_flags |= EF_DISCARD; + + /* check to see if we need to re-expand aliases */ + /* also reset QS_BADADDR on already-diagnosted addrs */ + doublequeue = false; + for (a = e->e_sendqueue; a != NULL; a = a->q_next) + { + if (QS_IS_VERIFIED(a->q_state) && + !bitset(EF_DISCARD, e->e_flags)) + { + /* need to re-expand aliases */ + doublequeue = true; + } + if (QS_IS_BADADDR(a->q_state)) + { + /* make this "go away" */ + a->q_state = QS_DONTSEND; + } + } + + /* collect the text of the message */ + SmtpPhase = "collect"; + buffer_errors(); + + collect(InChannel, true, NULL, e, true); + + /* redefine message size */ + (void) sm_snprintf(buf, sizeof buf, "%ld", e->e_msgsize); + macdefine(&e->e_macro, A_TEMP, macid("{msg_size}"), buf); + +#if _FFR_CHECK_EOM + /* rscheck() will set Errors or EF_DISCARD if it trips */ + (void) rscheck("check_eom", buf, NULL, e, RSF_UNSTRUCTURED|RSF_COUNT, + 3, NULL, e->e_id); +#endif /* _FFR_CHECK_EOM */ + +#if MILTER + milteraccept = true; + if (smtp->sm_milterlist && smtp->sm_milterize && + Errors <= 0 && + !bitset(EF_DISCARD, e->e_flags)) + { + char state; + char *response; + + response = milter_data(e, &state); + switch (state) + { + case SMFIR_REPLYCODE: + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: data, reject=%s", + response); + milteraccept = false; + usrerr(response); + break; + + case SMFIR_REJECT: + milteraccept = false; + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: data, reject=554 5.7.1 Command rejected"); + usrerr("554 5.7.1 Command rejected"); + break; + + case SMFIR_DISCARD: + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: data, discard"); + milteraccept = false; + e->e_flags |= EF_DISCARD; + break; + + case SMFIR_TEMPFAIL: + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: data, reject=%s", + MSG_TEMPFAIL); + milteraccept = false; + usrerr(MSG_TEMPFAIL); + break; + } + if (response != NULL) + sm_free(response); + } + + /* Milter may have changed message size */ + (void) sm_snprintf(buf, sizeof buf, "%ld", e->e_msgsize); + macdefine(&e->e_macro, A_TEMP, macid("{msg_size}"), buf); + + /* abort message filters that didn't get the body & log msg is OK */ + if (smtp->sm_milterlist && smtp->sm_milterize) + { + milter_abort(e); + if (milteraccept && MilterLogLevel > 9) + sm_syslog(LOG_INFO, e->e_id, "Milter accept: message"); + } + + /* + ** If SuperSafe is SAFE_REALLY_POSTMILTER, and we don't have milter or + ** milter accepted message, sync it now + ** + ** XXX This is almost a copy of the code in collect(): put it into + ** a function that is called from both places? + */ + + if (milteraccept && SuperSafe == SAFE_REALLY_POSTMILTER) + { + int afd; + SM_FILE_T *volatile df; + char *dfname; + + df = e->e_dfp; + dfname = queuename(e, DATAFL_LETTER); + if (sm_io_setinfo(df, SM_BF_COMMIT, NULL) < 0 + && errno != EINVAL) + { + int save_errno; + + save_errno = errno; + if (save_errno == EEXIST) + { + struct stat st; + int dfd; + + if (stat(dfname, &st) < 0) + st.st_size = -1; + errno = EEXIST; + syserr("@collect: bfcommit(%s): already on disk, size=%ld", + dfname, (long) st.st_size); + dfd = sm_io_getinfo(df, SM_IO_WHAT_FD, NULL); + if (dfd >= 0) + dumpfd(dfd, true, true); + } + errno = save_errno; + dferror(df, "bfcommit", e); + flush_errors(true); + finis(save_errno != EEXIST, true, ExitStat); + } + else if ((afd = sm_io_getinfo(df, SM_IO_WHAT_FD, NULL)) < 0) + { + dferror(df, "sm_io_getinfo", e); + flush_errors(true); + finis(true, true, ExitStat); + /* NOTREACHED */ + } + else if (fsync(afd) < 0) + { + dferror(df, "fsync", e); + flush_errors(true); + finis(true, true, ExitStat); + /* NOTREACHED */ + } + else if (sm_io_close(df, SM_TIME_DEFAULT) < 0) + { + dferror(df, "sm_io_close", e); + flush_errors(true); + finis(true, true, ExitStat); + /* NOTREACHED */ + } + + /* Now reopen the df file */ + e->e_dfp = sm_io_open(SmFtStdio, SM_TIME_DEFAULT, dfname, + SM_IO_RDONLY, NULL); + if (e->e_dfp == NULL) + { + /* we haven't acked receipt yet, so just chuck this */ + syserr("@Cannot reopen %s", dfname); + finis(true, true, ExitStat); + /* NOTREACHED */ + } + } +#endif /* MILTER */ + + /* Check if quarantining stats should be updated */ + if (e->e_quarmsg != NULL) + markstats(e, NULL, STATS_QUARANTINE); + + /* + ** If a header/body check (header checks or milter) + ** set EF_DISCARD, don't queueup the message -- + ** that would lose the EF_DISCARD bit and deliver + ** the message. + */ + + if (bitset(EF_DISCARD, e->e_flags)) + doublequeue = false; + + aborting = Errors > 0; + if (!(aborting || bitset(EF_DISCARD, e->e_flags)) && + (QueueMode == QM_QUARANTINE || e->e_quarmsg == NULL) && + !split_by_recipient(e)) + aborting = bitset(EF_FATALERRS, e->e_flags); + + if (aborting) + { + /* Log who the mail would have gone to */ + logundelrcpts(e, e->e_message, 8, false); + flush_errors(true); + buffer_errors(); + goto abortmessage; + } + + /* from now on, we have to operate silently */ + buffer_errors(); + +#if 0 + /* + ** Clear message, it may contain an error from the SMTP dialogue. + ** This error must not show up in the queue. + ** Some error message should show up, e.g., alias database + ** not available, but others shouldn't, e.g., from check_rcpt. + */ + + e->e_message = NULL; +#endif /* 0 */ + + /* + ** Arrange to send to everyone. + ** If sending to multiple people, mail back + ** errors rather than reporting directly. + ** In any case, don't mail back errors for + ** anything that has happened up to + ** now (the other end will do this). + ** Truncate our transcript -- the mail has gotten + ** to us successfully, and if we have + ** to mail this back, it will be easier + ** on the reader. + ** Then send to everyone. + ** Finally give a reply code. If an error has + ** already been given, don't mail a + ** message back. + ** We goose error returns by clearing error bit. + */ + + SmtpPhase = "delivery"; + (void) sm_io_setinfo(e->e_xfp, SM_BF_TRUNCATE, NULL); + id = e->e_id; + +#if NAMED_BIND + _res.retry = TimeOuts.res_retry[RES_TO_FIRST]; + _res.retrans = TimeOuts.res_retrans[RES_TO_FIRST]; +#endif /* NAMED_BIND */ + + for (ee = e; ee != NULL; ee = ee->e_sibling) + { + /* make sure we actually do delivery */ + ee->e_flags &= ~EF_CLRQUEUE; + + /* from now on, operate silently */ + ee->e_errormode = EM_MAIL; + + if (doublequeue) + { + /* make sure it is in the queue */ + queueup(ee, false, true); + } + else + { + /* send to all recipients */ + sendall(ee, SM_DEFAULT); + } + ee->e_to = NULL; + } + + /* put back id for SMTP logging in putoutmsg() */ + oldid = CurEnv->e_id; + CurEnv->e_id = id; + + /* issue success message */ + message("250 2.0.0 %s Message accepted for delivery", id); + CurEnv->e_id = oldid; + + /* if we just queued, poke it */ + if (doublequeue) + { + bool anything_to_send = false; + + sm_getla(); + for (ee = e; ee != NULL; ee = ee->e_sibling) + { + if (WILL_BE_QUEUED(ee->e_sendmode)) + continue; + if (shouldqueue(ee->e_msgpriority, ee->e_ctime)) + { + ee->e_sendmode = SM_QUEUE; + continue; + } + else if (QueueMode != QM_QUARANTINE && + ee->e_quarmsg != NULL) + { + ee->e_sendmode = SM_QUEUE; + continue; + } + anything_to_send = true; + + /* close all the queue files */ + closexscript(ee); + if (ee->e_dfp != NULL) + { + (void) sm_io_close(ee->e_dfp, SM_TIME_DEFAULT); + ee->e_dfp = NULL; + } + unlockqueue(ee); + } + if (anything_to_send) + { +#if PIPELINING + /* + ** XXX if we don't do this, we get 250 twice + ** because it is also flushed in the child. + */ + + (void) sm_io_flush(OutChannel, SM_TIME_DEFAULT); +#endif /* PIPELINING */ + (void) doworklist(e, true, true); + } + } + + abortmessage: + if (LogLevel > 4 && bitset(EF_LOGSENDER, e->e_flags)) + logsender(e, NULL); + e->e_flags &= ~EF_LOGSENDER; + + /* clean up a bit */ + smtp->sm_gotmail = false; + + /* + ** Call dropenvelope if and only if the envelope is *not* + ** being processed by the child process forked by doworklist(). + */ + + if (aborting || bitset(EF_DISCARD, e->e_flags)) + dropenvelope(e, true, false); + else + { + for (ee = e; ee != NULL; ee = ee->e_sibling) + { + if (!doublequeue && + QueueMode != QM_QUARANTINE && + ee->e_quarmsg != NULL) + { + dropenvelope(ee, true, false); + continue; + } + if (WILL_BE_QUEUED(ee->e_sendmode)) + dropenvelope(ee, true, false); + } + } + sm_rpool_free(e->e_rpool); + + /* + ** At this point, e == &MainEnvelope, but if we did splitting, + ** then CurEnv may point to an envelope structure that was just + ** freed with the rpool. So reset CurEnv *before* calling + ** newenvelope. + */ + + CurEnv = e; + newenvelope(e, e, sm_rpool_new_x(NULL)); + e->e_flags = BlankEnvelope.e_flags; + + /* restore connection quarantining */ + if (smtp->sm_quarmsg == NULL) + { + e->e_quarmsg = NULL; + macdefine(&e->e_macro, A_PERM, macid("{quarantine}"), ""); + } + else + { + e->e_quarmsg = sm_rpool_strdup_x(e->e_rpool, smtp->sm_quarmsg); + macdefine(&e->e_macro, A_PERM, + macid("{quarantine}"), e->e_quarmsg); + } + return true; +} +/* +** LOGUNDELRCPTS -- log undelivered (or all) recipients. +** +** Parameters: +** e -- envelope. +** msg -- message for Stat= +** level -- log level. +** all -- log all recipients. +** +** Returns: +** none. +** +** Side Effects: +** logs undelivered (or all) recipients +*/ + +void +logundelrcpts(e, msg, level, all) + ENVELOPE *e; + char *msg; + int level; + bool all; +{ + ADDRESS *a; + + if (LogLevel <= level || msg == NULL || *msg == '\0') + return; + + /* Clear $h so relay= doesn't get mislogged by logdelivery() */ + macdefine(&e->e_macro, A_PERM, 'h', NULL); + + /* Log who the mail would have gone to */ + for (a = e->e_sendqueue; a != NULL; a = a->q_next) + { + if (!QS_IS_UNDELIVERED(a->q_state) && !all) + continue; + e->e_to = a->q_paddr; + logdelivery(NULL, NULL, a->q_status, msg, NULL, + (time_t) 0, e); + } + e->e_to = NULL; +} +/* +** CHECKSMTPATTACK -- check for denial-of-service attack by repetition +** +** Parameters: +** pcounter -- pointer to a counter for this command. +** maxcount -- maximum value for this counter before we +** slow down. +** waitnow -- sleep now (in this routine)? +** cname -- command name for logging. +** e -- the current envelope. +** +** Returns: +** time to wait, +** STOP_ATTACK if twice as many commands as allowed and +** MaxChildren > 0. +** +** Side Effects: +** Slows down if we seem to be under attack. +*/ + +static time_t +checksmtpattack(pcounter, maxcount, waitnow, cname, e) + volatile unsigned int *pcounter; + unsigned int maxcount; + bool waitnow; + char *cname; + ENVELOPE *e; +{ + if (maxcount <= 0) /* no limit */ + return (time_t) 0; + + if (++(*pcounter) >= maxcount) + { + unsigned int shift; + time_t s; + + if (*pcounter == maxcount && LogLevel > 5) + { + sm_syslog(LOG_INFO, e->e_id, + "%s: possible SMTP attack: command=%.40s, count=%u", + CurSmtpClient, cname, *pcounter); + } + shift = *pcounter - maxcount; + s = 1 << shift; + if (shift > MAXSHIFT || s >= MAXTIMEOUT || s <= 0) + s = MAXTIMEOUT; + +#define IS_ATTACK(s) ((MaxChildren > 0 && *pcounter >= maxcount * 2) \ + ? STOP_ATTACK : (time_t) s) + + /* sleep at least 1 second before returning */ + (void) sleep(*pcounter / maxcount); + s -= *pcounter / maxcount; + if (s >= MAXTIMEOUT || s < 0) + s = MAXTIMEOUT; + if (waitnow && s > 0) + { + (void) sleep(s); + return IS_ATTACK(0); + } + return IS_ATTACK(s); + } + return (time_t) 0; +} +/* +** SETUP_SMTPD_IO -- setup I/O fd correctly for the SMTP server +** +** Parameters: +** none. +** +** Returns: +** nothing. +** +** Side Effects: +** may change I/O fd. +*/ + +static void +setup_smtpd_io() +{ + int inchfd, outchfd, outfd; + + inchfd = sm_io_getinfo(InChannel, SM_IO_WHAT_FD, NULL); + outchfd = sm_io_getinfo(OutChannel, SM_IO_WHAT_FD, NULL); + outfd = sm_io_getinfo(smioout, SM_IO_WHAT_FD, NULL); + if (outchfd != outfd) + { + /* arrange for debugging output to go to remote host */ + (void) dup2(outchfd, outfd); + } + + /* + ** if InChannel and OutChannel are stdin/stdout + ** and connected to ttys + ** and fcntl(STDIN, F_SETFL, O_NONBLOCKING) also changes STDOUT, + ** then "chain" them together. + */ + + if (inchfd == STDIN_FILENO && outchfd == STDOUT_FILENO && + isatty(inchfd) && isatty(outchfd)) + { + int inmode, outmode; + + inmode = fcntl(inchfd, F_GETFL, 0); + if (inmode == -1) + { + if (LogLevel > 11) + sm_syslog(LOG_INFO, NOQID, + "fcntl(inchfd, F_GETFL) failed: %s", + sm_errstring(errno)); + return; + } + outmode = fcntl(outchfd, F_GETFL, 0); + if (outmode == -1) + { + if (LogLevel > 11) + sm_syslog(LOG_INFO, NOQID, + "fcntl(outchfd, F_GETFL) failed: %s", + sm_errstring(errno)); + return; + } + if (bitset(O_NONBLOCK, inmode) || + bitset(O_NONBLOCK, outmode) || + fcntl(inchfd, F_SETFL, inmode | O_NONBLOCK) == -1) + return; + outmode = fcntl(outchfd, F_GETFL, 0); + if (outmode != -1 && bitset(O_NONBLOCK, outmode)) + { + /* changing InChannel also changes OutChannel */ + sm_io_automode(OutChannel, InChannel); + if (tTd(97, 4) && LogLevel > 9) + sm_syslog(LOG_INFO, NOQID, + "set automode for I (%d)/O (%d) in SMTP server", + inchfd, outchfd); + } + + /* undo change of inchfd */ + (void) fcntl(inchfd, F_SETFL, inmode); + } +} +/* +** SKIPWORD -- skip a fixed word. +** +** Parameters: +** p -- place to start looking. +** w -- word to skip. +** +** Returns: +** p following w. +** NULL on error. +** +** Side Effects: +** clobbers the p data area. +*/ + +static char * +skipword(p, w) + register char *volatile p; + char *w; +{ + register char *q; + char *firstp = p; + + /* find beginning of word */ + SKIP_SPACE(p); + q = p; + + /* find end of word */ + while (*p != '\0' && *p != ':' && !(isascii(*p) && isspace(*p))) + p++; + while (isascii(*p) && isspace(*p)) + *p++ = '\0'; + if (*p != ':') + { + syntax: + usrerr("501 5.5.2 Syntax error in parameters scanning \"%s\"", + shortenstring(firstp, MAXSHORTSTR)); + return NULL; + } + *p++ = '\0'; + SKIP_SPACE(p); + + if (*p == '\0') + goto syntax; + + /* see if the input word matches desired word */ + if (sm_strcasecmp(q, w)) + goto syntax; + + return p; +} +/* +** MAIL_ESMTP_ARGS -- process ESMTP arguments from MAIL line +** +** Parameters: +** kp -- the parameter key. +** vp -- the value of that parameter. +** e -- the envelope. +** +** Returns: +** none. +*/ + +static void +mail_esmtp_args(kp, vp, e) + char *kp; + char *vp; + ENVELOPE *e; +{ + if (sm_strcasecmp(kp, "size") == 0) + { + if (vp == NULL) + { + usrerr("501 5.5.2 SIZE requires a value"); + /* NOTREACHED */ + } + macdefine(&e->e_macro, A_TEMP, macid("{msg_size}"), vp); + errno = 0; + e->e_msgsize = strtol(vp, (char **) NULL, 10); + if (e->e_msgsize == LONG_MAX && errno == ERANGE) + { + usrerr("552 5.2.3 Message size exceeds maximum value"); + /* NOTREACHED */ + } + if (e->e_msgsize < 0) + { + usrerr("552 5.2.3 Message size invalid"); + /* NOTREACHED */ + } + } + else if (sm_strcasecmp(kp, "body") == 0) + { + if (vp == NULL) + { + usrerr("501 5.5.2 BODY requires a value"); + /* NOTREACHED */ + } + else if (sm_strcasecmp(vp, "8bitmime") == 0) + { + SevenBitInput = false; + } + else if (sm_strcasecmp(vp, "7bit") == 0) + { + SevenBitInput = true; + } + else + { + usrerr("501 5.5.4 Unknown BODY type %s", vp); + /* NOTREACHED */ + } + e->e_bodytype = sm_rpool_strdup_x(e->e_rpool, vp); + } + else if (sm_strcasecmp(kp, "envid") == 0) + { + if (bitset(PRIV_NORECEIPTS, PrivacyFlags)) + { + usrerr("504 5.7.0 Sorry, ENVID not supported, we do not allow DSN"); + /* NOTREACHED */ + } + if (vp == NULL) + { + usrerr("501 5.5.2 ENVID requires a value"); + /* NOTREACHED */ + } + if (!xtextok(vp)) + { + usrerr("501 5.5.4 Syntax error in ENVID parameter value"); + /* NOTREACHED */ + } + if (e->e_envid != NULL) + { + usrerr("501 5.5.0 Duplicate ENVID parameter"); + /* NOTREACHED */ + } + e->e_envid = sm_rpool_strdup_x(e->e_rpool, vp); + macdefine(&e->e_macro, A_PERM, + macid("{dsn_envid}"), e->e_envid); + } + else if (sm_strcasecmp(kp, "ret") == 0) + { + if (bitset(PRIV_NORECEIPTS, PrivacyFlags)) + { + usrerr("504 5.7.0 Sorry, RET not supported, we do not allow DSN"); + /* NOTREACHED */ + } + if (vp == NULL) + { + usrerr("501 5.5.2 RET requires a value"); + /* NOTREACHED */ + } + if (bitset(EF_RET_PARAM, e->e_flags)) + { + usrerr("501 5.5.0 Duplicate RET parameter"); + /* NOTREACHED */ + } + e->e_flags |= EF_RET_PARAM; + if (sm_strcasecmp(vp, "hdrs") == 0) + e->e_flags |= EF_NO_BODY_RETN; + else if (sm_strcasecmp(vp, "full") != 0) + { + usrerr("501 5.5.2 Bad argument \"%s\" to RET", vp); + /* NOTREACHED */ + } + macdefine(&e->e_macro, A_TEMP, macid("{dsn_ret}"), vp); + } +#if SASL + else if (sm_strcasecmp(kp, "auth") == 0) + { + int len; + char *q; + char *auth_param; /* the value of the AUTH=x */ + bool saveQuickAbort = QuickAbort; + bool saveSuprErrs = SuprErrs; + bool saveExitStat = ExitStat; + + if (vp == NULL) + { + usrerr("501 5.5.2 AUTH= requires a value"); + /* NOTREACHED */ + } + if (e->e_auth_param != NULL) + { + usrerr("501 5.5.0 Duplicate AUTH parameter"); + /* NOTREACHED */ + } + if ((q = strchr(vp, ' ')) != NULL) + len = q - vp + 1; + else + len = strlen(vp) + 1; + auth_param = xalloc(len); + (void) sm_strlcpy(auth_param, vp, len); + if (!xtextok(auth_param)) + { + usrerr("501 5.5.4 Syntax error in AUTH parameter value"); + /* just a warning? */ + /* NOTREACHED */ + } + + /* XXX define this always or only if trusted? */ + macdefine(&e->e_macro, A_TEMP, macid("{auth_author}"), + auth_param); + + /* + ** call Strust_auth to find out whether + ** auth_param is acceptable (trusted) + ** we shouldn't trust it if not authenticated + ** (required by RFC, leave it to ruleset?) + */ + + SuprErrs = true; + QuickAbort = false; + if (strcmp(auth_param, "<>") != 0 && + (rscheck("trust_auth", auth_param, NULL, e, RSF_RMCOMM, + 9, NULL, NOQID) != EX_OK || Errors > 0)) + { + if (tTd(95, 8)) + { + q = e->e_auth_param; + sm_dprintf("auth=\"%.100s\" not trusted user=\"%.100s\"\n", + auth_param, (q == NULL) ? "" : q); + } + + /* not trusted */ + e->e_auth_param = "<>"; +# if _FFR_AUTH_PASSING + macdefine(&BlankEnvelope.e_macro, A_PERM, + macid("{auth_author}"), NULL); +# endif /* _FFR_AUTH_PASSING */ + } + else + { + if (tTd(95, 8)) + sm_dprintf("auth=\"%.100s\" trusted\n", auth_param); + e->e_auth_param = sm_rpool_strdup_x(e->e_rpool, + auth_param); + } + sm_free(auth_param); /* XXX */ + + /* reset values */ + Errors = 0; + QuickAbort = saveQuickAbort; + SuprErrs = saveSuprErrs; + ExitStat = saveExitStat; + } +#endif /* SASL */ +#define PRTCHAR(c) ((isascii(c) && isprint(c)) ? (c) : '?') + + /* + ** "by" is only accepted if DeliverByMin >= 0. + ** We maybe could add this to the list of server_features. + */ + + else if (sm_strcasecmp(kp, "by") == 0 && DeliverByMin >= 0) + { + char *s; + + if (vp == NULL) + { + usrerr("501 5.5.2 BY= requires a value"); + /* NOTREACHED */ + } + errno = 0; + e->e_deliver_by = strtol(vp, &s, 10); + if (e->e_deliver_by == LONG_MIN || + e->e_deliver_by == LONG_MAX || + e->e_deliver_by > 999999999l || + e->e_deliver_by < -999999999l) + { + usrerr("501 5.5.2 BY=%s out of range", vp); + /* NOTREACHED */ + } + if (s == NULL || *s != ';') + { + usrerr("501 5.5.2 BY= missing ';'"); + /* NOTREACHED */ + } + e->e_dlvr_flag = 0; + ++s; /* XXX: spaces allowed? */ + SKIP_SPACE(s); + switch (tolower(*s)) + { + case 'n': + e->e_dlvr_flag = DLVR_NOTIFY; + break; + case 'r': + e->e_dlvr_flag = DLVR_RETURN; + if (e->e_deliver_by <= 0) + { + usrerr("501 5.5.4 mode R requires BY time > 0"); + /* NOTREACHED */ + } + if (DeliverByMin > 0 && e->e_deliver_by > 0 && + e->e_deliver_by < DeliverByMin) + { + usrerr("555 5.5.2 time %ld less than %ld", + e->e_deliver_by, (long) DeliverByMin); + /* NOTREACHED */ + } + break; + default: + usrerr("501 5.5.2 illegal by-mode '%c'", PRTCHAR(*s)); + /* NOTREACHED */ + } + ++s; /* XXX: spaces allowed? */ + SKIP_SPACE(s); + switch (tolower(*s)) + { + case 't': + e->e_dlvr_flag |= DLVR_TRACE; + break; + case '\0': + break; + default: + usrerr("501 5.5.2 illegal by-trace '%c'", PRTCHAR(*s)); + /* NOTREACHED */ + } + + /* XXX: check whether more characters follow? */ + } + else + { + usrerr("555 5.5.4 %s parameter unrecognized", kp); + /* NOTREACHED */ + } +} +/* +** RCPT_ESMTP_ARGS -- process ESMTP arguments from RCPT line +** +** Parameters: +** a -- the address corresponding to the To: parameter. +** kp -- the parameter key. +** vp -- the value of that parameter. +** e -- the envelope. +** +** Returns: +** none. +*/ + +static void +rcpt_esmtp_args(a, kp, vp, e) + ADDRESS *a; + char *kp; + char *vp; + ENVELOPE *e; +{ + if (sm_strcasecmp(kp, "notify") == 0) + { + char *p; + + if (bitset(PRIV_NORECEIPTS, PrivacyFlags)) + { + usrerr("504 5.7.0 Sorry, NOTIFY not supported, we do not allow DSN"); + /* NOTREACHED */ + } + if (vp == NULL) + { + usrerr("501 5.5.2 NOTIFY requires a value"); + /* NOTREACHED */ + } + a->q_flags &= ~(QPINGONSUCCESS|QPINGONFAILURE|QPINGONDELAY); + a->q_flags |= QHASNOTIFY; + macdefine(&e->e_macro, A_TEMP, macid("{dsn_notify}"), vp); + + if (sm_strcasecmp(vp, "never") == 0) + return; + for (p = vp; p != NULL; vp = p) + { + p = strchr(p, ','); + if (p != NULL) + *p++ = '\0'; + if (sm_strcasecmp(vp, "success") == 0) + a->q_flags |= QPINGONSUCCESS; + else if (sm_strcasecmp(vp, "failure") == 0) + a->q_flags |= QPINGONFAILURE; + else if (sm_strcasecmp(vp, "delay") == 0) + a->q_flags |= QPINGONDELAY; + else + { + usrerr("501 5.5.4 Bad argument \"%s\" to NOTIFY", + vp); + /* NOTREACHED */ + } + } + } + else if (sm_strcasecmp(kp, "orcpt") == 0) + { + if (bitset(PRIV_NORECEIPTS, PrivacyFlags)) + { + usrerr("504 5.7.0 Sorry, ORCPT not supported, we do not allow DSN"); + /* NOTREACHED */ + } + if (vp == NULL) + { + usrerr("501 5.5.2 ORCPT requires a value"); + /* NOTREACHED */ + } + if (strchr(vp, ';') == NULL || !xtextok(vp)) + { + usrerr("501 5.5.4 Syntax error in ORCPT parameter value"); + /* NOTREACHED */ + } + if (a->q_orcpt != NULL) + { + usrerr("501 5.5.0 Duplicate ORCPT parameter"); + /* NOTREACHED */ + } + a->q_orcpt = sm_rpool_strdup_x(e->e_rpool, vp); + } + else + { + usrerr("555 5.5.4 %s parameter unrecognized", kp); + /* NOTREACHED */ + } +} +/* +** PRINTVRFYADDR -- print an entry in the verify queue +** +** Parameters: +** a -- the address to print. +** last -- set if this is the last one. +** vrfy -- set if this is a VRFY command. +** +** Returns: +** none. +** +** Side Effects: +** Prints the appropriate 250 codes. +*/ +#define OFFF (3 + 1 + 5 + 1) /* offset in fmt: SMTP reply + enh. code */ + +static void +printvrfyaddr(a, last, vrfy) + register ADDRESS *a; + bool last; + bool vrfy; +{ + char fmtbuf[30]; + + if (vrfy && a->q_mailer != NULL && + !bitnset(M_VRFY250, a->q_mailer->m_flags)) + (void) sm_strlcpy(fmtbuf, "252", sizeof fmtbuf); + else + (void) sm_strlcpy(fmtbuf, "250", sizeof fmtbuf); + fmtbuf[3] = last ? ' ' : '-'; + (void) sm_strlcpy(&fmtbuf[4], "2.1.5 ", sizeof fmtbuf - 4); + if (a->q_fullname == NULL) + { + if ((a->q_mailer == NULL || + a->q_mailer->m_addrtype == NULL || + sm_strcasecmp(a->q_mailer->m_addrtype, "rfc822") == 0) && + strchr(a->q_user, '@') == NULL) + (void) sm_strlcpy(&fmtbuf[OFFF], "<%s@%s>", + sizeof fmtbuf - OFFF); + else + (void) sm_strlcpy(&fmtbuf[OFFF], "<%s>", + sizeof fmtbuf - OFFF); + message(fmtbuf, a->q_user, MyHostName); + } + else + { + if ((a->q_mailer == NULL || + a->q_mailer->m_addrtype == NULL || + sm_strcasecmp(a->q_mailer->m_addrtype, "rfc822") == 0) && + strchr(a->q_user, '@') == NULL) + (void) sm_strlcpy(&fmtbuf[OFFF], "%s <%s@%s>", + sizeof fmtbuf - OFFF); + else + (void) sm_strlcpy(&fmtbuf[OFFF], "%s <%s>", + sizeof fmtbuf - OFFF); + message(fmtbuf, a->q_fullname, a->q_user, MyHostName); + } +} + +#if SASL +/* +** SASLMECHS -- get list of possible AUTH mechanisms +** +** Parameters: +** conn -- SASL connection info. +** mechlist -- output parameter for list of mechanisms. +** +** Returns: +** number of mechs. +*/ + +static int +saslmechs(conn, mechlist) + sasl_conn_t *conn; + char **mechlist; +{ + int len, num, result; + + /* "user" is currently unused */ +# if SASL >= 20000 + result = sasl_listmech(conn, NULL, + "", " ", "", (const char **) mechlist, + (unsigned int *)&len, &num); +# else /* SASL >= 20000 */ + result = sasl_listmech(conn, "user", /* XXX */ + "", " ", "", mechlist, + (unsigned int *)&len, (unsigned int *)&num); +# endif /* SASL >= 20000 */ + if (result != SASL_OK) + { + if (LogLevel > 9) + sm_syslog(LOG_WARNING, NOQID, + "AUTH error: listmech=%d, num=%d", + result, num); + num = 0; + } + if (num > 0) + { + if (LogLevel > 11) + sm_syslog(LOG_INFO, NOQID, + "AUTH: available mech=%s, allowed mech=%s", + *mechlist, AuthMechanisms); + *mechlist = intersect(AuthMechanisms, *mechlist, NULL); + } + else + { + *mechlist = NULL; /* be paranoid... */ + if (result == SASL_OK && LogLevel > 9) + sm_syslog(LOG_WARNING, NOQID, + "AUTH warning: no mechanisms"); + } + return num; +} + +# if SASL >= 20000 +/* +** PROXY_POLICY -- define proxy policy for AUTH +** +** Parameters: +** conn -- unused. +** context -- unused. +** requested_user -- authorization identity. +** rlen -- authorization identity length. +** auth_identity -- authentication identity. +** alen -- authentication identity length. +** def_realm -- default user realm. +** urlen -- user realm length. +** propctx -- unused. +** +** Returns: +** ok? +** +** Side Effects: +** sets {auth_authen} macro. +*/ + +int +proxy_policy(conn, context, requested_user, rlen, auth_identity, alen, + def_realm, urlen, propctx) + sasl_conn_t *conn; + void *context; + const char *requested_user; + unsigned rlen; + const char *auth_identity; + unsigned alen; + const char *def_realm; + unsigned urlen; + struct propctx *propctx; +{ + if (auth_identity == NULL) + return SASL_FAIL; + + macdefine(&BlankEnvelope.e_macro, A_TEMP, + macid("{auth_authen}"), (char *) auth_identity); + + return SASL_OK; +} +# else /* SASL >= 20000 */ + +/* +** PROXY_POLICY -- define proxy policy for AUTH +** +** Parameters: +** context -- unused. +** auth_identity -- authentication identity. +** requested_user -- authorization identity. +** user -- allowed user (output). +** errstr -- possible error string (output). +** +** Returns: +** ok? +*/ + +int +proxy_policy(context, auth_identity, requested_user, user, errstr) + void *context; + const char *auth_identity; + const char *requested_user; + const char **user; + const char **errstr; +{ + if (user == NULL || auth_identity == NULL) + return SASL_FAIL; + *user = newstr(auth_identity); + return SASL_OK; +} +# endif /* SASL >= 20000 */ +#endif /* SASL */ + +#if STARTTLS +/* +** INITSRVTLS -- initialize server side TLS +** +** Parameters: +** tls_ok -- should tls initialization be done? +** +** Returns: +** succeeded? +** +** Side Effects: +** sets tls_ok_srv which is a static variable in this module. +** Do NOT remove assignments to it! +*/ + +bool +initsrvtls(tls_ok) + bool tls_ok; +{ + if (!tls_ok) + return false; + + /* do NOT remove assignment */ + tls_ok_srv = inittls(&srv_ctx, TLS_Srv_Opts, true, SrvCertFile, + SrvKeyFile, CACertPath, CACertFile, DHParams); + return tls_ok_srv; +} +#endif /* STARTTLS */ +/* +** SRVFEATURES -- get features for SMTP server +** +** Parameters: +** e -- envelope (should be session context). +** clientname -- name of client. +** features -- default features for this invocation. +** +** Returns: +** server features. +*/ + +/* table with options: it uses just one character, how about strings? */ +static struct +{ + char srvf_opt; + unsigned int srvf_flag; +} srv_feat_table[] = +{ + { 'A', SRV_OFFER_AUTH }, + { 'B', SRV_OFFER_VERB }, + { 'C', SRV_REQ_SEC }, + { 'D', SRV_OFFER_DSN }, + { 'E', SRV_OFFER_ETRN }, + { 'L', SRV_REQ_AUTH }, +#if PIPELINING +# if _FFR_NO_PIPE + { 'N', SRV_NO_PIPE }, +# endif /* _FFR_NO_PIPE */ + { 'P', SRV_OFFER_PIPE }, +#endif /* PIPELINING */ + { 'R', SRV_VRFY_CLT }, /* same as V; not documented */ + { 'S', SRV_OFFER_TLS }, +/* { 'T', SRV_TMP_FAIL }, */ + { 'V', SRV_VRFY_CLT }, + { 'X', SRV_OFFER_EXPN }, +/* { 'Y', SRV_OFFER_VRFY }, */ + { '\0', SRV_NONE } +}; + +static unsigned int +srvfeatures(e, clientname, features) + ENVELOPE *e; + char *clientname; + unsigned int features; +{ + int r, i, j; + char **pvp, c, opt; + char pvpbuf[PSBUFSIZE]; + + pvp = NULL; + r = rscap("srv_features", clientname, "", e, &pvp, pvpbuf, + sizeof(pvpbuf)); + if (r != EX_OK) + return features; + if (pvp == NULL || pvp[0] == NULL || (pvp[0][0] & 0377) != CANONNET) + return features; + if (pvp[1] != NULL && sm_strncasecmp(pvp[1], "temp", 4) == 0) + return SRV_TMP_FAIL; + + /* + ** General rule (see sendmail.h, d_flags): + ** lower case: required/offered, upper case: Not required/available + ** + ** Since we can change some features per daemon, we have both + ** cases here: turn on/off a feature. + */ + + for (i = 1; pvp[i] != NULL; i++) + { + c = pvp[i][0]; + j = 0; + for (;;) + { + if ((opt = srv_feat_table[j].srvf_opt) == '\0') + { + if (LogLevel > 9) + sm_syslog(LOG_WARNING, e->e_id, + "srvfeatures: unknown feature %s", + pvp[i]); + break; + } + if (c == opt) + { + features &= ~(srv_feat_table[j].srvf_flag); + break; + } + if (c == tolower(opt)) + { + features |= srv_feat_table[j].srvf_flag; + break; + } + ++j; + } + } + return features; +} + +/* +** HELP -- implement the HELP command. +** +** Parameters: +** topic -- the topic we want help for. +** e -- envelope. +** +** Returns: +** none. +** +** Side Effects: +** outputs the help file to message output. +*/ +#define HELPVSTR "#vers " +#define HELPVERSION 2 + +void +help(topic, e) + char *topic; + ENVELOPE *e; +{ + register SM_FILE_T *hf; + register char *p; + int len; + bool noinfo; + bool first = true; + long sff = SFF_OPENASROOT|SFF_REGONLY; + char buf[MAXLINE]; + char inp[MAXLINE]; + static int foundvers = -1; + extern char Version[]; + + if (DontLockReadFiles) + sff |= SFF_NOLOCK; + if (!bitnset(DBS_HELPFILEINUNSAFEDIRPATH, DontBlameSendmail)) + sff |= SFF_SAFEDIRPATH; + + if (HelpFile == NULL || + (hf = safefopen(HelpFile, O_RDONLY, 0444, sff)) == NULL) + { + /* no help */ + errno = 0; + message("502 5.3.0 Sendmail %s -- HELP not implemented", + Version); + return; + } + + if (topic == NULL || *topic == '\0') + { + topic = "smtp"; + noinfo = false; + } + else + { + makelower(topic); + noinfo = true; + } + + len = strlen(topic); + + while (sm_io_fgets(hf, SM_TIME_DEFAULT, buf, sizeof buf) != NULL) + { + if (buf[0] == '#') + { + if (foundvers < 0 && + strncmp(buf, HELPVSTR, strlen(HELPVSTR)) == 0) + { + int h; + + if (sm_io_sscanf(buf + strlen(HELPVSTR), "%d", + &h) == 1) + foundvers = h; + } + continue; + } + if (strncmp(buf, topic, len) == 0) + { + if (first) + { + first = false; + + /* print version if no/old vers# in file */ + if (foundvers < 2 && !noinfo) + message("214-2.0.0 This is Sendmail version %s", Version); + } + p = strpbrk(buf, " \t"); + if (p == NULL) + p = buf + strlen(buf) - 1; + else + p++; + fixcrlf(p, true); + if (foundvers >= 2) + { + translate_dollars(p); + expand(p, inp, sizeof inp, e); + p = inp; + } + message("214-2.0.0 %s", p); + noinfo = false; + } + } + + if (noinfo) + message("504 5.3.0 HELP topic \"%.10s\" unknown", topic); + else + message("214 2.0.0 End of HELP info"); + + if (foundvers != 0 && foundvers < HELPVERSION) + { + if (LogLevel > 1) + sm_syslog(LOG_WARNING, e->e_id, + "%s too old (require version %d)", + HelpFile, HELPVERSION); + + /* avoid log next time */ + foundvers = 0; + } + + (void) sm_io_close(hf, SM_TIME_DEFAULT); +} + +#if SASL +/* +** RESET_SASLCONN -- reset SASL connection data +** +** Parameters: +** conn -- SASL connection context +** hostname -- host name +** various connection data +** +** Returns: +** SASL result +*/ + +static int +reset_saslconn(sasl_conn_t ** conn, char *hostname, +# if SASL >= 20000 + char *remoteip, char *localip, + char *auth_id, sasl_ssf_t * ext_ssf) +# else /* SASL >= 20000 */ + struct sockaddr_in * saddr_r, struct sockaddr_in * saddr_l, + sasl_external_properties_t * ext_ssf) +# endif /* SASL >= 20000 */ +{ + int result; + + sasl_dispose(conn); +# if SASL >= 20000 + result = sasl_server_new("smtp", hostname, NULL, NULL, NULL, + NULL, 0, conn); +# elif SASL > 10505 + /* use empty realm: only works in SASL > 1.5.5 */ + result = sasl_server_new("smtp", hostname, "", NULL, 0, conn); +# else /* SASL >= 20000 */ + /* use no realm -> realm is set to hostname by SASL lib */ + result = sasl_server_new("smtp", hostname, NULL, NULL, 0, + conn); +# endif /* SASL >= 20000 */ + if (result != SASL_OK) + return result; + +# if SASL >= 20000 +# if NETINET || NETINET6 + if (remoteip != NULL) + result = sasl_setprop(*conn, SASL_IPREMOTEPORT, remoteip); + if (result != SASL_OK) + return result; + + if (localip != NULL) + result = sasl_setprop(*conn, SASL_IPLOCALPORT, localip); + if (result != SASL_OK) + return result; +# endif /* NETINET || NETINET6 */ + + result = sasl_setprop(*conn, SASL_SSF_EXTERNAL, ext_ssf); + if (result != SASL_OK) + return result; + + result = sasl_setprop(*conn, SASL_AUTH_EXTERNAL, auth_id); + if (result != SASL_OK) + return result; +# else /* SASL >= 20000 */ +# if NETINET + if (saddr_r != NULL) + result = sasl_setprop(*conn, SASL_IP_REMOTE, saddr_r); + if (result != SASL_OK) + return result; + + if (saddr_l != NULL) + result = sasl_setprop(*conn, SASL_IP_LOCAL, saddr_l); + if (result != SASL_OK) + return result; +# endif /* NETINET */ + + result = sasl_setprop(*conn, SASL_SSF_EXTERNAL, ext_ssf); + if (result != SASL_OK) + return result; +# endif /* SASL >= 20000 */ + return SASL_OK; +} +#endif /* SASL */ diff --git a/debian/patches/8.13/srvrsmtp.new b/debian/patches/8.13/srvrsmtp.new new file mode 100644 index 0000000..f8ac1be --- /dev/null +++ b/debian/patches/8.13/srvrsmtp.new @@ -0,0 +1,4702 @@ +/* + * Copyright (c) 1998-2004 Sendmail, Inc. and its suppliers. + * All rights reserved. + * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * By using this file, you agree to the terms and conditions set + * forth in the LICENSE file which can be found at the top level of + * the sendmail distribution. + * + */ + +#include <sendmail.h> +#if MILTER +# include <libmilter/mfapi.h> +# include <libmilter/mfdef.h> +#endif /* MILTER */ + +SM_RCSID("@(#)$Id: srvrsmtp.c,v 8.900 2004/07/08 23:29:33 ca Exp $") + +#include <sys/time.h> +#include <sm/fdset.h> + +#if SASL || STARTTLS +# include "sfsasl.h" +#endif /* SASL || STARTTLS */ +#if SASL +# define ENC64LEN(l) (((l) + 2) * 4 / 3 + 1) +static int saslmechs __P((sasl_conn_t *, char **)); +#endif /* SASL */ +#if STARTTLS +# include <sysexits.h> + +static SSL_CTX *srv_ctx = NULL; /* TLS server context */ +static SSL *srv_ssl = NULL; /* per connection context */ + +static bool tls_ok_srv = false; + +extern void tls_set_verify __P((SSL_CTX *, SSL *, bool)); +# define TLS_VERIFY_CLIENT() tls_set_verify(srv_ctx, srv_ssl, \ + bitset(SRV_VRFY_CLT, features)) +#endif /* STARTTLS */ + +/* server features */ +#define SRV_NONE 0x0000 /* none... */ +#define SRV_OFFER_TLS 0x0001 /* offer STARTTLS */ +#define SRV_VRFY_CLT 0x0002 /* request a cert */ +#define SRV_OFFER_AUTH 0x0004 /* offer AUTH */ +#define SRV_OFFER_ETRN 0x0008 /* offer ETRN */ +#define SRV_OFFER_VRFY 0x0010 /* offer VRFY (not yet used) */ +#define SRV_OFFER_EXPN 0x0020 /* offer EXPN */ +#define SRV_OFFER_VERB 0x0040 /* offer VERB */ +#define SRV_OFFER_DSN 0x0080 /* offer DSN */ +#if PIPELINING +# define SRV_OFFER_PIPE 0x0100 /* offer PIPELINING */ +# if _FFR_NO_PIPE +# define SRV_NO_PIPE 0x0200 /* disable PIPELINING, sleep if used */ +# endif /* _FFR_NO_PIPE */ +#endif /* PIPELINING */ +#define SRV_REQ_AUTH 0x0400 /* require AUTH */ +#define SRV_REQ_SEC 0x0800 /* require security - equiv to AuthOptions=p */ +#define SRV_TMP_FAIL 0x1000 /* ruleset caused a temporary failure */ + +static unsigned int srvfeatures __P((ENVELOPE *, char *, unsigned int)); + +#define STOP_ATTACK ((time_t) -1) +static time_t checksmtpattack __P((volatile unsigned int *, unsigned int, + bool, char *, ENVELOPE *)); +static void mail_esmtp_args __P((char *, char *, ENVELOPE *)); +static void printvrfyaddr __P((ADDRESS *, bool, bool)); +static void rcpt_esmtp_args __P((ADDRESS *, char *, char *, ENVELOPE *)); +static char *skipword __P((char *volatile, char *)); +static void setup_smtpd_io __P((void)); + +#if SASL +# if SASL >= 20000 +static int reset_saslconn __P((sasl_conn_t **_conn, char *_hostname, + char *_remoteip, char *_localip, + char *_auth_id, sasl_ssf_t *_ext_ssf)); + +# define RESET_SASLCONN \ + result = reset_saslconn(&conn, AuthRealm, remoteip, localip, auth_id, \ + &ext_ssf); \ + if (result != SASL_OK) \ + { \ + /* This is pretty fatal */ \ + goto doquit; \ + } + +# else /* SASL >= 20000 */ +static int reset_saslconn __P((sasl_conn_t **_conn, char *_hostname, + struct sockaddr_in *_saddr_r, + struct sockaddr_in *_saddr_l, + sasl_external_properties_t *_ext_ssf)); +# define RESET_SASLCONN \ + result = reset_saslconn(&conn, AuthRealm, &saddr_r, &saddr_l, &ext_ssf); \ + if (result != SASL_OK) \ + { \ + /* This is pretty fatal */ \ + goto doquit; \ + } + +# endif /* SASL >= 20000 */ +#endif /* SASL */ + +extern ENVELOPE BlankEnvelope; + +#define NBADRCPTS \ + do \ + { \ + char buf[16]; \ + (void) sm_snprintf(buf, sizeof buf, "%d", \ + BadRcptThrottle > 0 && n_badrcpts > BadRcptThrottle \ + ? n_badrcpts - 1 : n_badrcpts); \ + macdefine(&e->e_macro, A_TEMP, macid("{nbadrcpts}"), buf); \ + } while (0) + +#define SKIP_SPACE(s) while (isascii(*s) && isspace(*s)) \ + (s)++ + +/* +** SMTP -- run the SMTP protocol. +** +** Parameters: +** nullserver -- if non-NULL, rejection message for +** (almost) all SMTP commands. +** d_flags -- daemon flags +** e -- the envelope. +** +** Returns: +** never. +** +** Side Effects: +** Reads commands from the input channel and processes them. +*/ + +/* +** Notice: The smtp server doesn't have a session context like the client +** side has (mci). Therefore some data (session oriented) is allocated +** or assigned to the "wrong" structure (esp. STARTTLS, AUTH). +** This should be fixed in a successor version. +*/ + +struct cmd +{ + char *cmd_name; /* command name */ + int cmd_code; /* internal code, see below */ +}; + +/* values for cmd_code */ +#define CMDERROR 0 /* bad command */ +#define CMDMAIL 1 /* mail -- designate sender */ +#define CMDRCPT 2 /* rcpt -- designate recipient */ +#define CMDDATA 3 /* data -- send message text */ +#define CMDRSET 4 /* rset -- reset state */ +#define CMDVRFY 5 /* vrfy -- verify address */ +#define CMDEXPN 6 /* expn -- expand address */ +#define CMDNOOP 7 /* noop -- do nothing */ +#define CMDQUIT 8 /* quit -- close connection and die */ +#define CMDHELO 9 /* helo -- be polite */ +#define CMDHELP 10 /* help -- give usage info */ +#define CMDEHLO 11 /* ehlo -- extended helo (RFC 1425) */ +#define CMDETRN 12 /* etrn -- flush queue */ +#if SASL +# define CMDAUTH 13 /* auth -- SASL authenticate */ +#endif /* SASL */ +#if STARTTLS +# define CMDSTLS 14 /* STARTTLS -- start TLS session */ +#endif /* STARTTLS */ +/* non-standard commands */ +#define CMDVERB 17 /* verb -- go into verbose mode */ +/* unimplemented commands from RFC 821 */ +#define CMDUNIMPL 19 /* unimplemented rfc821 commands */ +/* use this to catch and log "door handle" attempts on your system */ +#define CMDLOGBOGUS 23 /* bogus command that should be logged */ +/* debugging-only commands, only enabled if SMTPDEBUG is defined */ +#define CMDDBGQSHOW 24 /* showq -- show send queue */ +#define CMDDBGDEBUG 25 /* debug -- set debug mode */ + +/* +** Note: If you change this list, remember to update 'helpfile' +*/ + +static struct cmd CmdTab[] = +{ + { "mail", CMDMAIL }, + { "rcpt", CMDRCPT }, + { "data", CMDDATA }, + { "rset", CMDRSET }, + { "vrfy", CMDVRFY }, + { "expn", CMDEXPN }, + { "help", CMDHELP }, + { "noop", CMDNOOP }, + { "quit", CMDQUIT }, + { "helo", CMDHELO }, + { "ehlo", CMDEHLO }, + { "etrn", CMDETRN }, + { "verb", CMDVERB }, + { "send", CMDUNIMPL }, + { "saml", CMDUNIMPL }, + { "soml", CMDUNIMPL }, + { "turn", CMDUNIMPL }, +#if SASL + { "auth", CMDAUTH, }, +#endif /* SASL */ +#if STARTTLS + { "starttls", CMDSTLS, }, +#endif /* STARTTLS */ + /* remaining commands are here only to trap and log attempts to use them */ + { "showq", CMDDBGQSHOW }, + { "debug", CMDDBGDEBUG }, + { "wiz", CMDLOGBOGUS }, + + { NULL, CMDERROR } +}; + +static char *CurSmtpClient; /* who's at the other end of channel */ + +#ifndef MAXBADCOMMANDS +# define MAXBADCOMMANDS 25 /* maximum number of bad commands */ +#endif /* ! MAXBADCOMMANDS */ +#ifndef MAXNOOPCOMMANDS +# define MAXNOOPCOMMANDS 20 /* max "noise" commands before slowdown */ +#endif /* ! MAXNOOPCOMMANDS */ +#ifndef MAXHELOCOMMANDS +# define MAXHELOCOMMANDS 3 /* max HELO/EHLO commands before slowdown */ +#endif /* ! MAXHELOCOMMANDS */ +#ifndef MAXVRFYCOMMANDS +# define MAXVRFYCOMMANDS 6 /* max VRFY/EXPN commands before slowdown */ +#endif /* ! MAXVRFYCOMMANDS */ +#ifndef MAXETRNCOMMANDS +# define MAXETRNCOMMANDS 8 /* max ETRN commands before slowdown */ +#endif /* ! MAXETRNCOMMANDS */ +#ifndef MAXTIMEOUT +# define MAXTIMEOUT (4 * 60) /* max timeout for bad commands */ +#endif /* ! MAXTIMEOUT */ + +/* +** Maximum shift value to compute timeout for bad commands. +** This introduces an upper limit of 2^MAXSHIFT for the timeout. +*/ + +#ifndef MAXSHIFT +# define MAXSHIFT 8 +#endif /* ! MAXSHIFT */ +#if MAXSHIFT > 31 + ERROR _MAXSHIFT > 31 is invalid +#endif /* MAXSHIFT */ + + +#if MAXBADCOMMANDS > 0 +# define STOP_IF_ATTACK(r) do \ + { \ + if ((r) == STOP_ATTACK) \ + goto stopattack; \ + } while (0) + +#else /* MAXBADCOMMANDS > 0 */ +# define STOP_IF_ATTACK(r) r +#endif /* MAXBADCOMMANDS > 0 */ + + +#if SM_HEAP_CHECK +static SM_DEBUG_T DebugLeakSmtp = SM_DEBUG_INITIALIZER("leak_smtp", + "@(#)$Debug: leak_smtp - trace memory leaks during SMTP processing $"); +#endif /* SM_HEAP_CHECK */ + +typedef struct +{ + bool sm_gotmail; /* mail command received */ + unsigned int sm_nrcpts; /* number of successful RCPT commands */ + bool sm_discard; +#if MILTER + bool sm_milterize; + bool sm_milterlist; /* any filters in the list? */ +#endif /* MILTER */ + char *sm_quarmsg; /* carry quarantining across messages */ +} SMTP_T; + +static bool smtp_data __P((SMTP_T *, ENVELOPE *)); + +#define MSG_TEMPFAIL "451 4.3.2 Please try again later" + +#if MILTER +# define MILTER_ABORT(e) milter_abort((e)) + +# define MILTER_REPLY(str) \ + { \ + int savelogusrerrs = LogUsrErrs; \ + \ + switch (state) \ + { \ + case SMFIR_REPLYCODE: \ + if (MilterLogLevel > 3) \ + { \ + sm_syslog(LOG_INFO, e->e_id, \ + "Milter: %s=%s, reject=%s", \ + str, addr, response); \ + LogUsrErrs = false; \ + } \ + if (strncmp(response, "421 ", 4) == 0) \ + { \ + bool tsave = QuickAbort; \ + \ + QuickAbort = false; \ + usrerr(response); \ + QuickAbort = tsave; \ + e->e_sendqueue = NULL; \ + goto doquit; \ + } \ + else \ + usrerr(response); \ + break; \ + \ + case SMFIR_REJECT: \ + if (MilterLogLevel > 3) \ + { \ + sm_syslog(LOG_INFO, e->e_id, \ + "Milter: %s=%s, reject=550 5.7.1 Command rejected", \ + str, addr); \ + LogUsrErrs = false; \ + } \ + usrerr("550 5.7.1 Command rejected"); \ + break; \ + \ + case SMFIR_DISCARD: \ + if (MilterLogLevel > 3) \ + sm_syslog(LOG_INFO, e->e_id, \ + "Milter: %s=%s, discard", \ + str, addr); \ + e->e_flags |= EF_DISCARD; \ + break; \ + \ + case SMFIR_TEMPFAIL: \ + if (MilterLogLevel > 3) \ + { \ + sm_syslog(LOG_INFO, e->e_id, \ + "Milter: %s=%s, reject=%s", \ + str, addr, MSG_TEMPFAIL); \ + LogUsrErrs = false; \ + } \ + usrerr(MSG_TEMPFAIL); \ + break; \ + } \ + LogUsrErrs = savelogusrerrs; \ + if (response != NULL) \ + sm_free(response); /* XXX */ \ + } + +#else /* MILTER */ +# define MILTER_ABORT(e) +#endif /* MILTER */ + +/* clear all SMTP state (for HELO/EHLO/RSET) */ +#define CLEAR_STATE(cmd) \ +do \ +{ \ + /* abort milter filters */ \ + MILTER_ABORT(e); \ + \ + if (smtp.sm_nrcpts > 0) \ + { \ + logundelrcpts(e, cmd, 10, false); \ + smtp.sm_nrcpts = 0; \ + macdefine(&e->e_macro, A_PERM, \ + macid("{nrcpts}"), "0"); \ + } \ + \ + e->e_sendqueue = NULL; \ + e->e_flags |= EF_CLRQUEUE; \ + \ + if (LogLevel > 4 && bitset(EF_LOGSENDER, e->e_flags)) \ + logsender(e, NULL); \ + e->e_flags &= ~EF_LOGSENDER; \ + \ + /* clean up a bit */ \ + smtp.sm_gotmail = false; \ + SuprErrs = true; \ + dropenvelope(e, true, false); \ + sm_rpool_free(e->e_rpool); \ + e = newenvelope(e, CurEnv, sm_rpool_new_x(NULL)); \ + CurEnv = e; \ + \ + /* put back discard bit */ \ + if (smtp.sm_discard) \ + e->e_flags |= EF_DISCARD; \ + \ + /* restore connection quarantining */ \ + if (smtp.sm_quarmsg == NULL) \ + { \ + e->e_quarmsg = NULL; \ + macdefine(&e->e_macro, A_PERM, \ + macid("{quarantine}"), ""); \ + } \ + else \ + { \ + e->e_quarmsg = sm_rpool_strdup_x(e->e_rpool, \ + smtp.sm_quarmsg); \ + macdefine(&e->e_macro, A_PERM, macid("{quarantine}"), \ + e->e_quarmsg); \ + } \ +} while (0) + +/* sleep to flatten out connection load */ +#define MIN_DELAY_LOG 15 /* wait before logging this again */ + +/* is it worth setting the process title for 1s? */ +#define DELAY_CONN(cmd) \ + if (DelayLA > 0 && (CurrentLA = getla()) >= DelayLA) \ + { \ + time_t dnow; \ + \ + sm_setproctitle(true, e, \ + "%s: %s: delaying %s: load average: %d", \ + qid_printname(e), CurSmtpClient, \ + cmd, DelayLA); \ + if (LogLevel > 8 && (dnow = curtime()) > log_delay) \ + { \ + sm_syslog(LOG_INFO, e->e_id, \ + "delaying=%s, load average=%d >= %d", \ + cmd, CurrentLA, DelayLA); \ + log_delay = dnow + MIN_DELAY_LOG; \ + } \ + (void) sleep(1); \ + sm_setproctitle(true, e, "%s %s: %.80s", \ + qid_printname(e), CurSmtpClient, inp); \ + } + + +void +smtp(nullserver, d_flags, e) + char *volatile nullserver; + BITMAP256 d_flags; + register ENVELOPE *volatile e; +{ + register char *volatile p; + register struct cmd *volatile c = NULL; + char *cmd; + auto ADDRESS *vrfyqueue; + ADDRESS *a; + volatile bool gothello; /* helo command received */ + bool vrfy; /* set if this is a vrfy command */ + char *volatile protocol; /* sending protocol */ + char *volatile sendinghost; /* sending hostname */ + char *volatile peerhostname; /* name of SMTP peer or "localhost" */ + char *volatile hello_name; /* client_hello string */ + bool hello_accept = false; /* helo/ehlo command accepted */ + auto char *delimptr; + char *id; + volatile unsigned int n_badcmds = 0; /* count of bad commands */ + volatile unsigned int n_badrcpts = 0; /* number of rejected RCPT */ + volatile unsigned int n_verifies = 0; /* count of VRFY/EXPN */ + volatile unsigned int n_etrn = 0; /* count of ETRN */ + volatile unsigned int n_noop = 0; /* count of NOOP/VERB/etc */ + volatile unsigned int n_helo = 0; /* count of HELO/EHLO */ + volatile int save_sevenbitinput; + bool ok; +#if _FFR_BLOCK_PROXIES + volatile bool first; +#endif /* _FFR_BLOCK_PROXIES */ + volatile bool tempfail = false; + volatile time_t wt; /* timeout after too many commands */ + volatile time_t previous; /* time after checksmtpattack() */ + volatile bool lognullconnection = true; + register char *q; + SMTP_T smtp; + char *addr; + char *greetcode = "220"; + char *hostname; /* my hostname ($j) */ + QUEUE_CHAR *new; + int argno; + char *args[MAXSMTPARGS]; + char inp[MAXLINE]; + char cmdbuf[MAXLINE]; +#if SASL + sasl_conn_t *conn; + volatile bool sasl_ok; + volatile unsigned int n_auth = 0; /* count of AUTH commands */ + bool ismore; + int result; + volatile int authenticating; + char *user; + char *in, *out2; +# if SASL >= 20000 + char *auth_id; + const char *out; + sasl_ssf_t ext_ssf; + char localip[60], remoteip[60]; +# else /* SASL >= 20000 */ + char *out; + const char *errstr; + sasl_external_properties_t ext_ssf; + struct sockaddr_in saddr_l; + struct sockaddr_in saddr_r; +# endif /* SASL >= 20000 */ + sasl_security_properties_t ssp; + sasl_ssf_t *ssf; + unsigned int inlen, out2len; + unsigned int outlen; + char *volatile auth_type; + char *mechlist; + volatile unsigned int n_mechs; + unsigned int len; +#endif /* SASL */ + int r; +#if STARTTLS + int fdfl; + int rfd, wfd; + volatile bool tls_active = false; + volatile bool smtps = bitnset(D_SMTPS, d_flags); + bool saveQuickAbort; + bool saveSuprErrs; + time_t tlsstart; +#endif /* STARTTLS */ + volatile unsigned int features; +#if PIPELINING +# if _FFR_NO_PIPE + int np_log = 0; +# endif /* _FFR_NO_PIPE */ +#endif /* PIPELINING */ + volatile time_t log_delay = (time_t) 0; + + save_sevenbitinput = SevenBitInput; + smtp.sm_nrcpts = 0; +#if MILTER + smtp.sm_milterize = (nullserver == NULL); + smtp.sm_milterlist = false; +#endif /* MILTER */ + + /* setup I/O fd correctly for the SMTP server */ + setup_smtpd_io(); + +#if SM_HEAP_CHECK + if (sm_debug_active(&DebugLeakSmtp, 1)) + { + sm_heap_newgroup(); + sm_dprintf("smtp() heap group #%d\n", sm_heap_group()); + } +#endif /* SM_HEAP_CHECK */ + + /* XXX the rpool should be set when e is initialized in main() */ + e->e_rpool = sm_rpool_new_x(NULL); + e->e_macro.mac_rpool = e->e_rpool; + + settime(e); + sm_getla(); + peerhostname = RealHostName; + if (peerhostname == NULL) + peerhostname = "localhost"; + CurHostName = peerhostname; + CurSmtpClient = macvalue('_', e); + if (CurSmtpClient == NULL) + CurSmtpClient = CurHostName; + + /* check_relay may have set discard bit, save for later */ + smtp.sm_discard = bitset(EF_DISCARD, e->e_flags); + +#if PIPELINING + /* auto-flush output when reading input */ + (void) sm_io_autoflush(InChannel, OutChannel); +#endif /* PIPELINING */ + + sm_setproctitle(true, e, "server %s startup", CurSmtpClient); + + /* Set default features for server. */ + features = ((bitset(PRIV_NOETRN, PrivacyFlags) || + bitnset(D_NOETRN, d_flags)) ? SRV_NONE : SRV_OFFER_ETRN) + | (bitnset(D_AUTHREQ, d_flags) ? SRV_REQ_AUTH : SRV_NONE) + | (bitset(PRIV_NOEXPN, PrivacyFlags) ? SRV_NONE + : (SRV_OFFER_EXPN + | (bitset(PRIV_NOVERB, PrivacyFlags) + ? SRV_NONE : SRV_OFFER_VERB))) + | (bitset(PRIV_NORECEIPTS, PrivacyFlags) ? SRV_NONE + : SRV_OFFER_DSN) +#if SASL + | (bitnset(D_NOAUTH, d_flags) ? SRV_NONE : SRV_OFFER_AUTH) + | (bitset(SASL_SEC_NOPLAINTEXT, SASLOpts) ? SRV_REQ_SEC + : SRV_NONE) +#endif /* SASL */ +#if PIPELINING + | SRV_OFFER_PIPE +#endif /* PIPELINING */ +#if STARTTLS + | (bitnset(D_NOTLS, d_flags) ? SRV_NONE : SRV_OFFER_TLS) + | (bitset(TLS_I_NO_VRFY, TLS_Srv_Opts) ? SRV_NONE + : SRV_VRFY_CLT) +#endif /* STARTTLS */ + ; + if (nullserver == NULL) + { + features = srvfeatures(e, CurSmtpClient, features); + if (bitset(SRV_TMP_FAIL, features)) + { + if (LogLevel > 4) + sm_syslog(LOG_ERR, NOQID, + "ERROR: srv_features=tempfail, relay=%.100s, access temporarily disabled", + CurSmtpClient); + nullserver = "450 4.3.0 Please try again later."; + } + else + { +#if PIPELINING +# if _FFR_NO_PIPE + if (bitset(SRV_NO_PIPE, features)) + { + /* for consistency */ + features &= ~SRV_OFFER_PIPE; + } +# endif /* _FFR_NO_PIPE */ +#endif /* PIPELINING */ +#if SASL + if (bitset(SRV_REQ_SEC, features)) + SASLOpts |= SASL_SEC_NOPLAINTEXT; + else + SASLOpts &= ~SASL_SEC_NOPLAINTEXT; +#endif /* SASL */ + } + } + else if (strncmp(nullserver, "421 ", 4) == 0) + { + message(nullserver); + goto doquit; + } + + hostname = macvalue('j', e); +#if SASL + if (AuthRealm == NULL) + AuthRealm = hostname; + sasl_ok = bitset(SRV_OFFER_AUTH, features); + n_mechs = 0; + authenticating = SASL_NOT_AUTH; + + /* SASL server new connection */ + if (sasl_ok) + { +# if SASL >= 20000 + result = sasl_server_new("smtp", AuthRealm, NULL, NULL, NULL, + NULL, 0, &conn); +# elif SASL > 10505 + /* use empty realm: only works in SASL > 1.5.5 */ + result = sasl_server_new("smtp", AuthRealm, "", NULL, 0, &conn); +# else /* SASL >= 20000 */ + /* use no realm -> realm is set to hostname by SASL lib */ + result = sasl_server_new("smtp", AuthRealm, NULL, NULL, 0, + &conn); +# endif /* SASL >= 20000 */ + sasl_ok = result == SASL_OK; + if (!sasl_ok) + { + if (LogLevel > 9) + sm_syslog(LOG_WARNING, NOQID, + "AUTH error: sasl_server_new failed=%d", + result); + } + } + if (sasl_ok) + { + /* + ** SASL set properties for sasl + ** set local/remote IP + ** XXX Cyrus SASL v1 only supports IPv4 + ** + ** XXX where exactly are these used/required? + ** Kerberos_v4 + */ + +# if SASL >= 20000 +# if NETINET || NETINET6 + in = macvalue(macid("{daemon_family}"), e); + if (in != NULL && ( +# if NETINET6 + strcmp(in, "inet6") == 0 || +# endif /* NETINET6 */ + strcmp(in, "inet") == 0)) + { + SOCKADDR_LEN_T addrsize; + SOCKADDR saddr_l; + SOCKADDR saddr_r; + + addrsize = sizeof(saddr_r); + if (getpeername(sm_io_getinfo(InChannel, SM_IO_WHAT_FD, + NULL), + (struct sockaddr *) &saddr_r, + &addrsize) == 0) + { + if (iptostring(&saddr_r, addrsize, + remoteip, sizeof remoteip)) + { + sasl_setprop(conn, SASL_IPREMOTEPORT, + remoteip); + } + addrsize = sizeof(saddr_l); + if (getsockname(sm_io_getinfo(InChannel, + SM_IO_WHAT_FD, + NULL), + (struct sockaddr *) &saddr_l, + &addrsize) == 0) + { + if (iptostring(&saddr_l, addrsize, + localip, + sizeof localip)) + { + sasl_setprop(conn, + SASL_IPLOCALPORT, + localip); + } + } + } + } +# endif /* NETINET || NETINET6 */ +# else /* SASL >= 20000 */ +# if NETINET + in = macvalue(macid("{daemon_family}"), e); + if (in != NULL && strcmp(in, "inet") == 0) + { + SOCKADDR_LEN_T addrsize; + + addrsize = sizeof(struct sockaddr_in); + if (getpeername(sm_io_getinfo(InChannel, SM_IO_WHAT_FD, + NULL), + (struct sockaddr *)&saddr_r, + &addrsize) == 0) + { + sasl_setprop(conn, SASL_IP_REMOTE, &saddr_r); + addrsize = sizeof(struct sockaddr_in); + if (getsockname(sm_io_getinfo(InChannel, + SM_IO_WHAT_FD, + NULL), + (struct sockaddr *)&saddr_l, + &addrsize) == 0) + sasl_setprop(conn, SASL_IP_LOCAL, + &saddr_l); + } + } +# endif /* NETINET */ +# endif /* SASL >= 20000 */ + + auth_type = NULL; + mechlist = NULL; + user = NULL; +# if 0 + macdefine(&BlankEnvelope.e_macro, A_PERM, + macid("{auth_author}"), NULL); +# endif /* 0 */ + + /* set properties */ + (void) memset(&ssp, '\0', sizeof ssp); + + /* XXX should these be options settable via .cf ? */ + /* ssp.min_ssf = 0; is default due to memset() */ +# if STARTTLS +# endif /* STARTTLS */ + { + ssp.max_ssf = MaxSLBits; + ssp.maxbufsize = MAXOUTLEN; + } + ssp.security_flags = SASLOpts & SASL_SEC_MASK; + sasl_ok = sasl_setprop(conn, SASL_SEC_PROPS, &ssp) == SASL_OK; + + if (sasl_ok) + { + /* + ** external security strength factor; + ** currently we have none so zero + */ + +# if SASL >= 20000 + ext_ssf = 0; + auth_id = NULL; + sasl_ok = ((sasl_setprop(conn, SASL_SSF_EXTERNAL, + &ext_ssf) == SASL_OK) && + (sasl_setprop(conn, SASL_AUTH_EXTERNAL, + auth_id) == SASL_OK)); +# else /* SASL >= 20000 */ + ext_ssf.ssf = 0; + ext_ssf.auth_id = NULL; + sasl_ok = sasl_setprop(conn, SASL_SSF_EXTERNAL, + &ext_ssf) == SASL_OK; +# endif /* SASL >= 20000 */ + } + if (sasl_ok) + n_mechs = saslmechs(conn, &mechlist); + } +#endif /* SASL */ + +#if STARTTLS +#endif /* STARTTLS */ + +#if MILTER + if (smtp.sm_milterize) + { + char state; + + /* initialize mail filter connection */ + smtp.sm_milterlist = milter_init(e, &state); + switch (state) + { + case SMFIR_REJECT: + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: initialization failed, rejecting commands"); + greetcode = "554"; + nullserver = "Command rejected"; + smtp.sm_milterize = false; + break; + + case SMFIR_TEMPFAIL: + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: initialization failed, temp failing commands"); + tempfail = true; + smtp.sm_milterize = false; + break; + } + } + + if (smtp.sm_milterlist && smtp.sm_milterize && + !bitset(EF_DISCARD, e->e_flags)) + { + char state; + char *response; + + response = milter_connect(peerhostname, RealHostAddr, + e, &state); + switch (state) + { + case SMFIR_REPLYCODE: /* REPLYCODE shouldn't happen */ + case SMFIR_REJECT: + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: connect: host=%s, addr=%s, rejecting commands", + peerhostname, + anynet_ntoa(&RealHostAddr)); + greetcode = "554"; + nullserver = "Command rejected"; + smtp.sm_milterize = false; + break; + + case SMFIR_TEMPFAIL: + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: connect: host=%s, addr=%s, temp failing commands", + peerhostname, + anynet_ntoa(&RealHostAddr)); + tempfail = true; + smtp.sm_milterize = false; + break; + + case SMFIR_SHUTDOWN: + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: connect: host=%s, addr=%s, shutdown", + peerhostname, + anynet_ntoa(&RealHostAddr)); + tempfail = true; + smtp.sm_milterize = false; + message("421 4.7.0 %s closing connection", + MyHostName); + + /* arrange to ignore send list */ + e->e_sendqueue = NULL; + goto doquit; + } + if (response != NULL) + sm_free(response); /* XXX */ + } +#endif /* MILTER */ + + /* + ** Broken proxies and SMTP slammers + ** push data without waiting, catch them + */ + + if ( +#if STARTTLS + !smtps && +#endif /* STARTTLS */ + *greetcode == '2') + { + time_t msecs = 0; + char **pvp; + char pvpbuf[PSBUFSIZE]; + + /* Ask the rulesets how long to pause */ + pvp = NULL; + r = rscap("greet_pause", peerhostname, + anynet_ntoa(&RealHostAddr), e, + &pvp, pvpbuf, sizeof(pvpbuf)); + if (r == EX_OK && pvp != NULL && pvp[0] != NULL && + (pvp[0][0] & 0377) == CANONNET && pvp[1] != NULL) + { + msecs = strtol(pvp[1], NULL, 10); + } + + if (msecs > 0) + { + int fd; + fd_set readfds; + struct timeval timeout; + + /* pause for a moment */ + timeout.tv_sec = msecs / 1000; + timeout.tv_usec = (msecs % 1000) * 1000; + + /* Obey RFC 2821: 4.3.5.2: 220 timeout of 5 minutes */ + if (timeout.tv_sec >= 300) + { + timeout.tv_sec = 300; + timeout.tv_usec = 0; + } + + /* check if data is on the socket during the pause */ + fd = sm_io_getinfo(InChannel, SM_IO_WHAT_FD, NULL); + FD_ZERO(&readfds); + SM_FD_SET(fd, &readfds); + if (select(fd + 1, FDSET_CAST &readfds, + NULL, NULL, &timeout) > 0 && + FD_ISSET(fd, &readfds)) + { + greetcode = "554"; + nullserver = "Command rejected"; + sm_syslog(LOG_INFO, e->e_id, + "rejecting commands from %s [%s] due to pre-greeting traffic", + peerhostname, + anynet_ntoa(&RealHostAddr)); + } + } + } + +#if STARTTLS + /* If this an smtps connection, start TLS now */ + if (smtps) + { + Errors = 0; + goto starttls; + } + + greeting: + +#endif /* STARTTLS */ + + /* output the first line, inserting "ESMTP" as second word */ + if (*greetcode == '5') + (void) sm_snprintf(inp, sizeof inp, "%s not accepting messages", + hostname); + else + expand(SmtpGreeting, inp, sizeof inp, e); + + p = strchr(inp, '\n'); + if (p != NULL) + *p++ = '\0'; + id = strchr(inp, ' '); + if (id == NULL) + id = &inp[strlen(inp)]; + if (p == NULL) + (void) sm_snprintf(cmdbuf, sizeof cmdbuf, + "%s %%.*s ESMTP%%s", greetcode); + else + (void) sm_snprintf(cmdbuf, sizeof cmdbuf, + "%s-%%.*s ESMTP%%s", greetcode); + message(cmdbuf, (int) (id - inp), inp, id); + + /* output remaining lines */ + while ((id = p) != NULL && (p = strchr(id, '\n')) != NULL) + { + *p++ = '\0'; + if (isascii(*id) && isspace(*id)) + id++; + (void) sm_strlcpyn(cmdbuf, sizeof cmdbuf, 2, greetcode, "-%s"); + message(cmdbuf, id); + } + if (id != NULL) + { + if (isascii(*id) && isspace(*id)) + id++; + (void) sm_strlcpyn(cmdbuf, sizeof cmdbuf, 2, greetcode, " %s"); + message(cmdbuf, id); + } + + protocol = NULL; + sendinghost = macvalue('s', e); + + /* If quarantining by a connect/ehlo action, save between messages */ + if (e->e_quarmsg == NULL) + smtp.sm_quarmsg = NULL; + else + smtp.sm_quarmsg = newstr(e->e_quarmsg); + + /* sendinghost's storage must outlive the current envelope */ + if (sendinghost != NULL) + sendinghost = sm_strdup_x(sendinghost); +#if _FFR_BLOCK_PROXIES + first = true; +#endif /* _FFR_BLOCK_PROXIES */ + gothello = false; + smtp.sm_gotmail = false; + for (;;) + { + SM_TRY + { + QuickAbort = false; + HoldErrs = false; + SuprErrs = false; + LogUsrErrs = false; + OnlyOneError = true; + e->e_flags &= ~(EF_VRFYONLY|EF_GLOBALERRS); + + /* setup for the read */ + e->e_to = NULL; + Errors = 0; + FileName = NULL; + (void) sm_io_flush(smioout, SM_TIME_DEFAULT); + + /* read the input line */ + SmtpPhase = "server cmd read"; + sm_setproctitle(true, e, "server %s cmd read", CurSmtpClient); +#if SASL + /* + ** XXX SMTP AUTH requires accepting any length, + ** at least for challenge/response + */ +#endif /* SASL */ + + /* handle errors */ + if (sm_io_error(OutChannel) || + (p = sfgets(inp, sizeof inp, InChannel, + TimeOuts.to_nextcommand, SmtpPhase)) == NULL) + { + char *d; + + d = macvalue(macid("{daemon_name}"), e); + if (d == NULL) + d = "stdin"; + /* end of file, just die */ + disconnect(1, e); + +#if MILTER + /* close out milter filters */ + milter_quit(e); +#endif /* MILTER */ + + message("421 4.4.1 %s Lost input channel from %s", + MyHostName, CurSmtpClient); + if (LogLevel > (smtp.sm_gotmail ? 1 : 19)) + sm_syslog(LOG_NOTICE, e->e_id, + "lost input channel from %s to %s after %s", + CurSmtpClient, d, + (c == NULL || c->cmd_name == NULL) ? "startup" : c->cmd_name); + /* + ** If have not accepted mail (DATA), do not bounce + ** bad addresses back to sender. + */ + + if (bitset(EF_CLRQUEUE, e->e_flags)) + e->e_sendqueue = NULL; + goto doquit; + } + +#if _FFR_BLOCK_PROXIES + if (first) + { + size_t inplen, cmdlen; + int idx; + char *http_cmd; + static char *http_cmds[] = { "GET", "POST", + "CONNECT", "USER", NULL }; + + inplen = strlen(inp); + for (idx = 0; (http_cmd = http_cmds[idx]) != NULL; + idx++) + { + cmdlen = strlen(http_cmd); + if (cmdlen < inplen && + sm_strncasecmp(inp, http_cmd, cmdlen) == 0 && + isascii(inp[cmdlen]) && isspace(inp[cmdlen])) + { + /* Open proxy, drop it */ + message("421 4.7.0 %s Rejecting open proxy %s", + MyHostName, CurSmtpClient); + sm_syslog(LOG_INFO, e->e_id, + "%s: probable open proxy: command=%.40s", + CurSmtpClient, inp); + goto doquit; + } + } + first = false; + } +#endif /* _FFR_BLOCK_PROXIES */ + + /* clean up end of line */ + fixcrlf(inp, true); + +#if PIPELINING +# if _FFR_NO_PIPE + /* + ** if there is more input and pipelining is disabled: + ** delay ... (and maybe discard the input?) + ** XXX this doesn't really work, at least in tests using + ** telnet SM_IO_IS_READABLE only returns 1 if there were + ** more than 2 input lines available. + */ + + if (bitset(SRV_NO_PIPE, features) && + sm_io_getinfo(InChannel, SM_IO_IS_READABLE, NULL) > 0) + { + if (++np_log < 3) + sm_syslog(LOG_INFO, NOQID, + "unauthorized PIPELINING, sleeping"); + sleep(1); + } + +# endif /* _FFR_NO_PIPE */ +#endif /* PIPELINING */ + +#if SASL + if (authenticating == SASL_PROC_AUTH) + { +# if 0 + if (*inp == '\0') + { + authenticating = SASL_NOT_AUTH; + message("501 5.5.2 missing input"); + RESET_SASLCONN; + continue; + } +# endif /* 0 */ + if (*inp == '*' && *(inp + 1) == '\0') + { + authenticating = SASL_NOT_AUTH; + + /* rfc 2254 4. */ + message("501 5.0.0 AUTH aborted"); + RESET_SASLCONN; + continue; + } + + /* could this be shorter? XXX */ +# if SASL >= 20000 + in = xalloc(strlen(inp) + 1); + result = sasl_decode64(inp, strlen(inp), in, + strlen(inp), &inlen); +# else /* SASL >= 20000 */ + out = xalloc(strlen(inp)); + result = sasl_decode64(inp, strlen(inp), out, &outlen); +# endif /* SASL >= 20000 */ + if (result != SASL_OK) + { + authenticating = SASL_NOT_AUTH; + + /* rfc 2254 4. */ + message("501 5.5.4 cannot decode AUTH parameter %s", + inp); +# if SASL >= 20000 + sm_free(in); +# endif /* SASL >= 20000 */ + RESET_SASLCONN; + continue; + } + +# if SASL >= 20000 + result = sasl_server_step(conn, in, inlen, + &out, &outlen); + sm_free(in); +# else /* SASL >= 20000 */ + result = sasl_server_step(conn, out, outlen, + &out, &outlen, &errstr); +# endif /* SASL >= 20000 */ + + /* get an OK if we're done */ + if (result == SASL_OK) + { + authenticated: + message("235 2.0.0 OK Authenticated"); + authenticating = SASL_IS_AUTH; + macdefine(&BlankEnvelope.e_macro, A_TEMP, + macid("{auth_type}"), auth_type); + +# if SASL >= 20000 + user = macvalue(macid("{auth_authen}"), e); + + /* get security strength (features) */ + result = sasl_getprop(conn, SASL_SSF, + (const void **) &ssf); +# else /* SASL >= 20000 */ + result = sasl_getprop(conn, SASL_USERNAME, + (void **)&user); + if (result != SASL_OK) + { + user = ""; + macdefine(&BlankEnvelope.e_macro, + A_PERM, + macid("{auth_authen}"), NULL); + } + else + { + macdefine(&BlankEnvelope.e_macro, + A_TEMP, + macid("{auth_authen}"), + xtextify(user, "<>\")")); + } + +# if 0 + /* get realm? */ + sasl_getprop(conn, SASL_REALM, (void **) &data); +# endif /* 0 */ + + /* get security strength (features) */ + result = sasl_getprop(conn, SASL_SSF, + (void **) &ssf); +# endif /* SASL >= 20000 */ + if (result != SASL_OK) + { + macdefine(&BlankEnvelope.e_macro, + A_PERM, + macid("{auth_ssf}"), "0"); + ssf = NULL; + } + else + { + char pbuf[8]; + + (void) sm_snprintf(pbuf, sizeof pbuf, + "%u", *ssf); + macdefine(&BlankEnvelope.e_macro, + A_TEMP, + macid("{auth_ssf}"), pbuf); + if (tTd(95, 8)) + sm_dprintf("AUTH auth_ssf: %u\n", + *ssf); + } + + /* + ** Only switch to encrypted connection + ** if a security layer has been negotiated + */ + + if (ssf != NULL && *ssf > 0) + { + /* + ** Convert I/O layer to use SASL. + ** If the call fails, the connection + ** is aborted. + */ + + if (sfdcsasl(&InChannel, &OutChannel, + conn) == 0) + { + /* restart dialogue */ + n_helo = 0; +# if PIPELINING + (void) sm_io_autoflush(InChannel, + OutChannel); +# endif /* PIPELINING */ + } + else + syserr("503 5.3.3 SASL TLS failed"); + } + + /* NULL pointer ok since it's our function */ + if (LogLevel > 8) + sm_syslog(LOG_INFO, NOQID, + "AUTH=server, relay=%s, authid=%.128s, mech=%.16s, bits=%d", + CurSmtpClient, + shortenstring(user, 128), + auth_type, *ssf); + } + else if (result == SASL_CONTINUE) + { + len = ENC64LEN(outlen); + out2 = xalloc(len); + result = sasl_encode64(out, outlen, out2, len, + &out2len); + if (result != SASL_OK) + { + /* correct code? XXX */ + /* 454 Temp. authentication failure */ + message("454 4.5.4 Internal error: unable to encode64"); + if (LogLevel > 5) + sm_syslog(LOG_WARNING, e->e_id, + "AUTH encode64 error [%d for \"%s\"]", + result, out); + /* start over? */ + authenticating = SASL_NOT_AUTH; + } + else + { + message("334 %s", out2); + if (tTd(95, 2)) + sm_dprintf("AUTH continue: msg='%s' len=%u\n", + out2, out2len); + } +# if SASL >= 20000 + sm_free(out2); +# endif /* SASL >= 20000 */ + } + else + { + /* not SASL_OK or SASL_CONT */ + message("535 5.7.0 authentication failed"); + if (LogLevel > 9) + sm_syslog(LOG_WARNING, e->e_id, + "AUTH failure (%s): %s (%d) %s", + auth_type, + sasl_errstring(result, NULL, + NULL), + result, +# if SASL >= 20000 + sasl_errdetail(conn)); +# else /* SASL >= 20000 */ + errstr == NULL ? "" : errstr); +# endif /* SASL >= 20000 */ + RESET_SASLCONN; + authenticating = SASL_NOT_AUTH; + } + } + else + { + /* don't want to do any of this if authenticating */ +#endif /* SASL */ + + /* echo command to transcript */ + if (e->e_xfp != NULL) + (void) sm_io_fprintf(e->e_xfp, SM_TIME_DEFAULT, + "<<< %s\n", inp); + + if (LogLevel > 14) + sm_syslog(LOG_INFO, e->e_id, "<-- %s", inp); + + /* break off command */ + for (p = inp; isascii(*p) && isspace(*p); p++) + continue; + cmd = cmdbuf; + while (*p != '\0' && + !(isascii(*p) && isspace(*p)) && + cmd < &cmdbuf[sizeof cmdbuf - 2]) + *cmd++ = *p++; + *cmd = '\0'; + + /* throw away leading whitespace */ + SKIP_SPACE(p); + + /* decode command */ + for (c = CmdTab; c->cmd_name != NULL; c++) + { + if (sm_strcasecmp(c->cmd_name, cmdbuf) == 0) + break; + } + + /* reset errors */ + errno = 0; + + /* check whether a "non-null" command has been used */ + switch (c->cmd_code) + { +#if SASL + case CMDAUTH: + /* avoid information leak; take first two words? */ + q = "AUTH"; + break; +#endif /* SASL */ + + case CMDMAIL: + case CMDEXPN: + case CMDVRFY: + case CMDETRN: + lognullconnection = false; + /* FALLTHROUGH */ + default: + q = inp; + break; + } + + if (e->e_id == NULL) + sm_setproctitle(true, e, "%s: %.80s", + CurSmtpClient, q); + else + sm_setproctitle(true, e, "%s %s: %.80s", + qid_printname(e), + CurSmtpClient, q); + + /* + ** Process command. + ** + ** If we are running as a null server, return 550 + ** to almost everything. + */ + + if (nullserver != NULL || bitnset(D_ETRNONLY, d_flags)) + { + switch (c->cmd_code) + { + case CMDQUIT: + case CMDHELO: + case CMDEHLO: + case CMDNOOP: + case CMDRSET: + case CMDERROR: + /* process normally */ + break; + + case CMDETRN: + if (bitnset(D_ETRNONLY, d_flags) && + nullserver == NULL) + break; + DELAY_CONN("ETRN"); + /* FALLTHROUGH */ + + default: +#if MAXBADCOMMANDS > 0 + /* theoretically this could overflow */ + if (nullserver != NULL && + ++n_badcmds > MAXBADCOMMANDS) + { + message("421 4.7.0 %s Too many bad commands; closing connection", + MyHostName); + + /* arrange to ignore send list */ + e->e_sendqueue = NULL; + goto doquit; + } +#endif /* MAXBADCOMMANDS > 0 */ + if (nullserver != NULL) + { + if (ISSMTPREPLY(nullserver)) + usrerr(nullserver); + else + usrerr("550 5.0.0 %s", + nullserver); + } + else + usrerr("452 4.4.5 Insufficient disk space; try again later"); + continue; + } + } + + switch (c->cmd_code) + { +#if SASL + case CMDAUTH: /* sasl */ + DELAY_CONN("AUTH"); + if (!sasl_ok || n_mechs <= 0) + { + message("503 5.3.3 AUTH not available"); + break; + } + if (authenticating == SASL_IS_AUTH) + { + message("503 5.5.0 Already Authenticated"); + break; + } + if (smtp.sm_gotmail) + { + message("503 5.5.0 AUTH not permitted during a mail transaction"); + break; + } + if (tempfail) + { + if (LogLevel > 9) + sm_syslog(LOG_INFO, e->e_id, + "SMTP AUTH command (%.100s) from %s tempfailed (due to previous checks)", + p, CurSmtpClient); + usrerr("454 4.3.0 Please try again later"); + break; + } + + ismore = false; + + /* crude way to avoid crack attempts */ + STOP_IF_ATTACK(checksmtpattack(&n_auth, n_mechs + 1, + true, "AUTH", e)); + + /* make sure mechanism (p) is a valid string */ + for (q = p; *q != '\0' && isascii(*q); q++) + { + if (isspace(*q)) + { + *q = '\0'; + while (*++q != '\0' && + isascii(*q) && isspace(*q)) + continue; + *(q - 1) = '\0'; + ismore = (*q != '\0'); + break; + } + } + + if (*p == '\0') + { + message("501 5.5.2 AUTH mechanism must be specified"); + break; + } + + /* check whether mechanism is available */ + if (iteminlist(p, mechlist, " ") == NULL) + { + message("504 5.3.3 AUTH mechanism %.32s not available", + p); + break; + } + + if (ismore) + { + /* could this be shorter? XXX */ +# if SASL >= 20000 + in = xalloc(strlen(q) + 1); + result = sasl_decode64(q, strlen(q), in, + strlen(q), &inlen); +# else /* SASL >= 20000 */ + in = sm_rpool_malloc(e->e_rpool, strlen(q)); + result = sasl_decode64(q, strlen(q), in, + &inlen); +# endif /* SASL >= 20000 */ + if (result != SASL_OK) + { + message("501 5.5.4 cannot BASE64 decode '%s'", + q); + if (LogLevel > 5) + sm_syslog(LOG_WARNING, e->e_id, + "AUTH decode64 error [%d for \"%s\"]", + result, q); + /* start over? */ + authenticating = SASL_NOT_AUTH; +# if SASL >= 20000 + sm_free(in); +# endif /* SASL >= 20000 */ + in = NULL; + inlen = 0; + break; + } + } + else + { + in = NULL; + inlen = 0; + } + + /* see if that auth type exists */ +# if SASL >= 20000 + result = sasl_server_start(conn, p, in, inlen, + &out, &outlen); + if (in != NULL) + sm_free(in); +# else /* SASL >= 20000 */ + result = sasl_server_start(conn, p, in, inlen, + &out, &outlen, &errstr); +# endif /* SASL >= 20000 */ + + if (result != SASL_OK && result != SASL_CONTINUE) + { + message("535 5.7.0 authentication failed"); + if (LogLevel > 9) + sm_syslog(LOG_ERR, e->e_id, + "AUTH failure (%s): %s (%d) %s", + p, + sasl_errstring(result, NULL, + NULL), + result, +# if SASL >= 20000 + sasl_errdetail(conn)); +# else /* SASL >= 20000 */ + errstr); +# endif /* SASL >= 20000 */ + RESET_SASLCONN; + break; + } + auth_type = newstr(p); + + if (result == SASL_OK) + { + /* ugly, but same code */ + goto authenticated; + /* authenticated by the initial response */ + } + + /* len is at least 2 */ + len = ENC64LEN(outlen); + out2 = xalloc(len); + result = sasl_encode64(out, outlen, out2, len, + &out2len); + + if (result != SASL_OK) + { + message("454 4.5.4 Temporary authentication failure"); + if (LogLevel > 5) + sm_syslog(LOG_WARNING, e->e_id, + "AUTH encode64 error [%d for \"%s\"]", + result, out); + + /* start over? */ + authenticating = SASL_NOT_AUTH; + RESET_SASLCONN; + } + else + { + message("334 %s", out2); + authenticating = SASL_PROC_AUTH; + } +# if SASL >= 20000 + sm_free(out2); +# endif /* SASL >= 20000 */ + break; +#endif /* SASL */ + +#if STARTTLS + case CMDSTLS: /* starttls */ + DELAY_CONN("STARTTLS"); + if (*p != '\0') + { + message("501 5.5.2 Syntax error (no parameters allowed)"); + break; + } + if (!bitset(SRV_OFFER_TLS, features)) + { + message("503 5.5.0 TLS not available"); + break; + } + if (!tls_ok_srv) + { + message("454 4.3.3 TLS not available after start"); + break; + } + if (smtp.sm_gotmail) + { + message("503 5.5.0 TLS not permitted during a mail transaction"); + break; + } + if (tempfail) + { + if (LogLevel > 9) + sm_syslog(LOG_INFO, e->e_id, + "SMTP STARTTLS command (%.100s) from %s tempfailed (due to previous checks)", + p, CurSmtpClient); + usrerr("454 4.7.0 Please try again later"); + break; + } + starttls: +# if TLS_NO_RSA + /* + ** XXX do we need a temp key ? + */ +# else /* TLS_NO_RSA */ +# endif /* TLS_NO_RSA */ + +# if TLS_VRFY_PER_CTX + /* + ** Note: this sets the verification globally + ** (per SSL_CTX) + ** it's ok since it applies only to one transaction + */ + + TLS_VERIFY_CLIENT(); +# endif /* TLS_VRFY_PER_CTX */ + + if (srv_ssl != NULL) + SSL_clear(srv_ssl); + else if ((srv_ssl = SSL_new(srv_ctx)) == NULL) + { + message("454 4.3.3 TLS not available: error generating SSL handle"); + if (LogLevel > 8) + tlslogerr("server"); + goto tls_done; + } + +# if !TLS_VRFY_PER_CTX + /* + ** this could be used if it were possible to set + ** verification per SSL (connection) + ** not just per SSL_CTX (global) + */ + + TLS_VERIFY_CLIENT(); +# endif /* !TLS_VRFY_PER_CTX */ + + rfd = sm_io_getinfo(InChannel, SM_IO_WHAT_FD, NULL); + wfd = sm_io_getinfo(OutChannel, SM_IO_WHAT_FD, NULL); + + if (rfd < 0 || wfd < 0 || + SSL_set_rfd(srv_ssl, rfd) <= 0 || + SSL_set_wfd(srv_ssl, wfd) <= 0) + { + message("454 4.3.3 TLS not available: error set fd"); + SSL_free(srv_ssl); + srv_ssl = NULL; + goto tls_done; + } + if (!smtps) + message("220 2.0.0 Ready to start TLS"); +# if PIPELINING + (void) sm_io_flush(OutChannel, SM_TIME_DEFAULT); +# endif /* PIPELINING */ + + SSL_set_accept_state(srv_ssl); + +# define SSL_ACC(s) SSL_accept(s) + + tlsstart = curtime(); + fdfl = fcntl(rfd, F_GETFL); + if (fdfl != -1) + fcntl(rfd, F_SETFL, fdfl|O_NONBLOCK); + ssl_retry: + if ((r = SSL_ACC(srv_ssl)) <= 0) + { + int i; + bool timedout; + time_t left; + time_t now = curtime(); + struct timeval tv; + + /* what to do in this case? */ + i = SSL_get_error(srv_ssl, r); + + /* + ** For SSL_ERROR_WANT_{READ,WRITE}: + ** There is no SSL record available yet + ** or there is only a partial SSL record + ** removed from the network (socket) buffer + ** into the SSL buffer. The SSL_accept will + ** only succeed when a full SSL record is + ** available (assuming a "real" error + ** doesn't happen). To handle when a "real" + ** error does happen the select is set for + ** exceptions too. + ** The connection may be re-negotiated + ** during this time so both read and write + ** "want errors" need to be handled. + ** A select() exception loops back so that + ** a proper SSL error message can be gotten. + */ + + left = TimeOuts.to_starttls - (now - tlsstart); + timedout = left <= 0; + if (!timedout) + { + tv.tv_sec = left; + tv.tv_usec = 0; + } + + if (!timedout && FD_SETSIZE > 0 && + (rfd >= FD_SETSIZE || + (i == SSL_ERROR_WANT_WRITE && + wfd >= FD_SETSIZE))) + { + if (LogLevel > 5) + { + sm_syslog(LOG_ERR, NOQID, + "STARTTLS=server, error: fd %d/%d too large", + rfd, wfd); + if (LogLevel > 8) + tlslogerr("server"); + } + goto tlsfail; + } + + /* XXX what about SSL_pending() ? */ + if (!timedout && i == SSL_ERROR_WANT_READ) + { + fd_set ssl_maskr, ssl_maskx; + + FD_ZERO(&ssl_maskr); + FD_SET(rfd, &ssl_maskr); + FD_ZERO(&ssl_maskx); + FD_SET(rfd, &ssl_maskx); + if (select(rfd + 1, &ssl_maskr, NULL, + &ssl_maskx, &tv) > 0) + goto ssl_retry; + } + if (!timedout && i == SSL_ERROR_WANT_WRITE) + { + fd_set ssl_maskw, ssl_maskx; + + FD_ZERO(&ssl_maskw); + FD_SET(wfd, &ssl_maskw); + FD_ZERO(&ssl_maskx); + FD_SET(rfd, &ssl_maskx); + if (select(wfd + 1, NULL, &ssl_maskw, + &ssl_maskx, &tv) > 0) + goto ssl_retry; + } + if (LogLevel > 5) + { + sm_syslog(LOG_WARNING, NOQID, + "STARTTLS=server, error: accept failed=%d, SSL_error=%d, timedout=%d, errno=%d", + r, i, (int) timedout, errno); + if (LogLevel > 8) + tlslogerr("server"); + } +tlsfail: + tls_ok_srv = false; + SSL_free(srv_ssl); + srv_ssl = NULL; + + /* + ** according to the next draft of + ** RFC 2487 the connection should be dropped + */ + + /* arrange to ignore any current send list */ + e->e_sendqueue = NULL; + goto doquit; + } + + if (fdfl != -1) + fcntl(rfd, F_SETFL, fdfl); + + /* ignore return code for now, it's in {verify} */ + (void) tls_get_info(srv_ssl, true, + CurSmtpClient, + &BlankEnvelope.e_macro, + bitset(SRV_VRFY_CLT, features)); + + /* + ** call Stls_client to find out whether + ** to accept the connection from the client + */ + + saveQuickAbort = QuickAbort; + saveSuprErrs = SuprErrs; + SuprErrs = true; + QuickAbort = false; + if (rscheck("tls_client", + macvalue(macid("{verify}"), e), + "STARTTLS", e, + RSF_RMCOMM|RSF_COUNT, + 5, NULL, NOQID) != EX_OK || + Errors > 0) + { + extern char MsgBuf[]; + + if (MsgBuf[0] != '\0' && ISSMTPREPLY(MsgBuf)) + nullserver = newstr(MsgBuf); + else + nullserver = "503 5.7.0 Authentication required."; + } + QuickAbort = saveQuickAbort; + SuprErrs = saveSuprErrs; + + tls_ok_srv = false; /* don't offer STARTTLS again */ + n_helo = 0; +# if SASL + if (sasl_ok) + { + int cipher_bits; + bool verified; + char *s, *v, *c; + + s = macvalue(macid("{cipher_bits}"), e); + v = macvalue(macid("{verify}"), e); + c = macvalue(macid("{cert_subject}"), e); + verified = (v != NULL && strcmp(v, "OK") == 0); + if (s != NULL && (cipher_bits = atoi(s)) > 0) + { +# if SASL >= 20000 + ext_ssf = cipher_bits; + auth_id = verified ? c : NULL; + sasl_ok = ((sasl_setprop(conn, + SASL_SSF_EXTERNAL, + &ext_ssf) == SASL_OK) && + (sasl_setprop(conn, + SASL_AUTH_EXTERNAL, + auth_id) == SASL_OK)); +# else /* SASL >= 20000 */ + ext_ssf.ssf = cipher_bits; + ext_ssf.auth_id = verified ? c : NULL; + sasl_ok = sasl_setprop(conn, + SASL_SSF_EXTERNAL, + &ext_ssf) == SASL_OK; +# endif /* SASL >= 20000 */ + mechlist = NULL; + if (sasl_ok) + n_mechs = saslmechs(conn, + &mechlist); + } + } +# endif /* SASL */ + + /* switch to secure connection */ + if (sfdctls(&InChannel, &OutChannel, srv_ssl) == 0) + { + tls_active = true; +# if PIPELINING + (void) sm_io_autoflush(InChannel, OutChannel); +# endif /* PIPELINING */ + } + else + { + /* + ** XXX this is an internal error + ** how to deal with it? + ** we can't generate an error message + ** since the other side switched to an + ** encrypted layer, but we could not... + ** just "hang up"? + */ + + nullserver = "454 4.3.3 TLS not available: can't switch to encrypted layer"; + syserr("STARTTLS: can't switch to encrypted layer"); + } + tls_done: + if (smtps) + { + if (tls_active) + goto greeting; + else + goto doquit; + } + break; +#endif /* STARTTLS */ + + case CMDHELO: /* hello -- introduce yourself */ + case CMDEHLO: /* extended hello */ + DELAY_CONN("EHLO"); + if (c->cmd_code == CMDEHLO) + { + protocol = "ESMTP"; + SmtpPhase = "server EHLO"; + } + else + { + protocol = "SMTP"; + SmtpPhase = "server HELO"; + } + + /* avoid denial-of-service */ + STOP_IF_ATTACK(checksmtpattack(&n_helo, MAXHELOCOMMANDS, + true, "HELO/EHLO", e)); + +#if 0 + /* RFC2821 4.1.4 allows duplicate HELO/EHLO */ + /* check for duplicate HELO/EHLO per RFC 1651 4.2 */ + if (gothello) + { + usrerr("503 %s Duplicate HELO/EHLO", + MyHostName); + break; + } +#endif /* 0 */ + + /* check for valid domain name (re 1123 5.2.5) */ + if (*p == '\0' && !AllowBogusHELO) + { + usrerr("501 %s requires domain address", + cmdbuf); + break; + } + + /* check for long domain name (hides Received: info) */ + if (strlen(p) > MAXNAME) + { + usrerr("501 Invalid domain name"); + if (LogLevel > 9) + sm_syslog(LOG_INFO, CurEnv->e_id, + "invalid domain name (too long) from %s", + CurSmtpClient); + break; + } + + ok = true; + for (q = p; *q != '\0'; q++) + { + if (!isascii(*q)) + break; + if (isalnum(*q)) + continue; + if (isspace(*q)) + { + *q = '\0'; + + /* only complain if strict check */ + ok = AllowBogusHELO; + break; + } + if (strchr("[].-_#:", *q) == NULL) + break; + } + + if (*q == '\0' && ok) + { + q = "pleased to meet you"; + sendinghost = sm_strdup_x(p); + hello_accept = true; + hello_name = sm_strdup_x(p); + macdefine(&e->e_macro, A_PERM, macid("{client_hello}"), + hello_name); + } + else if (!AllowBogusHELO) + { + usrerr("501 Invalid domain name"); + if (LogLevel > 9) + sm_syslog(LOG_INFO, CurEnv->e_id, + "invalid domain name (%s) from %.100s", + p, CurSmtpClient); + break; + } + else + { + q = "accepting invalid domain name"; + hello_accept = true; + hello_name = sm_strdup_x(p); + macdefine(&e->e_macro, A_PERM, macid("{client_hello}"), + hello_name); + } + + if (gothello) + { + CLEAR_STATE(cmdbuf); + } + + if (hello_accept) { + if (rscheck("check_hello", hello_name, + NULL, e, RSF_RMCOMM|RSF_COUNT, 3, + NULL, e->e_id) != EX_OK || + Errors > 0) + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + + if (MaxMessageSize > 0 && + (e->e_msgsize > MaxMessageSize || + e->e_msgsize < 0)) + { + usrerr("552 5.2.3 Message size exceeds fixed maximum message siz + MaxMessageSize); + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + } + }; + +#if MILTER + if (smtp.sm_milterlist && smtp.sm_milterize && + !bitset(EF_DISCARD, e->e_flags)) + { + char state; + char *response; + + response = milter_helo(p, e, &state); + switch (state) + { + case SMFIR_REPLYCODE: + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: helo=%s, reject=%s", + p, response); + nullserver = newstr(response); + smtp.sm_milterize = false; + break; + + case SMFIR_REJECT: + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: helo=%s, reject=Command rejected", + p); + nullserver = "Command rejected"; + smtp.sm_milterize = false; + break; + + case SMFIR_TEMPFAIL: + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: helo=%s, reject=%s", + p, MSG_TEMPFAIL); + tempfail = true; + smtp.sm_milterize = false; + break; + } + if (response != NULL) + sm_free(response); + + /* + ** If quarantining by a connect/ehlo action, + ** save between messages + */ + + if (smtp.sm_quarmsg == NULL && + e->e_quarmsg != NULL) + smtp.sm_quarmsg = newstr(e->e_quarmsg); + } +#endif /* MILTER */ + gothello = true; + + /* print HELO response message */ + if (c->cmd_code != CMDEHLO) + { + message("250 %s Hello %s, %s", + MyHostName, CurSmtpClient, q); + break; + } + + message("250-%s Hello %s, %s", + MyHostName, CurSmtpClient, q); + + /* offer ENHSC even for nullserver */ + if (nullserver != NULL) + { + message("250 ENHANCEDSTATUSCODES"); + break; + } + + /* + ** print EHLO features list + ** + ** Note: If you change this list, + ** remember to update 'helpfile' + */ + + message("250-ENHANCEDSTATUSCODES"); +#if PIPELINING + if (bitset(SRV_OFFER_PIPE, features)) + message("250-PIPELINING"); +#endif /* PIPELINING */ + if (bitset(SRV_OFFER_EXPN, features)) + { + message("250-EXPN"); + if (bitset(SRV_OFFER_VERB, features)) + message("250-VERB"); + } +#if MIME8TO7 + message("250-8BITMIME"); +#endif /* MIME8TO7 */ + if (MaxMessageSize > 0) + message("250-SIZE %ld", MaxMessageSize); + else + message("250-SIZE"); +#if DSN + if (SendMIMEErrors && bitset(SRV_OFFER_DSN, features)) + message("250-DSN"); +#endif /* DSN */ + if (bitset(SRV_OFFER_ETRN, features)) + message("250-ETRN"); +#if SASL + if (sasl_ok && mechlist != NULL && *mechlist != '\0') + message("250-AUTH %s", mechlist); +#endif /* SASL */ +#if STARTTLS + if (tls_ok_srv && + bitset(SRV_OFFER_TLS, features)) + message("250-STARTTLS"); +#endif /* STARTTLS */ + if (DeliverByMin > 0) + message("250-DELIVERBY %ld", + (long) DeliverByMin); + else if (DeliverByMin == 0) + message("250-DELIVERBY"); + + /* < 0: no deliver-by */ + + message("250 HELP"); + break; + + case CMDMAIL: /* mail -- designate sender */ + SmtpPhase = "server MAIL"; + DELAY_CONN("MAIL"); + + /* check for validity of this command */ + if (!gothello && bitset(PRIV_NEEDMAILHELO, PrivacyFlags)) + { + usrerr("503 5.0.0 Polite people say HELO first"); + break; + } + if (smtp.sm_gotmail) + { + usrerr("503 5.5.0 Sender already specified"); + break; + } +#if SASL + if (bitset(SRV_REQ_AUTH, features) && + authenticating != SASL_IS_AUTH) + { + usrerr("530 5.7.0 Authentication required"); + break; + } +#endif /* SASL */ + + p = skipword(p, "from"); + if (p == NULL) + break; + if (tempfail) + { + if (LogLevel > 9) + sm_syslog(LOG_INFO, e->e_id, + "SMTP MAIL command (%.100s) from %s tempfailed (due to previous checks)", + p, CurSmtpClient); + usrerr(MSG_TEMPFAIL); + break; + } + + /* make sure we know who the sending host is */ + if (sendinghost == NULL) + sendinghost = peerhostname; + + +#if SM_HEAP_CHECK + if (sm_debug_active(&DebugLeakSmtp, 1)) + { + sm_heap_newgroup(); + sm_dprintf("smtp() heap group #%d\n", + sm_heap_group()); + } +#endif /* SM_HEAP_CHECK */ + + if (Errors > 0) + goto undo_no_pm; + if (!gothello) + { + auth_warning(e, "%s didn't use HELO protocol", + CurSmtpClient); + } +#ifdef PICKY_HELO_CHECK + if (sm_strcasecmp(sendinghost, peerhostname) != 0 && + (sm_strcasecmp(peerhostname, "localhost") != 0 || + sm_strcasecmp(sendinghost, MyHostName) != 0)) + { + auth_warning(e, "Host %s claimed to be %s", + CurSmtpClient, sendinghost); + } +#endif /* PICKY_HELO_CHECK */ + + if (protocol == NULL) + protocol = "SMTP"; + macdefine(&e->e_macro, A_PERM, 'r', protocol); + macdefine(&e->e_macro, A_PERM, 's', sendinghost); + + if (Errors > 0) + goto undo_no_pm; + smtp.sm_nrcpts = 0; + n_badrcpts = 0; + macdefine(&e->e_macro, A_PERM, macid("{ntries}"), "0"); + macdefine(&e->e_macro, A_PERM, macid("{nrcpts}"), "0"); + macdefine(&e->e_macro, A_PERM, macid("{nbadrcpts}"), + "0"); + e->e_flags |= EF_CLRQUEUE; + sm_setproctitle(true, e, "%s %s: %.80s", + qid_printname(e), + CurSmtpClient, inp); + + /* do the processing */ + SM_TRY + { + extern char *FullName; + + QuickAbort = true; + SM_FREE_CLR(FullName); + + /* must parse sender first */ + delimptr = NULL; + setsender(p, e, &delimptr, ' ', false); + if (delimptr != NULL && *delimptr != '\0') + *delimptr++ = '\0'; + if (Errors > 0) + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + + /* Successfully set e_from, allow logging */ + e->e_flags |= EF_LOGSENDER; + + /* put resulting triple from parseaddr() into macros */ + if (e->e_from.q_mailer != NULL) + macdefine(&e->e_macro, A_PERM, + macid("{mail_mailer}"), + e->e_from.q_mailer->m_name); + else + macdefine(&e->e_macro, A_PERM, + macid("{mail_mailer}"), NULL); + if (e->e_from.q_host != NULL) + macdefine(&e->e_macro, A_PERM, + macid("{mail_host}"), + e->e_from.q_host); + else + macdefine(&e->e_macro, A_PERM, + macid("{mail_host}"), "localhost"); + if (e->e_from.q_user != NULL) + macdefine(&e->e_macro, A_PERM, + macid("{mail_addr}"), + e->e_from.q_user); + else + macdefine(&e->e_macro, A_PERM, + macid("{mail_addr}"), NULL); + if (Errors > 0) + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + + /* check for possible spoofing */ + if (RealUid != 0 && OpMode == MD_SMTP && + !wordinclass(RealUserName, 't') && + (!bitnset(M_LOCALMAILER, + e->e_from.q_mailer->m_flags) || + strcmp(e->e_from.q_user, RealUserName) != 0)) + { + auth_warning(e, "%s owned process doing -bs", + RealUserName); + } + + /* reset to default value */ + SevenBitInput = save_sevenbitinput; + + /* now parse ESMTP arguments */ + e->e_msgsize = 0; + addr = p; + argno = 0; + args[argno++] = p; + p = delimptr; + while (p != NULL && *p != '\0') + { + char *kp; + char *vp = NULL; + char *equal = NULL; + + /* locate the beginning of the keyword */ + SKIP_SPACE(p); + if (*p == '\0') + break; + kp = p; + + /* skip to the value portion */ + while ((isascii(*p) && isalnum(*p)) || *p == '-') + p++; + if (*p == '=') + { + equal = p; + *p++ = '\0'; + vp = p; + + /* skip to the end of the value */ + while (*p != '\0' && *p != ' ' && + !(isascii(*p) && iscntrl(*p)) && + *p != '=') + p++; + } + + if (*p != '\0') + *p++ = '\0'; + + if (tTd(19, 1)) + sm_dprintf("MAIL: got arg %s=\"%s\"\n", kp, + vp == NULL ? "<null>" : vp); + + mail_esmtp_args(kp, vp, e); + if (equal != NULL) + *equal = '='; + args[argno++] = kp; + if (argno >= MAXSMTPARGS - 1) + usrerr("501 5.5.4 Too many parameters"); + if (Errors > 0) + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + } + args[argno] = NULL; + if (Errors > 0) + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + +#if SASL +# if _FFR_AUTH_PASSING + /* set the default AUTH= if the sender didn't */ + if (e->e_auth_param == NULL) + { + /* XXX only do this for an MSA? */ + e->e_auth_param = macvalue(macid("{auth_authen}"), + e); + if (e->e_auth_param == NULL) + e->e_auth_param = "<>"; + + /* + ** XXX should we invoke Strust_auth now? + ** authorizing as the client that just + ** authenticated, so we'll trust implicitly + */ + } +# endif /* _FFR_AUTH_PASSING */ +#endif /* SASL */ + + /* do config file checking of the sender */ + macdefine(&e->e_macro, A_PERM, + macid("{addr_type}"), "e s"); +#if _FFR_MAIL_MACRO + /* make the "real" sender address available */ + macdefine(&e->e_macro, A_TEMP, macid("{mail_from}"), + e->e_from.q_paddr); +#endif /* _FFR_MAIL_MACRO */ + if (rscheck("check_mail", addr, + NULL, e, RSF_RMCOMM|RSF_COUNT, 3, + NULL, e->e_id) != EX_OK || + Errors > 0) + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + macdefine(&e->e_macro, A_PERM, + macid("{addr_type}"), NULL); + + if (MaxMessageSize > 0 && + (e->e_msgsize > MaxMessageSize || + e->e_msgsize < 0)) + { + usrerr("552 5.2.3 Message size exceeds fixed maximum message size (%ld)", + MaxMessageSize); + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + } + + /* + ** XXX always check whether there is at least one fs + ** with enough space? + ** However, this may not help much: the queue group + ** selection may later on select a FS that hasn't + ** enough space. + */ + + if ((NumFileSys == 1 || NumQueue == 1) && + !enoughdiskspace(e->e_msgsize, e) +#if _FFR_ANY_FREE_FS + && !filesys_free(e->e_msgsize) +#endif /* _FFR_ANY_FREE_FS */ + ) + { + /* + ** We perform this test again when the + ** queue directory is selected, in collect. + */ + + usrerr("452 4.4.5 Insufficient disk space; try again later"); + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + } + if (Errors > 0) + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + + LogUsrErrs = true; +#if MILTER + if (smtp.sm_milterlist && smtp.sm_milterize && + !bitset(EF_DISCARD, e->e_flags)) + { + char state; + char *response; + + response = milter_envfrom(args, e, &state); + MILTER_REPLY("from"); + } +#endif /* MILTER */ + if (Errors > 0) + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + + message("250 2.1.0 Sender ok"); + smtp.sm_gotmail = true; + } + SM_EXCEPT(exc, "[!F]*") + { + /* + ** An error occurred while processing a MAIL command. + ** Jump to the common error handling code. + */ + + sm_exc_free(exc); + goto undo_no_pm; + } + SM_END_TRY + break; + + undo_no_pm: + e->e_flags &= ~EF_PM_NOTIFY; + undo: + break; + + case CMDRCPT: /* rcpt -- designate recipient */ + DELAY_CONN("RCPT"); + if (BadRcptThrottle > 0 && + n_badrcpts >= BadRcptThrottle) + { + if (LogLevel > 5 && + n_badrcpts == BadRcptThrottle) + { + sm_syslog(LOG_INFO, e->e_id, + "%s: Possible SMTP RCPT flood, throttling.", + CurSmtpClient); + + /* To avoid duplicated message */ + n_badrcpts++; + } + NBADRCPTS; + + /* + ** Don't use exponential backoff for now. + ** Some servers will open more connections + ** and actually overload the receiver even + ** more. + */ + + (void) sleep(1); + } + if (!smtp.sm_gotmail) + { + usrerr("503 5.0.0 Need MAIL before RCPT"); + break; + } + SmtpPhase = "server RCPT"; + SM_TRY + { + QuickAbort = true; + LogUsrErrs = true; + + /* limit flooding of our machine */ + if (MaxRcptPerMsg > 0 && + smtp.sm_nrcpts >= MaxRcptPerMsg) + { + /* sleep(1); / * slow down? */ + usrerr("452 4.5.3 Too many recipients"); + goto rcpt_done; + } + + if (e->e_sendmode != SM_DELIVER) + e->e_flags |= EF_VRFYONLY; + +#if MILTER + /* + ** If the filter will be deleting recipients, + ** don't expand them at RCPT time (in the call + ** to recipient()). If they are expanded, it + ** is impossible for removefromlist() to figure + ** out the expanded members of the original + ** recipient and mark them as QS_DONTSEND. + */ + + if (milter_can_delrcpts()) + e->e_flags |= EF_VRFYONLY; +#endif /* MILTER */ + + p = skipword(p, "to"); + if (p == NULL) + goto rcpt_done; + macdefine(&e->e_macro, A_PERM, + macid("{addr_type}"), "e r"); + a = parseaddr(p, NULLADDR, RF_COPYALL, ' ', &delimptr, + e, true); + macdefine(&e->e_macro, A_PERM, + macid("{addr_type}"), NULL); + if (Errors > 0) + goto rcpt_done; + if (a == NULL) + { + usrerr("501 5.0.0 Missing recipient"); + goto rcpt_done; + } + + if (delimptr != NULL && *delimptr != '\0') + *delimptr++ = '\0'; + + /* put resulting triple from parseaddr() into macros */ + if (a->q_mailer != NULL) + macdefine(&e->e_macro, A_PERM, + macid("{rcpt_mailer}"), + a->q_mailer->m_name); + else + macdefine(&e->e_macro, A_PERM, + macid("{rcpt_mailer}"), NULL); + if (a->q_host != NULL) + macdefine(&e->e_macro, A_PERM, + macid("{rcpt_host}"), a->q_host); + else + macdefine(&e->e_macro, A_PERM, + macid("{rcpt_host}"), "localhost"); + if (a->q_user != NULL) + macdefine(&e->e_macro, A_PERM, + macid("{rcpt_addr}"), a->q_user); + else + macdefine(&e->e_macro, A_PERM, + macid("{rcpt_addr}"), NULL); + if (Errors > 0) + goto rcpt_done; + + /* now parse ESMTP arguments */ + addr = p; + argno = 0; + args[argno++] = p; + p = delimptr; + while (p != NULL && *p != '\0') + { + char *kp; + char *vp = NULL; + char *equal = NULL; + + /* locate the beginning of the keyword */ + SKIP_SPACE(p); + if (*p == '\0') + break; + kp = p; + + /* skip to the value portion */ + while ((isascii(*p) && isalnum(*p)) || *p == '-') + p++; + if (*p == '=') + { + equal = p; + *p++ = '\0'; + vp = p; + + /* skip to the end of the value */ + while (*p != '\0' && *p != ' ' && + !(isascii(*p) && iscntrl(*p)) && + *p != '=') + p++; + } + + if (*p != '\0') + *p++ = '\0'; + + if (tTd(19, 1)) + sm_dprintf("RCPT: got arg %s=\"%s\"\n", kp, + vp == NULL ? "<null>" : vp); + + rcpt_esmtp_args(a, kp, vp, e); + if (equal != NULL) + *equal = '='; + args[argno++] = kp; + if (argno >= MAXSMTPARGS - 1) + usrerr("501 5.5.4 Too many parameters"); + if (Errors > 0) + break; + } + args[argno] = NULL; + if (Errors > 0) + goto rcpt_done; + + /* do config file checking of the recipient */ + macdefine(&e->e_macro, A_PERM, + macid("{addr_type}"), "e r"); + if (rscheck("check_rcpt", addr, + NULL, e, RSF_RMCOMM|RSF_COUNT, 3, + NULL, e->e_id) != EX_OK || + Errors > 0) + goto rcpt_done; + macdefine(&e->e_macro, A_PERM, + macid("{addr_type}"), NULL); + + /* If discarding, don't bother to verify user */ + if (bitset(EF_DISCARD, e->e_flags)) + a->q_state = QS_VERIFIED; + +#if MILTER + if (smtp.sm_milterlist && smtp.sm_milterize && + !bitset(EF_DISCARD, e->e_flags)) + { + char state; + char *response; + + response = milter_envrcpt(args, e, &state); + MILTER_REPLY("to"); + } +#endif /* MILTER */ + + macdefine(&e->e_macro, A_PERM, + macid("{rcpt_mailer}"), NULL); + macdefine(&e->e_macro, A_PERM, + macid("{rcpt_host}"), NULL); + macdefine(&e->e_macro, A_PERM, + macid("{rcpt_addr}"), NULL); + macdefine(&e->e_macro, A_PERM, + macid("{dsn_notify}"), NULL); + if (Errors > 0) + goto rcpt_done; + + /* save in recipient list after ESMTP mods */ + a = recipient(a, &e->e_sendqueue, 0, e); + if (Errors > 0) + goto rcpt_done; + + /* no errors during parsing, but might be a duplicate */ + e->e_to = a->q_paddr; + if (!QS_IS_BADADDR(a->q_state)) + { + if (smtp.sm_nrcpts == 0) + initsys(e); + message("250 2.1.5 Recipient ok%s", + QS_IS_QUEUEUP(a->q_state) ? + " (will queue)" : ""); + smtp.sm_nrcpts++; + } + else + { + /* punt -- should keep message in ADDRESS.... */ + usrerr("550 5.1.1 Addressee unknown"); + } + rcpt_done: + if (Errors > 0) + { + ++n_badrcpts; + NBADRCPTS; + } + } + SM_EXCEPT(exc, "[!F]*") + { + /* An exception occurred while processing RCPT */ + e->e_flags &= ~(EF_FATALERRS|EF_PM_NOTIFY); + ++n_badrcpts; + NBADRCPTS; + } + SM_END_TRY + break; + + case CMDDATA: /* data -- text of mail */ + DELAY_CONN("DATA"); + if (!smtp_data(&smtp, e)) + goto doquit; + break; + + case CMDRSET: /* rset -- reset state */ + if (tTd(94, 100)) + message("451 4.0.0 Test failure"); + else + message("250 2.0.0 Reset state"); + CLEAR_STATE(cmdbuf); + break; + + case CMDVRFY: /* vrfy -- verify address */ + case CMDEXPN: /* expn -- expand address */ + vrfy = c->cmd_code == CMDVRFY; + DELAY_CONN(vrfy ? "VRFY" : "EXPN"); + if (tempfail) + { + if (LogLevel > 9) + sm_syslog(LOG_INFO, e->e_id, + "SMTP %s command (%.100s) from %s tempfailed (due to previous checks)", + vrfy ? "VRFY" : "EXPN", + p, CurSmtpClient); + + /* RFC 821 doesn't allow 4xy reply code */ + usrerr("550 5.7.1 Please try again later"); + break; + } + wt = checksmtpattack(&n_verifies, MAXVRFYCOMMANDS, + false, vrfy ? "VRFY" : "EXPN", e); + STOP_IF_ATTACK(wt); + previous = curtime(); + if ((vrfy && bitset(PRIV_NOVRFY, PrivacyFlags)) || + (!vrfy && !bitset(SRV_OFFER_EXPN, features))) + { + if (vrfy) + message("252 2.5.2 Cannot VRFY user; try RCPT to attempt delivery (or try finger)"); + else + message("502 5.7.0 Sorry, we do not allow this operation"); + if (LogLevel > 5) + sm_syslog(LOG_INFO, e->e_id, + "%s: %s [rejected]", + CurSmtpClient, + shortenstring(inp, MAXSHORTSTR)); + break; + } + else if (!gothello && + bitset(vrfy ? PRIV_NEEDVRFYHELO : PRIV_NEEDEXPNHELO, + PrivacyFlags)) + { + usrerr("503 5.0.0 I demand that you introduce yourself first"); + break; + } + if (Errors > 0) + break; + if (LogLevel > 5) + sm_syslog(LOG_INFO, e->e_id, "%s: %s", + CurSmtpClient, + shortenstring(inp, MAXSHORTSTR)); + SM_TRY + { + QuickAbort = true; + vrfyqueue = NULL; + if (vrfy) + e->e_flags |= EF_VRFYONLY; + while (*p != '\0' && isascii(*p) && isspace(*p)) + p++; + if (*p == '\0') + { + usrerr("501 5.5.2 Argument required"); + } + else + { + /* do config file checking of the address */ + if (rscheck(vrfy ? "check_vrfy" : "check_expn", + p, NULL, e, RSF_RMCOMM, + 3, NULL, NOQID) != EX_OK || + Errors > 0) + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + (void) sendtolist(p, NULLADDR, &vrfyqueue, 0, e); + } + if (wt > 0) + { + time_t t; + + t = wt - (curtime() - previous); + if (t > 0) + (void) sleep(t); + } + if (Errors > 0) + sm_exc_raisenew_x(&EtypeQuickAbort, 1); + if (vrfyqueue == NULL) + { + usrerr("554 5.5.2 Nothing to %s", vrfy ? "VRFY" : "EXPN"); + } + while (vrfyqueue != NULL) + { + if (!QS_IS_UNDELIVERED(vrfyqueue->q_state)) + { + vrfyqueue = vrfyqueue->q_next; + continue; + } + + /* see if there is more in the vrfy list */ + a = vrfyqueue; + while ((a = a->q_next) != NULL && + (!QS_IS_UNDELIVERED(a->q_state))) + continue; + printvrfyaddr(vrfyqueue, a == NULL, vrfy); + vrfyqueue = a; + } + } + SM_EXCEPT(exc, "[!F]*") + { + /* + ** An exception occurred while processing VRFY/EXPN + */ + + sm_exc_free(exc); + goto undo; + } + SM_END_TRY + break; + + case CMDETRN: /* etrn -- force queue flush */ + DELAY_CONN("ETRN"); + + /* Don't leak queue information via debug flags */ + if (!bitset(SRV_OFFER_ETRN, features) || UseMSP || + (RealUid != 0 && RealUid != TrustedUid && + OpMode == MD_SMTP)) + { + /* different message for MSA ? */ + message("502 5.7.0 Sorry, we do not allow this operation"); + if (LogLevel > 5) + sm_syslog(LOG_INFO, e->e_id, + "%s: %s [rejected]", + CurSmtpClient, + shortenstring(inp, MAXSHORTSTR)); + break; + } + if (tempfail) + { + if (LogLevel > 9) + sm_syslog(LOG_INFO, e->e_id, + "SMTP ETRN command (%.100s) from %s tempfailed (due to previous checks)", + p, CurSmtpClient); + usrerr(MSG_TEMPFAIL); + break; + } + + if (strlen(p) <= 0) + { + usrerr("500 5.5.2 Parameter required"); + break; + } + + /* crude way to avoid denial-of-service attacks */ + STOP_IF_ATTACK(checksmtpattack(&n_etrn, MAXETRNCOMMANDS, + true, "ETRN", e)); + + /* + ** Do config file checking of the parameter. + ** Even though we have srv_features now, we still + ** need this ruleset because the former is called + ** when the connection has been established, while + ** this ruleset is called when the command is + ** actually issued and therefore has all information + ** available to make a decision. + */ + + if (rscheck("check_etrn", p, NULL, e, + RSF_RMCOMM, 3, NULL, NOQID) != EX_OK || + Errors > 0) + break; + + if (LogLevel > 5) + sm_syslog(LOG_INFO, e->e_id, + "%s: ETRN %s", CurSmtpClient, + shortenstring(p, MAXSHORTSTR)); + + id = p; + if (*id == '#') + { + int i, qgrp; + + id++; + qgrp = name2qid(id); + if (!ISVALIDQGRP(qgrp)) + { + usrerr("459 4.5.4 Queue %s unknown", + id); + break; + } + for (i = 0; i < NumQueue && Queue[i] != NULL; + i++) + Queue[i]->qg_nextrun = (time_t) -1; + Queue[qgrp]->qg_nextrun = 0; + ok = run_work_group(Queue[qgrp]->qg_wgrp, + RWG_FORK|RWG_FORCE); + if (ok && Errors == 0) + message("250 2.0.0 Queuing for queue group %s started", id); + break; + } + + if (*id == '@') + id++; + else + *--id = '@'; + + new = (QUEUE_CHAR *) sm_malloc(sizeof(QUEUE_CHAR)); + if (new == NULL) + { + syserr("500 5.5.0 ETRN out of memory"); + break; + } + new->queue_match = id; + new->queue_negate = false; + new->queue_next = NULL; + QueueLimitRecipient = new; + ok = runqueue(true, false, false, true); + sm_free(QueueLimitRecipient); /* XXX */ + QueueLimitRecipient = NULL; + if (ok && Errors == 0) + message("250 2.0.0 Queuing for node %s started", p); + break; + + case CMDHELP: /* help -- give user info */ + DELAY_CONN("HELP"); + help(p, e); + break; + + case CMDNOOP: /* noop -- do nothing */ + DELAY_CONN("NOOP"); + STOP_IF_ATTACK(checksmtpattack(&n_noop, MAXNOOPCOMMANDS, + true, "NOOP", e)); + message("250 2.0.0 OK"); + break; + + case CMDQUIT: /* quit -- leave mail */ + message("221 2.0.0 %s closing connection", MyHostName); +#if PIPELINING + (void) sm_io_flush(OutChannel, SM_TIME_DEFAULT); +#endif /* PIPELINING */ + + if (smtp.sm_nrcpts > 0) + logundelrcpts(e, "aborted by sender", 9, false); + + /* arrange to ignore any current send list */ + e->e_sendqueue = NULL; + +#if STARTTLS + /* shutdown TLS connection */ + if (tls_active) + { + (void) endtls(srv_ssl, "server"); + tls_active = false; + } +#endif /* STARTTLS */ +#if SASL + if (authenticating == SASL_IS_AUTH) + { + sasl_dispose(&conn); + authenticating = SASL_NOT_AUTH; + /* XXX sasl_done(); this is a child */ + } +#endif /* SASL */ + +doquit: + /* avoid future 050 messages */ + disconnect(1, e); + +#if MILTER + /* close out milter filters */ + milter_quit(e); +#endif /* MILTER */ + + if (LogLevel > 4 && bitset(EF_LOGSENDER, e->e_flags)) + logsender(e, NULL); + e->e_flags &= ~EF_LOGSENDER; + + if (lognullconnection && LogLevel > 5 && + nullserver == NULL) + { + char *d; + + d = macvalue(macid("{daemon_name}"), e); + if (d == NULL) + d = "stdin"; + + /* + ** even though this id is "bogus", it makes + ** it simpler to "grep" related events, e.g., + ** timeouts for the same connection. + */ + + sm_syslog(LOG_INFO, e->e_id, + "%s did not issue MAIL/EXPN/VRFY/ETRN during connection to %s", + CurSmtpClient, d); + } + if (tTd(93, 100)) + { + /* return to handle next connection */ + return; + } + finis(true, true, ExitStat); + /* NOTREACHED */ + + case CMDVERB: /* set verbose mode */ + DELAY_CONN("VERB"); + if (!bitset(SRV_OFFER_EXPN, features) || + !bitset(SRV_OFFER_VERB, features)) + { + /* this would give out the same info */ + message("502 5.7.0 Verbose unavailable"); + break; + } + STOP_IF_ATTACK(checksmtpattack(&n_noop, MAXNOOPCOMMANDS, + true, "VERB", e)); + Verbose = 1; + set_delivery_mode(SM_DELIVER, e); + message("250 2.0.0 Verbose mode"); + break; + +#if SMTPDEBUG + case CMDDBGQSHOW: /* show queues */ + (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, + "Send Queue="); + printaddr(smioout, e->e_sendqueue, true); + break; + + case CMDDBGDEBUG: /* set debug mode */ + tTsetup(tTdvect, sizeof tTdvect, "0-99.1"); + tTflag(p); + message("200 2.0.0 Debug set"); + break; + +#else /* SMTPDEBUG */ + case CMDDBGQSHOW: /* show queues */ + case CMDDBGDEBUG: /* set debug mode */ +#endif /* SMTPDEBUG */ + case CMDLOGBOGUS: /* bogus command */ + DELAY_CONN("Bogus"); + if (LogLevel > 0) + sm_syslog(LOG_CRIT, e->e_id, + "\"%s\" command from %s (%.100s)", + c->cmd_name, CurSmtpClient, + anynet_ntoa(&RealHostAddr)); + /* FALLTHROUGH */ + + case CMDERROR: /* unknown command */ +#if MAXBADCOMMANDS > 0 + if (++n_badcmds > MAXBADCOMMANDS) + { + stopattack: + message("421 4.7.0 %s Too many bad commands; closing connection", + MyHostName); + + /* arrange to ignore any current send list */ + e->e_sendqueue = NULL; + goto doquit; + } +#endif /* MAXBADCOMMANDS > 0 */ + +#if MILTER && SMFI_VERSION > 2 + if (smtp.sm_milterlist && smtp.sm_milterize && + !bitset(EF_DISCARD, e->e_flags)) + { + char state; + char *response; + + if (MilterLogLevel > 9) + sm_syslog(LOG_INFO, e->e_id, + "Sending \"%s\" to Milter", inp); + response = milter_unknown(inp, e, &state); + MILTER_REPLY("unknown"); + if (state == SMFIR_REPLYCODE || + state == SMFIR_REJECT || + state == SMFIR_TEMPFAIL) + { + /* MILTER_REPLY already gave an error */ + break; + } + } +#endif /* MILTER && SMFI_VERSION > 2 */ + + usrerr("500 5.5.1 Command unrecognized: \"%s\"", + shortenstring(inp, MAXSHORTSTR)); + break; + + case CMDUNIMPL: + DELAY_CONN("Unimpl"); + usrerr("502 5.5.1 Command not implemented: \"%s\"", + shortenstring(inp, MAXSHORTSTR)); + break; + + default: + DELAY_CONN("default"); + errno = 0; + syserr("500 5.5.0 smtp: unknown code %d", c->cmd_code); + break; + } +#if SASL + } +#endif /* SASL */ + } + SM_EXCEPT(exc, "[!F]*") + { + /* + ** The only possible exception is "E:mta.quickabort". + ** There is nothing to do except fall through and loop. + */ + } + SM_END_TRY + } +} +/* +** SMTP_DATA -- implement the SMTP DATA command. +** +** Parameters: +** smtp -- status of SMTP connection. +** e -- envelope. +** +** Returns: +** true iff SMTP session can continue. +** +** Side Effects: +** possibly sends message. +*/ + +static bool +smtp_data(smtp, e) + SMTP_T *smtp; + ENVELOPE *e; +{ +#if MILTER + bool milteraccept; +#endif /* MILTER */ + bool aborting; + bool doublequeue; + ADDRESS *a; + ENVELOPE *ee; + char *id; + char *oldid; + char buf[32]; + + SmtpPhase = "server DATA"; + if (!smtp->sm_gotmail) + { + usrerr("503 5.0.0 Need MAIL command"); + return true; + } + else if (smtp->sm_nrcpts <= 0) + { + usrerr("503 5.0.0 Need RCPT (recipient)"); + return true; + } + (void) sm_snprintf(buf, sizeof buf, "%u", smtp->sm_nrcpts); + if (rscheck("check_data", buf, NULL, e, + RSF_RMCOMM|RSF_UNSTRUCTURED|RSF_COUNT, 3, NULL, + e->e_id) != EX_OK) + return true; + +#if MILTER && SMFI_VERSION > 3 + if (smtp->sm_milterlist && smtp->sm_milterize && + !bitset(EF_DISCARD, e->e_flags)) + { + char state; + char *response; + int savelogusrerrs = LogUsrErrs; + + response = milter_data_cmd(e, &state); + switch (state) + { + case SMFIR_REPLYCODE: + if (MilterLogLevel > 3) + { + sm_syslog(LOG_INFO, e->e_id, + "Milter: cmd=data, reject=%s", + response); + LogUsrErrs = false; + } + usrerr(response); + if (strncmp(response, "421 ", 4) == 0) + { + e->e_sendqueue = NULL; + return false; + } + return true; + + case SMFIR_REJECT: + if (MilterLogLevel > 3) + { + sm_syslog(LOG_INFO, e->e_id, + "Milter: cmd=data, reject=550 5.7.1 Command rejected"); + LogUsrErrs = false; + } + usrerr("550 5.7.1 Command rejected"); + return true; + + case SMFIR_DISCARD: + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: cmd=data, discard"); + e->e_flags |= EF_DISCARD; + break; + + case SMFIR_TEMPFAIL: + if (MilterLogLevel > 3) + { + sm_syslog(LOG_INFO, e->e_id, + "Milter: cmd=data, reject=%s", + MSG_TEMPFAIL); + LogUsrErrs = false; + } + usrerr(MSG_TEMPFAIL); + return true; + } + LogUsrErrs = savelogusrerrs; + if (response != NULL) + sm_free(response); /* XXX */ + } +#endif /* MILTER && SMFI_VERSION > 3 */ + + /* put back discard bit */ + if (smtp->sm_discard) + e->e_flags |= EF_DISCARD; + + /* check to see if we need to re-expand aliases */ + /* also reset QS_BADADDR on already-diagnosted addrs */ + doublequeue = false; + for (a = e->e_sendqueue; a != NULL; a = a->q_next) + { + if (QS_IS_VERIFIED(a->q_state) && + !bitset(EF_DISCARD, e->e_flags)) + { + /* need to re-expand aliases */ + doublequeue = true; + } + if (QS_IS_BADADDR(a->q_state)) + { + /* make this "go away" */ + a->q_state = QS_DONTSEND; + } + } + + /* collect the text of the message */ + SmtpPhase = "collect"; + buffer_errors(); + + collect(InChannel, true, NULL, e, true); + + /* redefine message size */ + (void) sm_snprintf(buf, sizeof buf, "%ld", e->e_msgsize); + macdefine(&e->e_macro, A_TEMP, macid("{msg_size}"), buf); + +#if _FFR_CHECK_EOM + /* rscheck() will set Errors or EF_DISCARD if it trips */ + (void) rscheck("check_eom", buf, NULL, e, RSF_UNSTRUCTURED|RSF_COUNT, + 3, NULL, e->e_id); +#endif /* _FFR_CHECK_EOM */ + +#if MILTER + milteraccept = true; + if (smtp->sm_milterlist && smtp->sm_milterize && + Errors <= 0 && + !bitset(EF_DISCARD, e->e_flags)) + { + char state; + char *response; + + response = milter_data(e, &state); + switch (state) + { + case SMFIR_REPLYCODE: + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: data, reject=%s", + response); + milteraccept = false; + usrerr(response); + break; + + case SMFIR_REJECT: + milteraccept = false; + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: data, reject=554 5.7.1 Command rejected"); + usrerr("554 5.7.1 Command rejected"); + break; + + case SMFIR_DISCARD: + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: data, discard"); + milteraccept = false; + e->e_flags |= EF_DISCARD; + break; + + case SMFIR_TEMPFAIL: + if (MilterLogLevel > 3) + sm_syslog(LOG_INFO, e->e_id, + "Milter: data, reject=%s", + MSG_TEMPFAIL); + milteraccept = false; + usrerr(MSG_TEMPFAIL); + break; + } + if (response != NULL) + sm_free(response); + } + + /* Milter may have changed message size */ + (void) sm_snprintf(buf, sizeof buf, "%ld", e->e_msgsize); + macdefine(&e->e_macro, A_TEMP, macid("{msg_size}"), buf); + + /* abort message filters that didn't get the body & log msg is OK */ + if (smtp->sm_milterlist && smtp->sm_milterize) + { + milter_abort(e); + if (milteraccept && MilterLogLevel > 9) + sm_syslog(LOG_INFO, e->e_id, "Milter accept: message"); + } + + /* + ** If SuperSafe is SAFE_REALLY_POSTMILTER, and we don't have milter or + ** milter accepted message, sync it now + ** + ** XXX This is almost a copy of the code in collect(): put it into + ** a function that is called from both places? + */ + + if (milteraccept && SuperSafe == SAFE_REALLY_POSTMILTER) + { + int afd; + SM_FILE_T *volatile df; + char *dfname; + + df = e->e_dfp; + dfname = queuename(e, DATAFL_LETTER); + if (sm_io_setinfo(df, SM_BF_COMMIT, NULL) < 0 + && errno != EINVAL) + { + int save_errno; + + save_errno = errno; + if (save_errno == EEXIST) + { + struct stat st; + int dfd; + + if (stat(dfname, &st) < 0) + st.st_size = -1; + errno = EEXIST; + syserr("@collect: bfcommit(%s): already on disk, size=%ld", + dfname, (long) st.st_size); + dfd = sm_io_getinfo(df, SM_IO_WHAT_FD, NULL); + if (dfd >= 0) + dumpfd(dfd, true, true); + } + errno = save_errno; + dferror(df, "bfcommit", e); + flush_errors(true); + finis(save_errno != EEXIST, true, ExitStat); + } + else if ((afd = sm_io_getinfo(df, SM_IO_WHAT_FD, NULL)) < 0) + { + dferror(df, "sm_io_getinfo", e); + flush_errors(true); + finis(true, true, ExitStat); + /* NOTREACHED */ + } + else if (fsync(afd) < 0) + { + dferror(df, "fsync", e); + flush_errors(true); + finis(true, true, ExitStat); + /* NOTREACHED */ + } + else if (sm_io_close(df, SM_TIME_DEFAULT) < 0) + { + dferror(df, "sm_io_close", e); + flush_errors(true); + finis(true, true, ExitStat); + /* NOTREACHED */ + } + + /* Now reopen the df file */ + e->e_dfp = sm_io_open(SmFtStdio, SM_TIME_DEFAULT, dfname, + SM_IO_RDONLY, NULL); + if (e->e_dfp == NULL) + { + /* we haven't acked receipt yet, so just chuck this */ + syserr("@Cannot reopen %s", dfname); + finis(true, true, ExitStat); + /* NOTREACHED */ + } + } +#endif /* MILTER */ + + /* Check if quarantining stats should be updated */ + if (e->e_quarmsg != NULL) + markstats(e, NULL, STATS_QUARANTINE); + + /* + ** If a header/body check (header checks or milter) + ** set EF_DISCARD, don't queueup the message -- + ** that would lose the EF_DISCARD bit and deliver + ** the message. + */ + + if (bitset(EF_DISCARD, e->e_flags)) + doublequeue = false; + + aborting = Errors > 0; + if (!(aborting || bitset(EF_DISCARD, e->e_flags)) && + (QueueMode == QM_QUARANTINE || e->e_quarmsg == NULL) && + !split_by_recipient(e)) + aborting = bitset(EF_FATALERRS, e->e_flags); + + if (aborting) + { + /* Log who the mail would have gone to */ + logundelrcpts(e, e->e_message, 8, false); + flush_errors(true); + buffer_errors(); + goto abortmessage; + } + + /* from now on, we have to operate silently */ + buffer_errors(); + +#if 0 + /* + ** Clear message, it may contain an error from the SMTP dialogue. + ** This error must not show up in the queue. + ** Some error message should show up, e.g., alias database + ** not available, but others shouldn't, e.g., from check_rcpt. + */ + + e->e_message = NULL; +#endif /* 0 */ + + /* + ** Arrange to send to everyone. + ** If sending to multiple people, mail back + ** errors rather than reporting directly. + ** In any case, don't mail back errors for + ** anything that has happened up to + ** now (the other end will do this). + ** Truncate our transcript -- the mail has gotten + ** to us successfully, and if we have + ** to mail this back, it will be easier + ** on the reader. + ** Then send to everyone. + ** Finally give a reply code. If an error has + ** already been given, don't mail a + ** message back. + ** We goose error returns by clearing error bit. + */ + + SmtpPhase = "delivery"; + (void) sm_io_setinfo(e->e_xfp, SM_BF_TRUNCATE, NULL); + id = e->e_id; + +#if NAMED_BIND + _res.retry = TimeOuts.res_retry[RES_TO_FIRST]; + _res.retrans = TimeOuts.res_retrans[RES_TO_FIRST]; +#endif /* NAMED_BIND */ + + for (ee = e; ee != NULL; ee = ee->e_sibling) + { + /* make sure we actually do delivery */ + ee->e_flags &= ~EF_CLRQUEUE; + + /* from now on, operate silently */ + ee->e_errormode = EM_MAIL; + + if (doublequeue) + { + /* make sure it is in the queue */ + queueup(ee, false, true); + } + else + { + /* send to all recipients */ + sendall(ee, SM_DEFAULT); + } + ee->e_to = NULL; + } + + /* put back id for SMTP logging in putoutmsg() */ + oldid = CurEnv->e_id; + CurEnv->e_id = id; + + /* issue success message */ + message("250 2.0.0 %s Message accepted for delivery", id); + CurEnv->e_id = oldid; + + /* if we just queued, poke it */ + if (doublequeue) + { + bool anything_to_send = false; + + sm_getla(); + for (ee = e; ee != NULL; ee = ee->e_sibling) + { + if (WILL_BE_QUEUED(ee->e_sendmode)) + continue; + if (shouldqueue(ee->e_msgpriority, ee->e_ctime)) + { + ee->e_sendmode = SM_QUEUE; + continue; + } + else if (QueueMode != QM_QUARANTINE && + ee->e_quarmsg != NULL) + { + ee->e_sendmode = SM_QUEUE; + continue; + } + anything_to_send = true; + + /* close all the queue files */ + closexscript(ee); + if (ee->e_dfp != NULL) + { + (void) sm_io_close(ee->e_dfp, SM_TIME_DEFAULT); + ee->e_dfp = NULL; + } + unlockqueue(ee); + } + if (anything_to_send) + { +#if PIPELINING + /* + ** XXX if we don't do this, we get 250 twice + ** because it is also flushed in the child. + */ + + (void) sm_io_flush(OutChannel, SM_TIME_DEFAULT); +#endif /* PIPELINING */ + (void) doworklist(e, true, true); + } + } + + abortmessage: + if (LogLevel > 4 && bitset(EF_LOGSENDER, e->e_flags)) + logsender(e, NULL); + e->e_flags &= ~EF_LOGSENDER; + + /* clean up a bit */ + smtp->sm_gotmail = false; + + /* + ** Call dropenvelope if and only if the envelope is *not* + ** being processed by the child process forked by doworklist(). + */ + + if (aborting || bitset(EF_DISCARD, e->e_flags)) + dropenvelope(e, true, false); + else + { + for (ee = e; ee != NULL; ee = ee->e_sibling) + { + if (!doublequeue && + QueueMode != QM_QUARANTINE && + ee->e_quarmsg != NULL) + { + dropenvelope(ee, true, false); + continue; + } + if (WILL_BE_QUEUED(ee->e_sendmode)) + dropenvelope(ee, true, false); + } + } + sm_rpool_free(e->e_rpool); + + /* + ** At this point, e == &MainEnvelope, but if we did splitting, + ** then CurEnv may point to an envelope structure that was just + ** freed with the rpool. So reset CurEnv *before* calling + ** newenvelope. + */ + + CurEnv = e; + newenvelope(e, e, sm_rpool_new_x(NULL)); + e->e_flags = BlankEnvelope.e_flags; + + /* restore connection quarantining */ + if (smtp->sm_quarmsg == NULL) + { + e->e_quarmsg = NULL; + macdefine(&e->e_macro, A_PERM, macid("{quarantine}"), ""); + } + else + { + e->e_quarmsg = sm_rpool_strdup_x(e->e_rpool, smtp->sm_quarmsg); + macdefine(&e->e_macro, A_PERM, + macid("{quarantine}"), e->e_quarmsg); + } + return true; +} +/* +** LOGUNDELRCPTS -- log undelivered (or all) recipients. +** +** Parameters: +** e -- envelope. +** msg -- message for Stat= +** level -- log level. +** all -- log all recipients. +** +** Returns: +** none. +** +** Side Effects: +** logs undelivered (or all) recipients +*/ + +void +logundelrcpts(e, msg, level, all) + ENVELOPE *e; + char *msg; + int level; + bool all; +{ + ADDRESS *a; + + if (LogLevel <= level || msg == NULL || *msg == '\0') + return; + + /* Clear $h so relay= doesn't get mislogged by logdelivery() */ + macdefine(&e->e_macro, A_PERM, 'h', NULL); + + /* Log who the mail would have gone to */ + for (a = e->e_sendqueue; a != NULL; a = a->q_next) + { + if (!QS_IS_UNDELIVERED(a->q_state) && !all) + continue; + e->e_to = a->q_paddr; + logdelivery(NULL, NULL, a->q_status, msg, NULL, + (time_t) 0, e); + } + e->e_to = NULL; +} +/* +** CHECKSMTPATTACK -- check for denial-of-service attack by repetition +** +** Parameters: +** pcounter -- pointer to a counter for this command. +** maxcount -- maximum value for this counter before we +** slow down. +** waitnow -- sleep now (in this routine)? +** cname -- command name for logging. +** e -- the current envelope. +** +** Returns: +** time to wait, +** STOP_ATTACK if twice as many commands as allowed and +** MaxChildren > 0. +** +** Side Effects: +** Slows down if we seem to be under attack. +*/ + +static time_t +checksmtpattack(pcounter, maxcount, waitnow, cname, e) + volatile unsigned int *pcounter; + unsigned int maxcount; + bool waitnow; + char *cname; + ENVELOPE *e; +{ + if (maxcount <= 0) /* no limit */ + return (time_t) 0; + + if (++(*pcounter) >= maxcount) + { + unsigned int shift; + time_t s; + + if (*pcounter == maxcount && LogLevel > 5) + { + sm_syslog(LOG_INFO, e->e_id, + "%s: possible SMTP attack: command=%.40s, count=%u", + CurSmtpClient, cname, *pcounter); + } + shift = *pcounter - maxcount; + s = 1 << shift; + if (shift > MAXSHIFT || s >= MAXTIMEOUT || s <= 0) + s = MAXTIMEOUT; + +#define IS_ATTACK(s) ((MaxChildren > 0 && *pcounter >= maxcount * 2) \ + ? STOP_ATTACK : (time_t) s) + + /* sleep at least 1 second before returning */ + (void) sleep(*pcounter / maxcount); + s -= *pcounter / maxcount; + if (s >= MAXTIMEOUT || s < 0) + s = MAXTIMEOUT; + if (waitnow && s > 0) + { + (void) sleep(s); + return IS_ATTACK(0); + } + return IS_ATTACK(s); + } + return (time_t) 0; +} +/* +** SETUP_SMTPD_IO -- setup I/O fd correctly for the SMTP server +** +** Parameters: +** none. +** +** Returns: +** nothing. +** +** Side Effects: +** may change I/O fd. +*/ + +static void +setup_smtpd_io() +{ + int inchfd, outchfd, outfd; + + inchfd = sm_io_getinfo(InChannel, SM_IO_WHAT_FD, NULL); + outchfd = sm_io_getinfo(OutChannel, SM_IO_WHAT_FD, NULL); + outfd = sm_io_getinfo(smioout, SM_IO_WHAT_FD, NULL); + if (outchfd != outfd) + { + /* arrange for debugging output to go to remote host */ + (void) dup2(outchfd, outfd); + } + + /* + ** if InChannel and OutChannel are stdin/stdout + ** and connected to ttys + ** and fcntl(STDIN, F_SETFL, O_NONBLOCKING) also changes STDOUT, + ** then "chain" them together. + */ + + if (inchfd == STDIN_FILENO && outchfd == STDOUT_FILENO && + isatty(inchfd) && isatty(outchfd)) + { + int inmode, outmode; + + inmode = fcntl(inchfd, F_GETFL, 0); + if (inmode == -1) + { + if (LogLevel > 11) + sm_syslog(LOG_INFO, NOQID, + "fcntl(inchfd, F_GETFL) failed: %s", + sm_errstring(errno)); + return; + } + outmode = fcntl(outchfd, F_GETFL, 0); + if (outmode == -1) + { + if (LogLevel > 11) + sm_syslog(LOG_INFO, NOQID, + "fcntl(outchfd, F_GETFL) failed: %s", + sm_errstring(errno)); + return; + } + if (bitset(O_NONBLOCK, inmode) || + bitset(O_NONBLOCK, outmode) || + fcntl(inchfd, F_SETFL, inmode | O_NONBLOCK) == -1) + return; + outmode = fcntl(outchfd, F_GETFL, 0); + if (outmode != -1 && bitset(O_NONBLOCK, outmode)) + { + /* changing InChannel also changes OutChannel */ + sm_io_automode(OutChannel, InChannel); + if (tTd(97, 4) && LogLevel > 9) + sm_syslog(LOG_INFO, NOQID, + "set automode for I (%d)/O (%d) in SMTP server", + inchfd, outchfd); + } + + /* undo change of inchfd */ + (void) fcntl(inchfd, F_SETFL, inmode); + } +} +/* +** SKIPWORD -- skip a fixed word. +** +** Parameters: +** p -- place to start looking. +** w -- word to skip. +** +** Returns: +** p following w. +** NULL on error. +** +** Side Effects: +** clobbers the p data area. +*/ + +static char * +skipword(p, w) + register char *volatile p; + char *w; +{ + register char *q; + char *firstp = p; + + /* find beginning of word */ + SKIP_SPACE(p); + q = p; + + /* find end of word */ + while (*p != '\0' && *p != ':' && !(isascii(*p) && isspace(*p))) + p++; + while (isascii(*p) && isspace(*p)) + *p++ = '\0'; + if (*p != ':') + { + syntax: + usrerr("501 5.5.2 Syntax error in parameters scanning \"%s\"", + shortenstring(firstp, MAXSHORTSTR)); + return NULL; + } + *p++ = '\0'; + SKIP_SPACE(p); + + if (*p == '\0') + goto syntax; + + /* see if the input word matches desired word */ + if (sm_strcasecmp(q, w)) + goto syntax; + + return p; +} +/* +** MAIL_ESMTP_ARGS -- process ESMTP arguments from MAIL line +** +** Parameters: +** kp -- the parameter key. +** vp -- the value of that parameter. +** e -- the envelope. +** +** Returns: +** none. +*/ + +static void +mail_esmtp_args(kp, vp, e) + char *kp; + char *vp; + ENVELOPE *e; +{ + if (sm_strcasecmp(kp, "size") == 0) + { + if (vp == NULL) + { + usrerr("501 5.5.2 SIZE requires a value"); + /* NOTREACHED */ + } + macdefine(&e->e_macro, A_TEMP, macid("{msg_size}"), vp); + errno = 0; + e->e_msgsize = strtol(vp, (char **) NULL, 10); + if (e->e_msgsize == LONG_MAX && errno == ERANGE) + { + usrerr("552 5.2.3 Message size exceeds maximum value"); + /* NOTREACHED */ + } + if (e->e_msgsize < 0) + { + usrerr("552 5.2.3 Message size invalid"); + /* NOTREACHED */ + } + } + else if (sm_strcasecmp(kp, "body") == 0) + { + if (vp == NULL) + { + usrerr("501 5.5.2 BODY requires a value"); + /* NOTREACHED */ + } + else if (sm_strcasecmp(vp, "8bitmime") == 0) + { + SevenBitInput = false; + } + else if (sm_strcasecmp(vp, "7bit") == 0) + { + SevenBitInput = true; + } + else + { + usrerr("501 5.5.4 Unknown BODY type %s", vp); + /* NOTREACHED */ + } + e->e_bodytype = sm_rpool_strdup_x(e->e_rpool, vp); + } + else if (sm_strcasecmp(kp, "envid") == 0) + { + if (bitset(PRIV_NORECEIPTS, PrivacyFlags)) + { + usrerr("504 5.7.0 Sorry, ENVID not supported, we do not allow DSN"); + /* NOTREACHED */ + } + if (vp == NULL) + { + usrerr("501 5.5.2 ENVID requires a value"); + /* NOTREACHED */ + } + if (!xtextok(vp)) + { + usrerr("501 5.5.4 Syntax error in ENVID parameter value"); + /* NOTREACHED */ + } + if (e->e_envid != NULL) + { + usrerr("501 5.5.0 Duplicate ENVID parameter"); + /* NOTREACHED */ + } + e->e_envid = sm_rpool_strdup_x(e->e_rpool, vp); + macdefine(&e->e_macro, A_PERM, + macid("{dsn_envid}"), e->e_envid); + } + else if (sm_strcasecmp(kp, "ret") == 0) + { + if (bitset(PRIV_NORECEIPTS, PrivacyFlags)) + { + usrerr("504 5.7.0 Sorry, RET not supported, we do not allow DSN"); + /* NOTREACHED */ + } + if (vp == NULL) + { + usrerr("501 5.5.2 RET requires a value"); + /* NOTREACHED */ + } + if (bitset(EF_RET_PARAM, e->e_flags)) + { + usrerr("501 5.5.0 Duplicate RET parameter"); + /* NOTREACHED */ + } + e->e_flags |= EF_RET_PARAM; + if (sm_strcasecmp(vp, "hdrs") == 0) + e->e_flags |= EF_NO_BODY_RETN; + else if (sm_strcasecmp(vp, "full") != 0) + { + usrerr("501 5.5.2 Bad argument \"%s\" to RET", vp); + /* NOTREACHED */ + } + macdefine(&e->e_macro, A_TEMP, macid("{dsn_ret}"), vp); + } +#if SASL + else if (sm_strcasecmp(kp, "auth") == 0) + { + int len; + char *q; + char *auth_param; /* the value of the AUTH=x */ + bool saveQuickAbort = QuickAbort; + bool saveSuprErrs = SuprErrs; + bool saveExitStat = ExitStat; + + if (vp == NULL) + { + usrerr("501 5.5.2 AUTH= requires a value"); + /* NOTREACHED */ + } + if (e->e_auth_param != NULL) + { + usrerr("501 5.5.0 Duplicate AUTH parameter"); + /* NOTREACHED */ + } + if ((q = strchr(vp, ' ')) != NULL) + len = q - vp + 1; + else + len = strlen(vp) + 1; + auth_param = xalloc(len); + (void) sm_strlcpy(auth_param, vp, len); + if (!xtextok(auth_param)) + { + usrerr("501 5.5.4 Syntax error in AUTH parameter value"); + /* just a warning? */ + /* NOTREACHED */ + } + + /* XXX define this always or only if trusted? */ + macdefine(&e->e_macro, A_TEMP, macid("{auth_author}"), + auth_param); + + /* + ** call Strust_auth to find out whether + ** auth_param is acceptable (trusted) + ** we shouldn't trust it if not authenticated + ** (required by RFC, leave it to ruleset?) + */ + + SuprErrs = true; + QuickAbort = false; + if (strcmp(auth_param, "<>") != 0 && + (rscheck("trust_auth", auth_param, NULL, e, RSF_RMCOMM, + 9, NULL, NOQID) != EX_OK || Errors > 0)) + { + if (tTd(95, 8)) + { + q = e->e_auth_param; + sm_dprintf("auth=\"%.100s\" not trusted user=\"%.100s\"\n", + auth_param, (q == NULL) ? "" : q); + } + + /* not trusted */ + e->e_auth_param = "<>"; +# if _FFR_AUTH_PASSING + macdefine(&BlankEnvelope.e_macro, A_PERM, + macid("{auth_author}"), NULL); +# endif /* _FFR_AUTH_PASSING */ + } + else + { + if (tTd(95, 8)) + sm_dprintf("auth=\"%.100s\" trusted\n", auth_param); + e->e_auth_param = sm_rpool_strdup_x(e->e_rpool, + auth_param); + } + sm_free(auth_param); /* XXX */ + + /* reset values */ + Errors = 0; + QuickAbort = saveQuickAbort; + SuprErrs = saveSuprErrs; + ExitStat = saveExitStat; + } +#endif /* SASL */ +#define PRTCHAR(c) ((isascii(c) && isprint(c)) ? (c) : '?') + + /* + ** "by" is only accepted if DeliverByMin >= 0. + ** We maybe could add this to the list of server_features. + */ + + else if (sm_strcasecmp(kp, "by") == 0 && DeliverByMin >= 0) + { + char *s; + + if (vp == NULL) + { + usrerr("501 5.5.2 BY= requires a value"); + /* NOTREACHED */ + } + errno = 0; + e->e_deliver_by = strtol(vp, &s, 10); + if (e->e_deliver_by == LONG_MIN || + e->e_deliver_by == LONG_MAX || + e->e_deliver_by > 999999999l || + e->e_deliver_by < -999999999l) + { + usrerr("501 5.5.2 BY=%s out of range", vp); + /* NOTREACHED */ + } + if (s == NULL || *s != ';') + { + usrerr("501 5.5.2 BY= missing ';'"); + /* NOTREACHED */ + } + e->e_dlvr_flag = 0; + ++s; /* XXX: spaces allowed? */ + SKIP_SPACE(s); + switch (tolower(*s)) + { + case 'n': + e->e_dlvr_flag = DLVR_NOTIFY; + break; + case 'r': + e->e_dlvr_flag = DLVR_RETURN; + if (e->e_deliver_by <= 0) + { + usrerr("501 5.5.4 mode R requires BY time > 0"); + /* NOTREACHED */ + } + if (DeliverByMin > 0 && e->e_deliver_by > 0 && + e->e_deliver_by < DeliverByMin) + { + usrerr("555 5.5.2 time %ld less than %ld", + e->e_deliver_by, (long) DeliverByMin); + /* NOTREACHED */ + } + break; + default: + usrerr("501 5.5.2 illegal by-mode '%c'", PRTCHAR(*s)); + /* NOTREACHED */ + } + ++s; /* XXX: spaces allowed? */ + SKIP_SPACE(s); + switch (tolower(*s)) + { + case 't': + e->e_dlvr_flag |= DLVR_TRACE; + break; + case '\0': + break; + default: + usrerr("501 5.5.2 illegal by-trace '%c'", PRTCHAR(*s)); + /* NOTREACHED */ + } + + /* XXX: check whether more characters follow? */ + } + else + { + usrerr("555 5.5.4 %s parameter unrecognized", kp); + /* NOTREACHED */ + } +} +/* +** RCPT_ESMTP_ARGS -- process ESMTP arguments from RCPT line +** +** Parameters: +** a -- the address corresponding to the To: parameter. +** kp -- the parameter key. +** vp -- the value of that parameter. +** e -- the envelope. +** +** Returns: +** none. +*/ + +static void +rcpt_esmtp_args(a, kp, vp, e) + ADDRESS *a; + char *kp; + char *vp; + ENVELOPE *e; +{ + if (sm_strcasecmp(kp, "notify") == 0) + { + char *p; + + if (bitset(PRIV_NORECEIPTS, PrivacyFlags)) + { + usrerr("504 5.7.0 Sorry, NOTIFY not supported, we do not allow DSN"); + /* NOTREACHED */ + } + if (vp == NULL) + { + usrerr("501 5.5.2 NOTIFY requires a value"); + /* NOTREACHED */ + } + a->q_flags &= ~(QPINGONSUCCESS|QPINGONFAILURE|QPINGONDELAY); + a->q_flags |= QHASNOTIFY; + macdefine(&e->e_macro, A_TEMP, macid("{dsn_notify}"), vp); + + if (sm_strcasecmp(vp, "never") == 0) + return; + for (p = vp; p != NULL; vp = p) + { + p = strchr(p, ','); + if (p != NULL) + *p++ = '\0'; + if (sm_strcasecmp(vp, "success") == 0) + a->q_flags |= QPINGONSUCCESS; + else if (sm_strcasecmp(vp, "failure") == 0) + a->q_flags |= QPINGONFAILURE; + else if (sm_strcasecmp(vp, "delay") == 0) + a->q_flags |= QPINGONDELAY; + else + { + usrerr("501 5.5.4 Bad argument \"%s\" to NOTIFY", + vp); + /* NOTREACHED */ + } + } + } + else if (sm_strcasecmp(kp, "orcpt") == 0) + { + if (bitset(PRIV_NORECEIPTS, PrivacyFlags)) + { + usrerr("504 5.7.0 Sorry, ORCPT not supported, we do not allow DSN"); + /* NOTREACHED */ + } + if (vp == NULL) + { + usrerr("501 5.5.2 ORCPT requires a value"); + /* NOTREACHED */ + } + if (strchr(vp, ';') == NULL || !xtextok(vp)) + { + usrerr("501 5.5.4 Syntax error in ORCPT parameter value"); + /* NOTREACHED */ + } + if (a->q_orcpt != NULL) + { + usrerr("501 5.5.0 Duplicate ORCPT parameter"); + /* NOTREACHED */ + } + a->q_orcpt = sm_rpool_strdup_x(e->e_rpool, vp); + } + else + { + usrerr("555 5.5.4 %s parameter unrecognized", kp); + /* NOTREACHED */ + } +} +/* +** PRINTVRFYADDR -- print an entry in the verify queue +** +** Parameters: +** a -- the address to print. +** last -- set if this is the last one. +** vrfy -- set if this is a VRFY command. +** +** Returns: +** none. +** +** Side Effects: +** Prints the appropriate 250 codes. +*/ +#define OFFF (3 + 1 + 5 + 1) /* offset in fmt: SMTP reply + enh. code */ + +static void +printvrfyaddr(a, last, vrfy) + register ADDRESS *a; + bool last; + bool vrfy; +{ + char fmtbuf[30]; + + if (vrfy && a->q_mailer != NULL && + !bitnset(M_VRFY250, a->q_mailer->m_flags)) + (void) sm_strlcpy(fmtbuf, "252", sizeof fmtbuf); + else + (void) sm_strlcpy(fmtbuf, "250", sizeof fmtbuf); + fmtbuf[3] = last ? ' ' : '-'; + (void) sm_strlcpy(&fmtbuf[4], "2.1.5 ", sizeof fmtbuf - 4); + if (a->q_fullname == NULL) + { + if ((a->q_mailer == NULL || + a->q_mailer->m_addrtype == NULL || + sm_strcasecmp(a->q_mailer->m_addrtype, "rfc822") == 0) && + strchr(a->q_user, '@') == NULL) + (void) sm_strlcpy(&fmtbuf[OFFF], "<%s@%s>", + sizeof fmtbuf - OFFF); + else + (void) sm_strlcpy(&fmtbuf[OFFF], "<%s>", + sizeof fmtbuf - OFFF); + message(fmtbuf, a->q_user, MyHostName); + } + else + { + if ((a->q_mailer == NULL || + a->q_mailer->m_addrtype == NULL || + sm_strcasecmp(a->q_mailer->m_addrtype, "rfc822") == 0) && + strchr(a->q_user, '@') == NULL) + (void) sm_strlcpy(&fmtbuf[OFFF], "%s <%s@%s>", + sizeof fmtbuf - OFFF); + else + (void) sm_strlcpy(&fmtbuf[OFFF], "%s <%s>", + sizeof fmtbuf - OFFF); + message(fmtbuf, a->q_fullname, a->q_user, MyHostName); + } +} + +#if SASL +/* +** SASLMECHS -- get list of possible AUTH mechanisms +** +** Parameters: +** conn -- SASL connection info. +** mechlist -- output parameter for list of mechanisms. +** +** Returns: +** number of mechs. +*/ + +static int +saslmechs(conn, mechlist) + sasl_conn_t *conn; + char **mechlist; +{ + int len, num, result; + + /* "user" is currently unused */ +# if SASL >= 20000 + result = sasl_listmech(conn, NULL, + "", " ", "", (const char **) mechlist, + (unsigned int *)&len, &num); +# else /* SASL >= 20000 */ + result = sasl_listmech(conn, "user", /* XXX */ + "", " ", "", mechlist, + (unsigned int *)&len, (unsigned int *)&num); +# endif /* SASL >= 20000 */ + if (result != SASL_OK) + { + if (LogLevel > 9) + sm_syslog(LOG_WARNING, NOQID, + "AUTH error: listmech=%d, num=%d", + result, num); + num = 0; + } + if (num > 0) + { + if (LogLevel > 11) + sm_syslog(LOG_INFO, NOQID, + "AUTH: available mech=%s, allowed mech=%s", + *mechlist, AuthMechanisms); + *mechlist = intersect(AuthMechanisms, *mechlist, NULL); + } + else + { + *mechlist = NULL; /* be paranoid... */ + if (result == SASL_OK && LogLevel > 9) + sm_syslog(LOG_WARNING, NOQID, + "AUTH warning: no mechanisms"); + } + return num; +} + +# if SASL >= 20000 +/* +** PROXY_POLICY -- define proxy policy for AUTH +** +** Parameters: +** conn -- unused. +** context -- unused. +** requested_user -- authorization identity. +** rlen -- authorization identity length. +** auth_identity -- authentication identity. +** alen -- authentication identity length. +** def_realm -- default user realm. +** urlen -- user realm length. +** propctx -- unused. +** +** Returns: +** ok? +** +** Side Effects: +** sets {auth_authen} macro. +*/ + +int +proxy_policy(conn, context, requested_user, rlen, auth_identity, alen, + def_realm, urlen, propctx) + sasl_conn_t *conn; + void *context; + const char *requested_user; + unsigned rlen; + const char *auth_identity; + unsigned alen; + const char *def_realm; + unsigned urlen; + struct propctx *propctx; +{ + if (auth_identity == NULL) + return SASL_FAIL; + + macdefine(&BlankEnvelope.e_macro, A_TEMP, + macid("{auth_authen}"), (char *) auth_identity); + + return SASL_OK; +} +# else /* SASL >= 20000 */ + +/* +** PROXY_POLICY -- define proxy policy for AUTH +** +** Parameters: +** context -- unused. +** auth_identity -- authentication identity. +** requested_user -- authorization identity. +** user -- allowed user (output). +** errstr -- possible error string (output). +** +** Returns: +** ok? +*/ + +int +proxy_policy(context, auth_identity, requested_user, user, errstr) + void *context; + const char *auth_identity; + const char *requested_user; + const char **user; + const char **errstr; +{ + if (user == NULL || auth_identity == NULL) + return SASL_FAIL; + *user = newstr(auth_identity); + return SASL_OK; +} +# endif /* SASL >= 20000 */ +#endif /* SASL */ + +#if STARTTLS +/* +** INITSRVTLS -- initialize server side TLS +** +** Parameters: +** tls_ok -- should tls initialization be done? +** +** Returns: +** succeeded? +** +** Side Effects: +** sets tls_ok_srv which is a static variable in this module. +** Do NOT remove assignments to it! +*/ + +bool +initsrvtls(tls_ok) + bool tls_ok; +{ + if (!tls_ok) + return false; + + /* do NOT remove assignment */ + tls_ok_srv = inittls(&srv_ctx, TLS_Srv_Opts, true, SrvCertFile, + SrvKeyFile, CACertPath, CACertFile, DHParams); + return tls_ok_srv; +} +#endif /* STARTTLS */ +/* +** SRVFEATURES -- get features for SMTP server +** +** Parameters: +** e -- envelope (should be session context). +** clientname -- name of client. +** features -- default features for this invocation. +** +** Returns: +** server features. +*/ + +/* table with options: it uses just one character, how about strings? */ +static struct +{ + char srvf_opt; + unsigned int srvf_flag; +} srv_feat_table[] = +{ + { 'A', SRV_OFFER_AUTH }, + { 'B', SRV_OFFER_VERB }, + { 'C', SRV_REQ_SEC }, + { 'D', SRV_OFFER_DSN }, + { 'E', SRV_OFFER_ETRN }, + { 'L', SRV_REQ_AUTH }, +#if PIPELINING +# if _FFR_NO_PIPE + { 'N', SRV_NO_PIPE }, +# endif /* _FFR_NO_PIPE */ + { 'P', SRV_OFFER_PIPE }, +#endif /* PIPELINING */ + { 'R', SRV_VRFY_CLT }, /* same as V; not documented */ + { 'S', SRV_OFFER_TLS }, +/* { 'T', SRV_TMP_FAIL }, */ + { 'V', SRV_VRFY_CLT }, + { 'X', SRV_OFFER_EXPN }, +/* { 'Y', SRV_OFFER_VRFY }, */ + { '\0', SRV_NONE } +}; + +static unsigned int +srvfeatures(e, clientname, features) + ENVELOPE *e; + char *clientname; + unsigned int features; +{ + int r, i, j; + char **pvp, c, opt; + char pvpbuf[PSBUFSIZE]; + + pvp = NULL; + r = rscap("srv_features", clientname, "", e, &pvp, pvpbuf, + sizeof(pvpbuf)); + if (r != EX_OK) + return features; + if (pvp == NULL || pvp[0] == NULL || (pvp[0][0] & 0377) != CANONNET) + return features; + if (pvp[1] != NULL && sm_strncasecmp(pvp[1], "temp", 4) == 0) + return SRV_TMP_FAIL; + + /* + ** General rule (see sendmail.h, d_flags): + ** lower case: required/offered, upper case: Not required/available + ** + ** Since we can change some features per daemon, we have both + ** cases here: turn on/off a feature. + */ + + for (i = 1; pvp[i] != NULL; i++) + { + c = pvp[i][0]; + j = 0; + for (;;) + { + if ((opt = srv_feat_table[j].srvf_opt) == '\0') + { + if (LogLevel > 9) + sm_syslog(LOG_WARNING, e->e_id, + "srvfeatures: unknown feature %s", + pvp[i]); + break; + } + if (c == opt) + { + features &= ~(srv_feat_table[j].srvf_flag); + break; + } + if (c == tolower(opt)) + { + features |= srv_feat_table[j].srvf_flag; + break; + } + ++j; + } + } + return features; +} + +/* +** HELP -- implement the HELP command. +** +** Parameters: +** topic -- the topic we want help for. +** e -- envelope. +** +** Returns: +** none. +** +** Side Effects: +** outputs the help file to message output. +*/ +#define HELPVSTR "#vers " +#define HELPVERSION 2 + +void +help(topic, e) + char *topic; + ENVELOPE *e; +{ + register SM_FILE_T *hf; + register char *p; + int len; + bool noinfo; + bool first = true; + long sff = SFF_OPENASROOT|SFF_REGONLY; + char buf[MAXLINE]; + char inp[MAXLINE]; + static int foundvers = -1; + extern char Version[]; + + if (DontLockReadFiles) + sff |= SFF_NOLOCK; + if (!bitnset(DBS_HELPFILEINUNSAFEDIRPATH, DontBlameSendmail)) + sff |= SFF_SAFEDIRPATH; + + if (HelpFile == NULL || + (hf = safefopen(HelpFile, O_RDONLY, 0444, sff)) == NULL) + { + /* no help */ + errno = 0; + message("502 5.3.0 Sendmail %s -- HELP not implemented", + Version); + return; + } + + if (topic == NULL || *topic == '\0') + { + topic = "smtp"; + noinfo = false; + } + else + { + makelower(topic); + noinfo = true; + } + + len = strlen(topic); + + while (sm_io_fgets(hf, SM_TIME_DEFAULT, buf, sizeof buf) != NULL) + { + if (buf[0] == '#') + { + if (foundvers < 0 && + strncmp(buf, HELPVSTR, strlen(HELPVSTR)) == 0) + { + int h; + + if (sm_io_sscanf(buf + strlen(HELPVSTR), "%d", + &h) == 1) + foundvers = h; + } + continue; + } + if (strncmp(buf, topic, len) == 0) + { + if (first) + { + first = false; + + /* print version if no/old vers# in file */ + if (foundvers < 2 && !noinfo) + message("214-2.0.0 This is Sendmail version %s", Version); + } + p = strpbrk(buf, " \t"); + if (p == NULL) + p = buf + strlen(buf) - 1; + else + p++; + fixcrlf(p, true); + if (foundvers >= 2) + { + translate_dollars(p); + expand(p, inp, sizeof inp, e); + p = inp; + } + message("214-2.0.0 %s", p); + noinfo = false; + } + } + + if (noinfo) + message("504 5.3.0 HELP topic \"%.10s\" unknown", topic); + else + message("214 2.0.0 End of HELP info"); + + if (foundvers != 0 && foundvers < HELPVERSION) + { + if (LogLevel > 1) + sm_syslog(LOG_WARNING, e->e_id, + "%s too old (require version %d)", + HelpFile, HELPVERSION); + + /* avoid log next time */ + foundvers = 0; + } + + (void) sm_io_close(hf, SM_TIME_DEFAULT); +} + +#if SASL +/* +** RESET_SASLCONN -- reset SASL connection data +** +** Parameters: +** conn -- SASL connection context +** hostname -- host name +** various connection data +** +** Returns: +** SASL result +*/ + +static int +reset_saslconn(sasl_conn_t ** conn, char *hostname, +# if SASL >= 20000 + char *remoteip, char *localip, + char *auth_id, sasl_ssf_t * ext_ssf) +# else /* SASL >= 20000 */ + struct sockaddr_in * saddr_r, struct sockaddr_in * saddr_l, + sasl_external_properties_t * ext_ssf) +# endif /* SASL >= 20000 */ +{ + int result; + + sasl_dispose(conn); +# if SASL >= 20000 + result = sasl_server_new("smtp", hostname, NULL, NULL, NULL, + NULL, 0, conn); +# elif SASL > 10505 + /* use empty realm: only works in SASL > 1.5.5 */ + result = sasl_server_new("smtp", hostname, "", NULL, 0, conn); +# else /* SASL >= 20000 */ + /* use no realm -> realm is set to hostname by SASL lib */ + result = sasl_server_new("smtp", hostname, NULL, NULL, 0, + conn); +# endif /* SASL >= 20000 */ + if (result != SASL_OK) + return result; + +# if SASL >= 20000 +# if NETINET || NETINET6 + if (remoteip != NULL) + result = sasl_setprop(*conn, SASL_IPREMOTEPORT, remoteip); + if (result != SASL_OK) + return result; + + if (localip != NULL) + result = sasl_setprop(*conn, SASL_IPLOCALPORT, localip); + if (result != SASL_OK) + return result; +# endif /* NETINET || NETINET6 */ + + result = sasl_setprop(*conn, SASL_SSF_EXTERNAL, ext_ssf); + if (result != SASL_OK) + return result; + + result = sasl_setprop(*conn, SASL_AUTH_EXTERNAL, auth_id); + if (result != SASL_OK) + return result; +# else /* SASL >= 20000 */ +# if NETINET + if (saddr_r != NULL) + result = sasl_setprop(*conn, SASL_IP_REMOTE, saddr_r); + if (result != SASL_OK) + return result; + + if (saddr_l != NULL) + result = sasl_setprop(*conn, SASL_IP_LOCAL, saddr_l); + if (result != SASL_OK) + return result; +# endif /* NETINET */ + + result = sasl_setprop(*conn, SASL_SSF_EXTERNAL, ext_ssf); + if (result != SASL_OK) + return result; +# endif /* SASL >= 20000 */ + return SASL_OK; +} +#endif /* SASL */ diff --git a/debian/patches/8.13/srvrsmtp.patch b/debian/patches/8.13/srvrsmtp.patch new file mode 100644 index 0000000..419b4a3 --- /dev/null +++ b/debian/patches/8.13/srvrsmtp.patch @@ -0,0 +1,120 @@ +# +# To apply this patch: +# STEP 1: Chdir to the source directory. +# STEP 2: Run the 'applypatch' program with this patch file as input. +# +# If you do not have 'applypatch', it is part of the 'makepatch' package +# that you can fetch from the Comprehensive Perl Archive Network: +# http://www.perl.com/CPAN/authors/Johan_Vromans/makepatch-x.y.tar.gz +# In the above URL, 'x' should be 2 or higher. +# +# To apply this patch without the use of 'applypatch': +# STEP 1: Chdir to the source directory. +# STEP 2: Run the 'patch' program with this file as input. +# +#### End of Preamble #### + +#### Patch data follows #### +diff -c 'srvrsmtp.c.orig' 'srvrsmtp.c' +Index: ./srvrsmtp.c.orig +Prereq: 8.900 +*** ./srvrsmtp.c.orig Tue Aug 10 23:48:17 2004 +--- ./srvrsmtp.c Wed Aug 11 00:00:09 2004 +*************** +*** 444,449 **** +--- 444,451 ---- + char *volatile protocol; /* sending protocol */ + char *volatile sendinghost; /* sending hostname */ + char *volatile peerhostname; /* name of SMTP peer or "localhost" */ ++ char *volatile hello_name; /* client_hello string */ ++ bool hello_acceptd = false; /* helo/ehlo command accepted */ + auto char *delimptr; + char *id; + volatile unsigned int n_badcmds = 0; /* count of bad commands */ +*************** +*** 1976,1981 **** +--- 1978,1987 ---- + { + q = "pleased to meet you"; + sendinghost = sm_strdup_x(p); ++ hello_accept = true; ++ hello_name = sm_strdup_x(p); ++ macdefine(&e->e_macro, A_PERM, macid("{client_hello}"), ++ hello_name); + } + else if (!AllowBogusHELO) + { +*************** +*** 1989,1994 **** +--- 1995,2004 ---- + else + { + q = "accepting invalid domain name"; ++ hello_accept = true; ++ hello_name = sm_strdup_x(p); ++ macdefine(&e->e_macro, A_PERM, macid("{client_hello}"), ++ hello_name); + } + + if (gothello) +*************** +*** 1996,2001 **** +--- 2006,2028 ---- + CLEAR_STATE(cmdbuf); + } + ++ if (hello_accept) { ++ if (rscheck("check_hello", hello_name, ++ NULL, e, RSF_RMCOMM|RSF_COUNT, 3, ++ NULL, e->e_id) != EX_OK || ++ Errors > 0) ++ sm_exc_raisenew_x(&EtypeQuickAbort, 1); ++ ++ if (MaxMessageSize > 0 && ++ (e->e_msgsize > MaxMessageSize || ++ e->e_msgsize < 0)) ++ { ++ usrerr("552 5.2.3 Message size exceeds fixed maximum message size (%ld)", ++ MaxMessageSize); ++ sm_exc_raisenew_x(&EtypeQuickAbort, 1); ++ } ++ } ++ + #if MILTER + if (smtp.sm_milterlist && smtp.sm_milterize && + !bitset(EF_DISCARD, e->e_flags)) +#### End of Patch data #### + +#### ApplyPatch data follows #### +# Data version : 1.0 +# Date generated : Wed Aug 11 00:01:01 2004 +# Generated by : makepatch 2.00_07* +# Recurse directories : Yes +# Excluded files : (\A|/).*\~\Z +# (\A|/).*\.a\Z +# (\A|/).*\.bak\Z +# (\A|/).*\.BAK\Z +# (\A|/).*\.elc\Z +# (\A|/).*\.exe\Z +# (\A|/).*\.gz\Z +# (\A|/).*\.ln\Z +# (\A|/).*\.o\Z +# (\A|/).*\.obj\Z +# (\A|/).*\.olb\Z +# (\A|/).*\.old\Z +# (\A|/).*\.orig\Z +# (\A|/).*\.rej\Z +# (\A|/).*\.so\Z +# (\A|/).*\.Z\Z +# (\A|/)\.del\-.*\Z +# (\A|/)\.make\.state\Z +# (\A|/)\.nse_depinfo\Z +# (\A|/)core\Z +# (\A|/)tags\Z +# (\A|/)TAGS\Z +# p './srvrsmtp.c.orig' 111749 +#### End of ApplyPatch data #### + +#### End of Patch kit [created: Wed Aug 11 00:01:01 2004] #### +#### Patch checksum: 102 3167 7100 #### +#### Checksum: 119 3788 58534 #### diff --git a/debian/rmail.links b/debian/rmail.links new file mode 100644 index 0000000..01ebb97 --- /dev/null +++ b/debian/rmail.links @@ -0,0 +1 @@ +usr/share/bug/sendmail usr/share/bug/rmail diff --git a/debian/rules b/debian/rules index 4beba56..ccbfd7c 100755 --- a/debian/rules +++ b/debian/rules @@ -2,17 +2,17 @@ #------------------------------------------------------------------------------ # vim: syntax=make # -# $Sendmail: rules,v 8.12.3 2003-09-17 15:19:44 cowboy Exp $ +# $Sendmail: rules,v 8.12.10 2003-07-13 21:46:03 cowboy Exp $ # # Copyright (c) 1998-2003 Richard Nelson. All Rights Reserved. # -# ./rules. Generated from rules.in by configure. +# ./rules. Generated from rules.in by configure. # -# Rules file for Sendmail 8.12.3-6.5(527363) -# on Debian 3.0 -# via Debhelper V4 +# Rules file for Sendmail 8.12.10-6(527370) +# on Debian testing/unstable +# via Debhelper V4.1 # -# Note: the .in file supports Sendmail 8.7.6 - 8.12.7 +# Note: the .in file supports Sendmail 8.7.6 - 8.12.10 # on Debian slink, potato, woody, testing, sid, ... # but the generated file is customized to the version noted above. # @@ -24,6 +24,7 @@ # CC=gcc|gcc-3.0..........-- choose compiler # CFLAGS='-O2 -Wall [-g]'.-- choose compile options # DEFINES=''..............-- additional -Dxxx +# SM_CONF=''..............-- Site local customization # SM_CONF_OPT=''..........-- additional configure options # SM_BUILD_OPT=''.........-- additional build options # 2) Build the package using your normal setup: @@ -32,10 +33,26 @@ # C) dpkg-buildpackage -rfakeroot -uc -us # # DEB_BUILD_OPTIONS (global Debian package build options) -# Debian specific, and common across package options -# noopt - Do *NOT* compile with optimization (force -O0) -# nostrip - Do *NOT* strip binaries (for debugging) -# +# Debian specific, and common across package options +# noopt - Do *NOT* compile with optimization (force -O0) +# nostrip - Do *NOT* strip binaries (for debugging) +# +# SM_CONF +# A quick means to customize the Debian Sendmail package according +# to your sites guidelines ! +# 1) Choose a configuration name (ie FooBar) +# 2) cp debian/configure.options debian/FooBar.options +# 3) $(EDIT) debian/FooBar.options to taste +# 4) mkdir debian/FooBar.patches +# 5) add any local patches in that directory - following +# the style in debian/patches style (ie, 8.13/8.13.3 subdirectory) +# 6) cp debian/changelog debian/FooBar.changelog +# 7) $(EDIT) debian/FooBar.changelog, delete everything after the +# 1st null line (but leave that null!!!) +# 8) Update debian/FooBar.changelog to show your updates +# 9) SM_CONF="FooBar" debian/rules configure ** IMPORTANT *** +# 10) build the package (SM_CONF="FooBar" dpkg-buildpackage or debuild) +# # # SM_CONF_OPT # Additional configure options and/or overrides may be specified thusly: @@ -46,21 +63,19 @@ # etc... # # SM_BUILD_OPT -# 1) export SM_BUILD_OPT='notls' +# 1) export SM_BUILD_OPT='nodoc' # dpkg-buildpackage -rfakeroot -uc -us -# 2) SM_BUILD_OPT='notls' dpkg-buildpackage -rfakeroot -uc -us -# 3) debuild -e SM_BUILD_OPT='notls' -e CLFAGS='-O3 Wall' +# 2) SM_BUILD_OPT='nodoc' dpkg-buildpackage -rfakeroot -uc -us +# 3) debuild -e SM_BUILD_OPT='nodoc' -e CLFAGS='-O3 Wall' # etc... # # Supported options values for SM_BUILD_OPT: -# notls Disable STARTTLS (OpenSSL) support -# noauth Disable SMTP AUTH (sasl) support # nodev Disable generation of libmilter-dev package # nodoc Disable generation of sendmail-doc package # # This make file uses scripts from the DBS (0.8) package! # -# Richard Nelson <cowboy@debian.org> 2003-09-17 15:19:44 (+0000) +# Richard Nelson <cowboy@debian.org> 2004-11-16 16:17:00 (-0800) #------------------------------------------------------------------------------ #SHELL := /bin/sh -x @@ -75,11 +90,12 @@ export DH_OPTIONS # Support separate debian directory ifeq (yes, $(shell test -d debian && echo 'yes')) - debian_dir := debian + debian_dir := ./debian pwd_dir := ${PWD} else debian_dir := . pwd_dir := ${PWD}/.. + SM_CONF_OPT += --enable-maintainer-mode endif # Determine build,host architectures (via dpkg-architecture) @@ -102,13 +118,22 @@ ifeq (, $(findstring +,${pwd_string})) else pwd_version := $(shell expr "${pwd_string}" : '.*+\([0-9.].*\)') endif +ifneq (, $(findstring Final,${pwd_version})) + pwd_version := $(shell expr "${pwd_version}" : '\(.*\)\.Final') + endif pwd_major := $(shell expr "${pwd_version}" : '\([0-9]*\.[0-9]*\)') # get package/version information from the changelog -package := $(shell (cd ${debian_dir}/.. && \ +package := $(shell (cd ${debian_dir}/.. >/dev/null && \ dpkg-parsechangelog 2>/dev/null) | awk '/^Source:/ {print $$2}') -version_string := $(shell (cd ${debian_dir}/.. && \ +version_string := $(shell (cd ${debian_dir}/.. >/dev/null && \ dpkg-parsechangelog 2>/dev/null) | awk '/^Version:/ {print $$2}') +# Remove local site name from version string +ifneq (, ${SM_CONF}) +ifneq (, $(findstring ${SM_CONF}.,${version_string})) + version_string := $(shell expr "${version_string}" : "${SM_CONF}.\(.*\)") +endif +endif version_full := $(shell expr "${version_string}" : '\([^-]*\)') version_debian := $(shell expr "${version_string}" : '[^-]*\(-.*\)') version := ${version_full} @@ -126,15 +151,15 @@ ifneq (, $(findstring +,${version_minor})) endif # Many things depend upon which release (slink, potato, woody, etc.) -PKG_DIR := ${debian_dir}/${package} +PKG_DIR := ${debian_dir}/${package}-bin DATA_DIR := /usr/share -ifeq (v4, $(shell (cd ${debian_dir}/.. && dh_testversion 4.0.0 2>/dev/null && echo 'v4'))) +ifeq (v4, $(shell (cd ${debian_dir}/.. >/dev/null && dh_testversion 4.0.0 2>/dev/null && echo 'v4'))) DH_COMPAT := 4 else - ifeq (v3, $(shell (cd ${debian_dir}/.. && dh_testversion 3.0.0 2>/dev/null && echo 'v3'))) + ifeq (v3, $(shell (cd ${debian_dir}/.. >/dev/null && dh_testversion 3.0.0 2>/dev/null && echo 'v3'))) DH_COMPAT := 3 else - ifeq (v2, $(shell (cd ${debian_dir}/.. && dh_testversion 2.0.40 2>/dev/null && echo 'v2'))) + ifeq (v2, $(shell (cd ${debian_dir}/.. >/dev/null && dh_testversion 2.0.40 2>/dev/null && echo 'v2'))) DH_COMPAT := 2 else DH_COMPAT := 1 @@ -151,7 +176,7 @@ TAR_DIR := ${package}-${version} ifneq (yes, $(shell test -e ${debian_dir}/../${TAR_DIR}.tar.gz && echo 'yes')) TAR_DIR := ${package}-${pwd_version} endif -SOURCE_DIR := build-tree +SOURCE_DIR := build-tree BUILD_TREE := ${SOURCE_DIR}/${TAR_DIR} PATCH_DIR := ${debian_dir}/patches/${version_major}/${version} SCRIPT_DIR := ${debian_dir}/scripts @@ -166,22 +191,24 @@ else # these are strictly for my own consuption PKG_DOC := ${debian_dir}/${package}-doc${docdir}/${package}-doc -MAKE_SUBDIRS := examples local sensible_mda -PACKAGES := sendmail sendmail-doc libmilter-dev +PACKAGES := sendmail sendmail-base sendmail-cf sendmail-doc \ + libmilter-dev rmail sensible-mda SM_SUBDIRS := editmap libmilter mail.local mailstats \ makemap praliases rmail sendmail smrsh vacation # # We want delayed interpretation of the options ! ifeq (yes, $(shell test -x /usr/bin/debuild && echo 'yes')) DEB_BUILD = \ - SM_CONF_OPT="${SM_CONF_OPT}" \ SM_BUILD_OPT="${SM_BUILD_OPT}" \ + SM_CONF="${SM_CONF}" \ + SM_CONF_OPT="${SM_CONF_OPT}" \ DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS}" \ - debuild -e SM_CONF_OPT -e SM_BUILD_OPT + debuild -e SM_CONF -e SM_CONF_OPT -e SM_BUILD_OPT else DEB_BUILD = \ - SM_CONF_OPT="${SM_CONF_OPT}" \ SM_BUILD_OPT="${SM_BUILD_OPT}" \ + SM_CONF="${SM_CONF}" \ + SM_CONF_OPT="${SM_CONF_OPT}" \ DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS}" \ dpkg-buildpackage endif @@ -193,16 +220,6 @@ ENABLE_INDEP := yes ENABLE_ARCH := yes ENABLE_LIB := no ENABLE_BIN := yes -ifneq (, $(findstring notls,${SM_BUILD_OPT})) - ENABLE_TLS := no -else - ENABLE_TLS := yes - endif -ifneq (, $(findstring noauth,${SM_BUILD_OPT})) - ENABLE_AUTH := no -else - ENABLE_AUTH := yes - endif ifneq (, $(findstring nodev,${SM_BUILD_OPT})) ENABLE_DEV := no else @@ -224,92 +241,98 @@ ifeq (no, ${ENABLE_BIN}) endif endif +# Now that all that is out of the way, read the desired configuration +# settings +ifeq (, ${SM_CONF}) + CONF_NAME = ${debian_dir}/configure.options +else + ifneq (y, $(shell test -e debian/${SM_CONF}.options && echo 'y')) + CONF_NAME := $(error Create ${SM_CONF}.options from configure.options) + endif + ifneq (y, $(shell test -e debian/${SM_CONF}.changelog && echo 'y')) + CONF_NAME := $(error Create ${SM_CONF}.changelog from changelog) + endif + CONF_NAME = ${debian_dir}/${SM_CONF}.options + SM_CONF_OPT += --with-custom=${SM_CONF} +endif +$(eval CONFIG_OPTS := $(shell grep -v "^\#" ${CONF_NAME})) + all: @echo 'Please specify a real target in the future...'; $(MAKE) -f ${debian_dir}/rules \ version_string=${pwd_string} \ - SM_CONF_OPT="${SM_CONF_OPT}" SM_BUILD_OPT="${SM_BUILD_OPT}" \ + SM_BUILD_OPT="${SM_BUILD_OPT}" \ + SM_CONF="${SM_CONF}" \ + SM_CONF_OPT="${SM_CONF_OPT}" \ DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS}" \ - binary; + binary-all; #------------------------------------------------------------------------------ # Rules to maintain the external Debian directory #------------------------------------------------------------------------------ #------------- +.PHONY: refresh-dbs refresh-dbs: @echo 'updating debian/scripts directory...'; cp -af /usr/share/dbs/* ${SCRIPT_DIR}/; chmod a-w ${SCRIPT_DIR}/*; #------------- +.PHONY: refresh-debian refresh-debian: @dh_testdir; @echo 'updating debian directory ...'; sudo $(RM) -r debian; - cp -a ../debian ./; - sudo $(RM) -r ${SOURCE_DIR} ${STAMP_DIR}; - rm -f ${debian_dir}/config.status; - touch ${debian_dir}/rules; - $(MAKE) -f ${debian_dir}/rules \ - version_string=${pwd_string} \ - SM_CONF_OPT="${SM_CONF_OPT}" SM_BUILD_OPT="${SM_BUILD_OPT}" \ - DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS}" \ - debian-setup; - -debian-setup: + sudo cp -a ../debian ./; + sudo $(RM) -rf ${SOURCE_DIR} ${STAMP_DIR}; + # Remove some local configuration + $(RM) -r debian/CaveIn.changelog \ + debian/CaveIn.options \ + debian/CaveIn.patches; + # Make sure directories are writeable by the owner (mine aren't) + chmod -R ug+w debian; + -(cd ${debian_dir} && aclocal); + -(cd ${debian_dir} && autoconf); + -(cd ${debian_dir} && automake); # Force a configure here, using $${PWD} so the changelog, etc. # wind up with the right version numbers - rm -f ${debian_dir}/configure ${debian_dir}/config.status; - rm -f ${debian_dir}/build/autoconf.mk; $(MAKE) -f ${debian_dir}/rules \ - version_string=${pwd_string} \ - SM_CONF_OPT="${SM_CONF_OPT}" SM_BUILD_OPT="${SM_BUILD_OPT}" \ + version_string="${pwd_string}" \ + SM_BUILD_OPT="${SM_BUILD_OPT}" \ + SM_CONF="" \ + SM_CONF_OPT="${SM_CONF_OPT}" \ DEB_BUILD_OPTIONS="${DEB_BUILD_OPTIONS}" \ configure; - $(MAKE) -f ${debian_dir}/rules clean-debian; - + -(cd ${debian_dir} && $(MAKE) distclean;) + $(RM) -r ${debian_dir}/autom4te.cache; # Remove pieces not needed for further building find ${debian_dir}/patches -type d -a ! -name 'patches' \ -a ! -name 'contrib' \ -a ! -name "${pwd_major}" \ -a ! -name "${pwd_version}" \ | xargs -r $(RM) -r; - $(RM) -r ${debian_dir}/bugs ${debian_dir}/private ${debian_dir}/watch; - $(RM) ${debian_dir}/build/acinclude.m4 \ - ${debian_dir}/build/aclocal.m4 \ - ${debian_dir}/build/sendmail.m4 \ - ${debian_dir}/build/ndbm.m4 \ - ${debian_dir}/config.log ${debian_dir}/config.cache \ - ${debian_dir}/config.status \ - ${debian_dir}/build/config.guess ${debian_dir}/build/config.sub; - $(RM) -r ${debian_dir}/autom4te.cache; - # Fakeout Make to look like current - $(RM) ${debian_dir}/configure.ac; - echo `date` > ${debian_dir}/configure.ac; - touch ${debian_dir}/configure; - touch ${debian_dir}/rules; + $(RM) -r ${debian_dir}/bugs ${debian_dir}/private; + find ${debian_dir} -type f -name '*.am' | xargs -r $(RM); + $(RM) \ + ${debian_dir}/aclocal.m4 \ + ${debian_dir}/build/*.m4; + $(MAKE) -f ${debian_dir}/rules clean-debian; #------------- +.PHONY: clean-debian clean-debian: @echo 'cleaning debian directory...'; + #-(cd ${debian_dir} && $(MAKE) -f Makefile maintainer-clean;) + #-(cd ${debian_dir} && $(MAKE) -f Makefile distclean;) find ${debian_dir} -name '*~' -o -name '\.*\.swp' \ | xargs -r rm; - $(RM) ${debian_dir}/*.sav; - $(RM) ${debian_dir}/config.log ${debian_dir}/config.cache \ - ${debian_dir}/config.status \ - ${debian_dir}/build/config.guess.sav \ - ${debian_dir}/build/config.sub.sav; - $(RM) -r ${debian_dir}/autom4te.cache; - # can't touch control/changelog/configure -- needed by debuild, etc - for file in $$(find ${debian_dir} -type f -name '*\.in' \ - -a ! -name 'configure.in'); do \ - $(RM) $$(echo "$$file" | sed -e 's/\.in$$//'); \ - done; + $(RM) ${debian_dir}/*.sav ${debian_dir}/build/*.sav; $(RM) ${STAMP_DIR}/autotools ${STAMP_DIR}/configure; #------------- +.PHONY: refresh-faq refresh-faq: @echo 'Refreshing FAQ' @chmod u+w ${debian_dir}/faq.txt; @@ -319,29 +342,38 @@ refresh-faq: @echo 'Refreshing Misc' @chmod u+w ${debian_dir}/cf/feature/rhsbl.m4; (cd ${debian_dir}/cf/feature && wget --passive-ftp --timestamping \ - --cache=off http://www.rfc-ignorant.org/rhsbl.m4;); + --cache=off http://www.megacity.org/software_downloads/rhsbl.m4;); @chmod u-w ${debian_dir}/cf/feature/rhsbl.m4; #------------- +.PHONY: world world: # Debian build daemons don't (for the nonce) support build-indep, # so this rule allows *me* to build both arch and indep portions # of sendmail in one go (so I don't forget). @dh_testdir; + #time $(MAKE) -f ${debian_dir}/rules parts; + time ${DEB_BUILD}; +.PHONY: parts +parts: $(MAKE) -f ${debian_dir}/rules info; - time ${DEB_BUILD} -rfakeroot + fakeroot $(MAKE) -f ${debian_dir}/rules clean; + $(MAKE) -f ${debian_dir}/rules configure; + fakeroot $(MAKE) -f ${debian_dir}/rules binary-all; +.PHONY: test test: @dh_testdir; $(MAKE) -f ${debian_dir}/rules clean-debian; fakeroot $(MAKE) -f ${debian_dir}/rules clean; $(MAKE) -f ${debian_dir}/rules \ - ENABLE_TLS=yes ENABLE_DEV=no ENABLE_DOC=no \ + ENABLE_DEV=no ENABLE_DOC=no \ CFLAGS='-O2 -Wall' DEB_BUILD_OPTIONS='nostrip' configure; #time ${DEB_BUILD} -rfakeroot -d -us -uc; time $(MAKE) -f ${debian_dir}/rules build-arch; +.PHONY: print print: @dh_testdir; -(cd ${BUILD_TREE}/.. && \ @@ -378,14 +410,6 @@ ${STAMP_DIR}: # Autoconf rules #------------------------------------------------------------------------------ #------------- -${debian_dir}/rules: ${debian_dir}/build/rules.in ${debian_dir}/config.status - # *** *** *** configure changed ?!? *** *** *** - if [ -e ${debian_dir}/config.status ]; then \ - chmod ug+x ${debian_dir}/config.status; \ - (cd ${debian_dir} && ./config.status;); \ - fi; - -#------------- ${debian_dir}/config.status: ${debian_dir}/configure # *** *** *** configure changed ?!? *** *** *** if [ -e ${debian_dir}/config.status ]; then \ @@ -403,6 +427,7 @@ ${debian_dir}/configure: ${debian_dir}/configure.ac chmod ug+x ${debian_dir}/configure; #------------- +.PHONY: autotools autotools: ${STAMP_DIR} ${STAMP_DIR}/autotools ${STAMP_DIR}/autotools: @@ -410,8 +435,9 @@ ${STAMP_DIR}/autotools: # Make sure we have the latest available config.{guess,sub} # Allow the package to override either by faking the date... - if [ -e /usr/share/misc/config.guess -a \ - -e ${debian_dir}/build/config.guess ]; then \ + if [ -e /usr/share/misc/config.guess ] \ + && [ -e ${debian_dir}/build/config.guess ]; then \ + chmod ug+x ${debian_dir}/build/config.guess; \ OLDDATEGUESS=`${debian_dir}/build/config.guess -t | tr -d - `; \ NEWDATEGUESS=`/usr/share/misc/config.guess -t | tr -d - `; \ if [ "$$OLDDATEGUESS" -lt "$$NEWDATEGUESS" ]; then \ @@ -425,8 +451,9 @@ ${STAMP_DIR}/autotools: fi; \ fi; \ fi; - if [ -e /usr/share/misc/config.sub -a \ - -e ${debian_dir}/build/config.sub ]; then \ + if [ -e /usr/share/misc/config.sub ] \ + && [ -e ${debian_dir}/build/config.sub ]; then \ + chmod ug+x ${debian_dir}/build/config.sub; \ OLDDATESUB=`${debian_dir}/build/config.sub -t | tr -d - `; \ NEWDATESUB=`/usr/share/misc/config.sub -t | tr -d - `; \ if [ "$$OLDDATESUB" -lt "$$NEWDATESUB" ]; then \ @@ -441,6 +468,16 @@ ${STAMP_DIR}/autotools: fi; \ fi; + # Make sure that some autotools stuff is executable. + chmod ug+x \ + ${debian_dir}/build/config.guess \ + ${debian_dir}/build/config.sub \ + ${debian_dir}/build/depcomp \ + ${debian_dir}/build/install-sh \ + ${debian_dir}/build/missing \ + ${debian_dir}/build/mkinstalldirs \ + ; + touch ${STAMP_DIR}/autotools; @@ -449,19 +486,22 @@ ${STAMP_DIR}/autotools: # Build/Package check rules #------------------------------------------------------------------------------ #------------- +.PHONY: info info: #-------------------------------------------------------------------- # The following information will be used for this run: + # SM_CONF = ${SM_CONF} # Source = ${package} ${pwd_string} # Package = ${package} ${version_string} # Version = ${version_major}.${version_minor}${version_debian} + # BuildTree = ${BUILD_TREE} + # PatchDir = ${PATCH_DIR} # Arch = ${DEB_BUILD_ARCH} on ${DEB_HOST_ARCH} # Options + # configure = ${CONFIG_OPTS} # config opt = ${SM_CONF_OPT} # build opt = ${SM_BUILD_OPT} - # ENABLE_TLS = ${ENABLE_TLS} - # ENABLUE_AUTH= ${ENABLE_AUTH} # ENABLE_DEV = ${ENABLE_DEV} # ENABLE_DOC = ${ENABLE_DOC} # compile opt = ${CC} ${CFLAGS} ${DEFINES} @@ -472,6 +512,7 @@ info: #-------------------------------------------------------------------- #------------- +.PHONY: buildinfo buildinfo: @echo ''; @dpkg -l \ @@ -483,22 +524,25 @@ buildinfo: ldso \ make \ m4 \ + libdb4 libdb4-dev \ libdb3 libdb3-dev \ libdb2 libdb2-dev \ libwrap0 libwrap0-dev \ libldap2 libldap2-dev \ libopenldap1 libopenldap-dev \ umich-libldap umich-libldap-dev \ + libsasl2 libsasl2-dev \ libsasl7 libsasl-dev \ openssl libssl-dev 'libssl0*' \ ${BUILD_INFO} \ 2> /dev/null \ | awk '$$1 == "ii" { printf("%s-%s\n", $$2, $$3) }' \ - | tee ${debian_dir}/${package}.buildinfo.Debian; + | tee ${debian_dir}/buildinfo; @echo ''; - @chmod 644 ${debian_dir}/${package}.buildinfo.Debian; + @chmod 644 ${debian_dir}/buildinfo; #------------- +.PHONY: pristine pristine: @dh_testdir; #$(MAKE) -f ${debian_dir}/rules info; @@ -508,7 +552,6 @@ pristine: if [ -f ../${package}_${version_string}.diff.gz ]; then \ zgrep -e "^\+\+\+ " ../${package}_${version_string}.diff.gz \ | sed -e "/^\+\+\+ ${package}-${version}\/debian\/.*$$/d" - \ - | sed -e "/^+\+\+ ${package}-${version}\/upstream\/patches\/.*$$/d" - \ | [ ! -z - ]; \ fi; @@ -521,6 +564,7 @@ pristine: fi; #------------- +.PHONY: verify verify: @dh_testdir; # Verifying the md5 summs and signed files @@ -546,9 +590,10 @@ verify: # User callable rules #------------------------------------------------------------------------------ #------------- +.PHONY: clean clean: - dh_testdir; - dh_testroot; + @dh_testdir; + @dh_testroot; # Add here commands to clean up after the build process. #-$(MAKE) clean; @@ -557,18 +602,25 @@ clean: # First, remove any patches, and source directories #$(MAKE) -f ${debian_dir}/sys-build.mk source.clean; + # Local stuff + -if [ -f ${debian_dir}/Makefile ]; then \ + (cd ${debian_dir} && $(MAKE) -f Makefile clean;) \ + fi; + # Debian stuff $(RM) -r ${SOURCE_DIR} ${STAMP_DIR}; - $(RM) ${debian_dir}/*.buildinfo.Debian; + $(RM) \ + ${debian_dir}/config.log \ + ${debian_dir}/config.status \ + ${debian_dir}/*.buildinfo.Debian \ + ${debian_dir}/*.debhelper \ + ${debian_dir}/build/debian/changelog.in \ + ${debian_dir}/build/debian/control \ + ; for file in tmp ${PACKAGES};do \ $(RM) -r ${debian_dir}/$$file; \ done; - # Local stuff - for subdir in ${MAKE_SUBDIRS}; do \ - (cd ${debian_dir}/$$subdir && $(MAKE) -f Makefile.in clean;); \ - done; - ifeq (3, $(shell test ${DH_COMPAT} -ge 3 && echo '3')) # Debhelper V3 conffile handling - prevent duplicates for file in $$(find ${debian_dir} -maxdepth 1 -type f \ @@ -576,18 +628,8 @@ ifeq (3, $(shell test ${DH_COMPAT} -ge 3 && echo '3')) mv $$file $$(echo "$$file" | sed -e 's?\.sav$$??'); \ done; endif - - # can't touch control/changelog/configure -- needed by debuild, etc - $(RM) ${debian_dir}/config.log ${debian_dir}/config.cache \ - ${debian_dir}/config.status; - $(RM) -r ${debian_dir}/autom4te.cache - for file in $$(find ${debian_dir} -type f -name '*\.in' \ - -a ! -name 'configure.in'); do \ - $(RM) $$(echo "$$file" | sed -e 's/\.in$$//'); \ - done; - # Restore pre-existing config.{guess,sub} - -if [ -e ${debian_dir}/buil/config.sub.sav ]; then \ + -if [ -e ${debian_dir}/build/config.sub.sav ]; then \ cp -pf ${debian_dir}/build/config.sub.sav \ ${debian_dir}/build/config.sub \ && $(RM) ${debian_dir}/build/config.sub.sav; \ @@ -604,33 +646,59 @@ endif #------------- +.PHONY: setup setup: ${STAMP_DIR}/setup -${STAMP_DIR}/setup: - +${STAMP_DIR}/setup: ${STAMP_DIR}/patch + $(MAKE) -f ${debian_dir}/rules info # Support separate debian directory ifeq (yes, $(shell test -d debian && echo 'yes')) - dh_testdir; + touch ${STAMP_DIR}/setup; +endif - # unpack and patch source +.PHONY: patch +patch: ${STAMP_DIR}/patch +${STAMP_DIR}/patch: unpack +# patch source +ifeq (yes, $(shell test -d debian && echo 'yes')) + @dh_testdir; +ifeq (yes, $(shell test -d debian/${SM_CONF}.patches && echo 'yes')) + cp -af debian/${SM_CONF}.patches/* debian/patches/; +endif $(MAKE) -f ${SCRIPT_DIR}/dbs-build.mk \ - BUILD_TREE="${BUILD_TREE}" TAR_DIR="${TAR_DIR}" \ - STAMP_DIR="${STAMP_DIR}" PATCH_DIR="${PATCH_DIR}" \ + BUILD_TREE="${BUILD_TREE}" \ + TAR_DIR="${TAR_DIR}" \ + STAMP_DIR="${STAMP_DIR}" \ + PATCH_DIR="${PATCH_DIR}" \ SCRIPT_DIR="${SCRIPT_DIR}" \ - ${STAMP_DIR}/unpack ${STAMP_DIR}/patch; + ${STAMP_DIR}/patch; + #touch ${STAMP_DIR}/patch; +endif - touch ${STAMP_DIR}/setup; +.PHONY: unpack +unpack: ${STAMP_DIR}/unpack +${STAMP_DIR}/unpack: + $(MAKE) -f ${debian_dir}/rules info; +# unpack source +ifeq (yes, $(shell test -d debian && echo 'yes')) + @dh_testdir; + $(MAKE) -f ${SCRIPT_DIR}/dbs-build.mk \ + BUILD_TREE="${BUILD_TREE}" \ + TAR_DIR="${TAR_DIR}" \ + STAMP_DIR="${STAMP_DIR}" \ + PATCH_DIR="${PATCH_DIR}" \ + SCRIPT_DIR="${SCRIPT_DIR}" \ + ${STAMP_DIR}/unpack; + #touch ${STAMP_DIR}/unpack; endif #------------- +.PHONY: configure configure: ${STAMP_DIR}/configure ${STAMP_DIR}/configure: ${STAMP_DIR}/setup ${STAMP_DIR}/autotools - $(MAKE) -f ${debian_dir}/rules info; - #Add here commands to configure the package. #./configure --prefix=/usr - # Use autoconf to handle varying degrees of library support # NOTE: options values are Yes/No/Auto, but auto isn't always # used herein, as it can cause problems to be ignored @@ -638,39 +706,14 @@ ${STAMP_DIR}/configure: ${STAMP_DIR}/setup ${STAMP_DIR}/autotools chmod ug+x ${debian_dir}/configure; (cd ${debian_dir} && \ ./configure \ - --build=${DEB_BUILD_GNU_TYPE} \ - --host=${DEB_HOST_GNU_TYPE} \ - --prefix=/usr \ - --libexecdir=/usr/lib/sm.bin \ - --datadir=${DATA_DIR} \ - --sysconfdir=/etc \ - --localstatedir=/var \ - --infodir=${DATA_DIR}/info \ - --mandir=${DATA_DIR}/man \ - --srcdir=${pwd_dir}/debian \ - --with-buildtree=${BUILD_TREE} \ - --with-docdir=${DATA_DIR}/doc \ - --with-revision=${version_debian} \ - --enable-regex=auto \ - --enable-ndbm=no \ - --enable-newdb=yes \ - --enable-nis=auto \ - --enable-nisplus=auto \ - --enable-ldap=yes \ - --enable-hesiod=no \ - --enable-tcpd=auto \ - --enable-bind=no \ - --enable-ipv6=auto \ - --enable-maillock=yes \ - --enable-auth=${ENABLE_AUTH} \ - --enable-tls=${ENABLE_TLS} \ - --enable-shm=auto \ - --enable-doc=${ENABLE_DOC} \ - --enable-dev=${ENABLE_DEV} \ + ${CONFIG_OPTS} \ ${SM_CONF_OPT} \ ;); # CC="${CC}" CFLAGS="${CFLAGS} - +# Force a re-read of the rules file (to pull configure settings) +ifeq (yes, $(shell test -d debian && echo 'yes')) + touch debian/rules; +endif ifeq (3, $(shell test ${DH_COMPAT} -ge 3 && echo '3')) # Debhelper V3 conffile handling - prevent duplicates for file in $$(find ${debian_dir} -maxdepth 1 -type f \ @@ -678,107 +721,80 @@ ifeq (3, $(shell test ${DH_COMPAT} -ge 3 && echo '3')) mv $$file $$file.sav; \ done; endif - touch ${STAMP_DIR}/configure; #------------- +.PHONY: build-indep build-indep: ${STAMP_DIR}/build-indep ${STAMP_DIR}/build-indep: ${STAMP_DIR}/configure - # Skip work if nothing to do... ifeq (yes, ${ENABLE_INDEP}) - dh_testdir; - - # Document what we're building against - $(MAKE) -f ${debian_dir}/rules buildinfo; - + @dh_testdir; # Add here commands to build/compile the documentation/package. #$(MAKE) doc; - # Only valid on newer (8.11+) Sendmails #(cd ${BUILD_TREE}/doc/op/ && make op.txt); # So we'll do it by hand... $(RM) ${BUILD_TREE}/doc/op/op.txt; pic -C ${BUILD_TREE}/doc/op/op.me | eqn -C -Tascii \ | GROFF_NO_SGR=1 groff -Tascii -me | ul -t dumb > ${BUILD_TREE}/doc/op/op.txt; - # Debian stuff - for subdir in ${MAKE_SUBDIRS}; do \ - (cd ${debian_dir}/$$subdir && $(MAKE) build-indep;); \ - done; + (cd ${debian_dir} && $(MAKE) -f Makefile build-indep;) endif - touch ${STAMP_DIR}/build-indep; #------------- +.PHONY: build-arch build-arch: ${STAMP_DIR}/build-arch ${STAMP_DIR}/build-arch: ${STAMP_DIR}/configure - # Skip work if nothing to do... ifeq (yes, ${ENABLE_ARCH}) - dh_testdir; - - # Document what we're building against - $(MAKE) -f ${debian_dir}/rules buildinfo; - + @dh_testdir; # Add here commands to compile the package. #$(MAKE); - # Place our m4 configuration files for the sendmail build to use if [ -d ${BUILD_TREE}/devtools/Site ]; then \ - cp -f ${debian_dir}/build/site.config.m4 ${BUILD_TREE}/devtools/Site/; \ + cp -f ${debian_dir}/build/site.config.m4 \ + ${BUILD_TREE}/devtools/Site/; \ fi; - - # Correct some paths in upstream man pages - sed -e "s?/usr/adm/sm.bin?${sysconfdir}/mail/smrsh?g" \ - -e "s?sm.bin?${sysconfdir}/mail/smrsh?g" \ - ${BUILD_TREE}/smrsh/smrsh.8 \ - > ${BUILD_TREE}/smrsh/smrsh.8.new; - mv ${BUILD_TREE}/smrsh/smrsh.8.new ${BUILD_TREE}/smrsh/smrsh.8; - sed -e "s?/etc/mail/statistics?${localstatedir}/lib/sendmail/sendmail.st?g"\ - ${BUILD_TREE}/sendmail/sendmail.8 \ - > ${BUILD_TREE}/sendmail/sendmail.8.new; - mv ${BUILD_TREE}/sendmail/sendmail.8.new \ - ${BUILD_TREE}/sendmail/sendmail.8; - # Finally, build the whole enchilada (we'll let sendmail figure # which, if any of the dependant libraries each component needs) for subdir in ${SM_SUBDIRS}; do \ if [ -d ${BUILD_TREE}/$${subdir} ]; then \ (cd ${BUILD_TREE}/$${subdir} && ./Build -S;); \ fi; \ + if [ -d ${BUILD_TREE}/libmilter ]; then \ + (cd ${BUILD_TREE}/obj*/libmilter && \ + gcc -shared -pthread -o libmilter.so.0 \ + -Wl,-soname,libmilter.so.0 \ + main.o engine.o listener.o handler.o comm.o \ + smfi.o signal.o sm_gethost.o errstring.o strl.o;); \ + fi; \ done; - + # Debian stuff + (cd ${debian_dir} && $(MAKE) -f Makefile build-arch;) # Remove our config m4 files $(RM) ${BUILD_TREE}/devtools/Site/site.config.m4; - - # Debian stuff - for subdir in ${MAKE_SUBDIRS}; do \ - (cd ${debian_dir}/$$subdir && $(MAKE) build-arch;); \ - done; endif - touch ${STAMP_DIR}/build-arch; #------------- +.PHONY: install-indep install-indep: ${STAMP_DIR}/install-indep ${STAMP_DIR}/install-indep: DH_OPTIONS=-i ${STAMP_DIR}/install-indep: ${STAMP_DIR}/build-indep - # Skip work if nothing to do... ifeq (yes, ${ENABLE_INDEP}) - dh_testdir; - dh_testroot; - dh_clean -k; + @dh_testdir; + @dh_testroot; + #dh_clean -k; dh_installdirs; if [ -x /usr/bin/dh_link ]; then dh_link; fi; - # Add here commands to install the documentation/package. #$(MAKE) prefix=`pwd`/${PKG_DIR}/usr install; - # sendmail operations guide and other documentation $(INSTALL_DATA) ${BUILD_TREE}/doc/op/op.ps ${PKG_DOC}/op; $(INSTALL_DATA) ${BUILD_TREE}/doc/op/op.txt ${PKG_DOC}/op; @@ -804,8 +820,8 @@ ifeq (yes, ${ENABLE_INDEP}) -e "s?/usr/adm/sm.bin?/etc/mail/smrsh?g" \ ${BUILD_TREE}/smrsh/README \ > ${PKG_DOC}/smrsh.README; - $(INSTALL_DATA) debian/faq.txt ${PKG_DOC}/; - + $(INSTALL_DATA) debian/faq.txt ${PKG_DOC}/; +ifeq (yes, ${ENABLE_DEV}) # libmilter-dev package if [ -d ${BUILD_TREE}/libmilter ]; then \ $(INSTALL_DATA) debian/README.Debian.libmilter-dev \ @@ -817,53 +833,58 @@ ifeq (yes, ${ENABLE_INDEP}) ${PKG_DOC}/libmilter/html; \ fi; \ fi; - +endif # Debian stuff - for subdir in ${MAKE_SUBDIRS}; do \ - (cd ${debian_dir}/$$subdir && \ - $(MAKE) install-indep \ - DESTDIR="../../${PKG_DOC}";); \ - done; - + (cd ${debian_dir}/cf && \ + $(MAKE) -f Makefile install-indep \ + DESTDIR="${top_srcdir}/sendmail-cf";); + (cd ${debian_dir}/examples && \ + $(MAKE) -f Makefile install-indep \ + DESTDIR="${top_srcdir}/sendmail-base";); + (cd ${debian_dir}/local && \ + $(MAKE) -f Makefile install-indep \ + DESTDIR="${top_srcdir}/sendmail-base";); # Multiple package fixup #dh_movefiles -i --sourcedir debian/${package}; - # Actions from binary-common # dh_fixperms; # # Cleanup misc permissions, etc... (fakeroot, dh_fixperms, etc.) + # Install Lintian overrides + $(INSTALL_DATA) -g root -m 644 \ + debian/build/debian/sendmail-base.lintian-overrides \ + debian/sendmail-base/usr/share/lintian/overrides/sendmail-base; endif - touch ${STAMP_DIR}/install-indep; #------------- +.PHONY: install-arch install-arch: ${STAMP_DIR}/install-arch ${STAMP_DIR}/install-arch: DH_OPTIONS=-a ${STAMP_DIR}/install-arch: ${STAMP_DIR}/build-arch - # Skip work if nothing to do... ifeq (yes, ${ENABLE_ARCH}) - dh_testdir; - dh_testroot; - dh_clean -k; + @dh_testdir; + @dh_testroot; + #dh_clean -k; dh_installdirs; if [ -x /usr/bin/dh_link ]; then dh_link; fi; - # Add here commands to install the package into ${PKG_DIR}. #$(MAKE) prefix=`pwd`/${PKG_DIR}/usr install; - # sendmail install proper... with a little help ;-} #$(MAKE) install DESTDIR="$${pwd}/${PKG_DIR}"; - # Finally, install the whole enchilada for subdir in ${SM_SUBDIRS}; do \ if [ -d ${BUILD_TREE}/$${subdir} ]; then \ if [ "$${subdir}" = 'libmilter' ]; then \ - :; \ - elif [ "$${subdir}" = 'mail.local' -o \ - "$${subdir}" = 'rmail' ]; then \ + (cd ${BUILD_TREE}/obj*/$${subdir} && \ + $(INSTALL) libmilter.so.0 \ + ../../../../debian/libmilter0/usr/lib/; \ + ); \ + elif [ "$${subdir}" = 'mail.local' ] \ + || [ "$${subdir}" = 'rmail' ]; then \ (cd ${BUILD_TREE}/obj*/$${subdir} && \ $(MAKE) force-install \ DESTDIR="../../../../${PKG_DIR}";); \ @@ -880,10 +901,10 @@ ifeq (yes, ${ENABLE_ARCH}) ${PKG_DIR}${sysconfdir}/mail/helpfile; \ $(RM) ${PKG_DIR}${localstatedir}/lib/sendmail/sendmail.st; \ fi; - - # FHS says that rmail belongs in ${sbindir} - mv ${PKG_DIR}${bindir}/rmail ${PKG_DIR}${sbindir}/rmail; - + # FHS says that rmail belongs in ${sbindir} - and we now put + # it there, but in the rmail package ! + mv ${PKG_DIR}${libexecdir}/rmail ${debian_dir}/rmail/${sbindir}/; + mv ${PKG_DIR}${mandir}/man8/rmail.8 ${debian_dir}/rmail/${mandir}/man8/; # Sendmail alias handling... # NOTE: whilst smptd is a valid alias for sendmail, we don't create # one so that we can co-exists with smtpd (a firewall frontend) @@ -892,122 +913,58 @@ ifeq (yes, ${ENABLE_ARCH}) # yeah, yeah, I know... these can be done with -b<flag>! (cd ${PKG_DIR}${bindir} && \ $(RM) hoststat mailq newaliases purgestat smtpd;) - ln -sf ../sbin/sendmail ${PKG_DIR}${libdir}/sendmail; (cd ${PKG_DIR}${sbindir} && for file in \ newaliases hoststat purgestat \ ; do \ - ln -sf sendmail $$file; \ + ln -sf sendmail-mta $$file; \ done;); # Handle man pages for these aliases + mv ${PKG_DIR}${mandir}/man5/aliases.5 \ + ${PKG_DIR}${mandir}/man5/aliases.sendmail.5; + mv ${PKG_DIR}${mandir}/man1/mailq.1 \ + ${PKG_DIR}${mandir}/man1/mailq.sendmail.1; + mv ${PKG_DIR}${mandir}/man1/newaliases.1 \ + ${PKG_DIR}${mandir}/man8/newaliases.sendmail.8; (cd ${PKG_DIR}${mandir}/man8 && for file in \ hoststat.8.gz purgestat.8.gz \ ; do \ - ln -sf sendmail.8.gz $$file; \ + ln -sf sendmail-mta.8.gz $$file; \ done;); # Place those removed aliases in ${libexecdir} (mostly for me) (cd ${PKG_DIR}${libexecdir} && for file in \ hoststat mailq newaliases purgestat smtpd; do \ - ln -sf ../../sbin/sendmail $$file; \ + ln -sf sendmail $$file; \ done;); # NOTE: with the MSP/MTA split, we'll provide our own mailstats (keep orig) - mv ${PKG_DIR}${sbindir}/mailstats \ - ${PKG_DIR}${libexecdir}/mailstats; + ln -s ../share/sendmail/mailstats ${PKG_DIR}${sbindir}/mailstats; + ln -s ../share/sendmail/mailq ${PKG_DIR}${bindir}/mailq; + ln -s ../lib/sm.bin/editmap ${PKG_DIR}${sbindir}/editmap; + ln -s ../lib/sm.bin/makemap ${PKG_DIR}${sbindir}/makemap; + ln -s ../lib/sm.bin/praliases ${PKG_DIR}${sbindir}/praliases; # Special handling of vacation - Debian has a seperate package # with a different version (sigh) keep our copy just in case... if [ -d ${BUILD_TREE}/vacation ]; then \ - mv ${PKG_DIR}${bindir}/vacation \ + mv ${PKG_DIR}${libexecdir}/vacation \ ${PKG_DIR}${libexecdir}/vacation.sendmail; \ mv ${PKG_DIR}${mandir}/man1/vacation.1 \ ${PKG_DIR}${mandir}/man1/vacation.sendmail.1; \ fi; - # m4 configuration directories - cp -a ${BUILD_TREE}/cf/* ${PKG_DIR}${datadir}/sendmail/cf; - $(RM) ${PKG_DIR}${datadir}/sendmail/cf/README; - $(RM) ${PKG_DIR}${datadir}/sendmail/cf/sendmail.schema; - $(RM) ${PKG_DIR}${datadir}/sendmail/cf/cf/Build; - $(RM) ${PKG_DIR}${datadir}/sendmail/cf/cf/Makefile; - $(RM) ${PKG_DIR}${datadir}/sendmail/cf/cf/*.cf; - - # contributed stuff - scripts - sed -e 's?/usr/local/bin/perl?/usr/bin/perl?g' \ - -e "s?/etc/sendmail.cf?${sysconfdir}/mail/sendmail.cf?g" \ - ${BUILD_TREE}/contrib/etrn.pl \ - > ${PKG_DIR}${sbindir}/etrn; - chmod 0755 ${PKG_DIR}${sbindir}/etrn; - if [ -f ${BUILD_TREE}/contrib/etrn.0 ]; then \ - sed 's?/usr/local/bin/perl?/usr/bin/perl?g' \ - ${BUILD_TREE}/contrib/etrn.0 \ - > ${PKG_DIR}${mandir}/man8/etrn.8; \ - else \ - sed 's?/usr/local/bin/perl?/usr/bin/perl?g' \ - ${BUILD_TREE}/contrib/etrn.pl \ - > ${PKG_DIR}${mandir}/man8/etrn.8; \ - fi; - sed -e 's?/usr/local/bin/perl?/usr/bin/perl?g' \ - ${BUILD_TREE}/contrib/expn.pl \ - > ${PKG_DIR}${bindir}/expn; - chmod 0755 ${PKG_DIR}${bindir}/expn; - sed 's?/usr/local/bin/perl?/usr/bin/perl?g' \ - ${BUILD_TREE}/contrib/expn.pl \ - > ${PKG_DIR}${mandir}/man8/expn.8; - sed -e "s?/etc/sendmail.cf?${sysconfdir}/mail/sendmail.cf?g" \ - debian/checksendmail/checksendmail.perl \ - > ${PKG_DIR}${sbindir}/checksendmail; - chmod 0755 ${PKG_DIR}${sbindir}/checksendmail; - $(INSTALL_DATA) debian/checksendmail/checksendmail.8 \ - ${PKG_DIR}${mandir}/man8/; - sed -e 's?/usr/local/bin/perl?/usr/bin/perl?g' \ - -e 's?/usr/sbin/sendmail -q30m -bd?/etc/init.d/sendmail start?g' \ - ${BUILD_TREE}/contrib/smcontrol.pl \ - > ${PKG_DIR}${datadir}/sendmail/smcontrol.pl; - chmod 0755 ${PKG_DIR}${datadir}/sendmail/smcontrol.pl; - $(INSTALL_SCRIPT) ${BUILD_TREE}/contrib/doublebounce.pl \ - ${PKG_DIR}${datadir}/sendmail; - if [ -f ${BUILD_TREE}/contrib/qtool.pl ]; then \ - sed -e 's?/usr/bin/env perl?/usr/bin/perl?g' \ - ${BUILD_TREE}/contrib/qtool.pl \ - > ${PKG_DIR}${datadir}/sendmail/qtool.pl; \ - chmod 0755 ${PKG_DIR}${datadir}/sendmail/qtool.pl; \ - $(INSTALL_DATA) ${BUILD_TREE}/contrib/qtool.8 \ - ${PKG_DIR}${mandir}/man8/; \ - fi; - if [ -f ${BUILD_TREE}/contrib/buildvirtuser ]; then \ - $(INSTALL_SCRIPT) ${BUILD_TREE}/contrib/buildvirtuser \ - ${PKG_DIR}${datadir}/sendmail/; \ - fi; - - # contributed stuff - examples - sed 's?/bin/perl?/usr/bin/perl?g' \ - ${BUILD_TREE}/contrib/passwd-to-alias.pl \ - > ${PKG_DIR}${datadir}/sendmail/examples/passwd-to-alias; - chmod 0755 ${PKG_DIR}${datadir}/sendmail/examples/passwd-to-alias; - - # contributed stuff - m4 scripts - if [ -f ${BUILD_TREE}/contrib/domainmap.m4 ]; then \ - $(INSTALL_DATA) ${BUILD_TREE}/contrib/domainmap.m4 \ - ${PKG_DIR}${datadir}/sendmail/cf/feature; \ - fi; - if [ -f ${BUILD_TREE}/contrib/dnsblaccess.m4 ]; then \ - $(INSTALL_DATA) ${BUILD_TREE}/contrib/dnsblaccess.m4 \ - ${PKG_DIR}${datadir}/sendmail/cf/hack; \ - fi; - + # Correct some paths in upstream man pages + sed -e "s?/usr/adm/sm.bin?${sysconfdir}/mail/smrsh?g" \ + -e "s?sm.bin?${sysconfdir}/mail/smrsh?g" \ + ${BUILD_TREE}/smrsh/smrsh.8 \ + > ${BUILD_TREE}/smrsh/smrsh.8.new; + mv ${BUILD_TREE}/smrsh/smrsh.8.new ${BUILD_TREE}/smrsh/smrsh.8; + sed -e "s?/etc/mail/statistics?${localstatedir}/lib/sendmail/sendmail.st?g"\ + ${BUILD_TREE}/sendmail/sendmail.8 \ + > ${BUILD_TREE}/sendmail/sendmail.8.new; + mv ${BUILD_TREE}/sendmail/sendmail.8.new \ + ${PKG_DIR}${mandir}/man8/sendmail.sendmail.8; + rm ${BUILD_TREE}/sendmail/sendmail.8; # Debian stuff - for subdir in ${MAKE_SUBDIRS}; do \ - (cd ${debian_dir}/$$subdir && \ - $(MAKE) install-arch \ - DESTDIR="../../${PKG_DIR}";); \ - done; - # Debian stuff - m4 scripts - (cd debian && \ - for file in $$(find cf -type f -name '*.m4' -o -name '*.mc'); do \ - $(INSTALL_DATA) $$file \ - ../${PKG_DIR}${datadir}/sendmail/$$file; \ - done;); - # Debian stuff - examples - $(INSTALL_DATA) debian/checksendmail/address.resolve \ - ${PKG_DIR}${datadir}/sendmail/examples/; - + (cd ${debian_dir}/sensible_mda && \ + $(MAKE) -f Makefile install-arch \ + DESTDIR="${top_srcdir}/sensible-mda";); # libmilter-dev package ifeq (yes, ${ENABLE_DEV}) if [ -d ${BUILD_TREE}/libmilter ]; then \ @@ -1030,48 +987,46 @@ ifeq (yes, ${ENABLE_DEV}) fi; \ fi; endif - # Multiple package fixup #dh_movefiles -a --sourcedir debian/${package}; - - # Actions from binary-common - #dh_installcron; - $(INSTALL_SCRIPT) debian/${package}.cron.daily \ - ${PKG_DIR}${sysconfdir}/cron.daily/sendmail; - #dh_installlogrotate; - #$(INSTALL_DATA) debian/${package}.logrotate \ - # ${PKG_DIR}${sysconfdir}/logrotate.d/sendmail; # dh_fixperms; # # Cleanup misc permissions, etc... (fakeroot, dh_fixperms, etc.) - chmod a+x ${PKG_DIR}${datadir}/sendmail/cf/sh/makeinfo.sh; - chown root:root ${PKG_DIR}${sysconfdir}/mail/helpfile; - chown root:root ${PKG_DIR}${sysconfdir}/mail/peers/provider; - chown root:root ${PKG_DIR}${sysconfdir}/mail/service.switch*; # # You may want to make some executables suid here. - chown root:mail ${PKG_DIR}${sbindir}/sendmail; - chmod 04755 ${PKG_DIR}${sbindir}/sendmail; + chown root:mail ${PKG_DIR}${libexecdir}/sendmail; + chmod 02755 ${PKG_DIR}${libexecdir}/sendmail; chown root:mail ${PKG_DIR}${libexecdir}/mailstats; chmod 02755 ${PKG_DIR}${libexecdir}/mailstats; - chown root:mail ${PKG_DIR}${libexecdir}/mail.local; - chmod 0755 ${PKG_DIR}${libexecdir}/mail.local; - chown root:mail ${PKG_DIR}${libexecdir}/smrsh; - chmod 0755 ${PKG_DIR}${libexecdir}/smrsh; - chown root:mail ${PKG_DIR}${libexecdir}/sensible-mda; - chmod 0755 ${PKG_DIR}${libexecdir}/sensible-mda; - + chmod 04755 debian/sensible-mda/usr/sbin/sensible-mda; # Special case Perl for Debian Slink (2.1), debhelper v1 if [ ! -x /usr/bin/dh_perl ]; then \ echo 'perl:Depends=perl5|perl' >> debian/substvars; fi; - # Install Lintian overrides - $(INSTALL_DATA) -d -g root -m 755 ${PKG_DIR}${datadir}/lintian/overrides - $(INSTALL_DATA) -g root -m 644 debian/${package}.lintian-overrides \ - ${PKG_DIR}${datadir}/lintian/overrides/${package} + $(INSTALL_DATA) -g root -m 644 \ + debian/build/debian/libmilter0.lintian-overrides \ + debian/libmilter0/usr/share/lintian/overrides/libmilter0; +ifeq (yes, ${ENABLE_DEV}) + $(INSTALL_DATA) -g root -m 644 \ + debian/build/debian/libmilter-dev.lintian-overrides \ + debian/libmilter-dev/usr/share/lintian/overrides/libmilter-dev; +endif + $(INSTALL_DATA) -g root -m 644 \ + debian/build/debian/rmail.lintian-overrides \ + debian/rmail/usr/share/lintian/overrides/rmail; + $(INSTALL_DATA) -g root -m 644 \ + debian/build/debian/sensible-mda.lintian-overrides \ + debian/sensible-mda/usr/share/lintian/overrides/sensible-mda; + $(INSTALL_DATA) -g root -m 644 \ + debian/build/debian/sendmail-bin.lintian-overrides \ + debian/sendmail-bin/usr/share/lintian/overrides/sendmail-bin; +ifeq (, $(findstring nostrip,${DEB_BUILD_OPTIONS})) + dh_strip; +endif + dh_makeshlibs; # -V "libmilter0 (>= ${version_major}.${version_minor})"; + dh_shlibdeps; endif - touch ${STAMP_DIR}/install-arch; @@ -1083,43 +1038,37 @@ endif # # Must not depend on anything. This is to be called by # binary-arch/binary-indep in another 'make' thread. +.PHONY: binary-common binary-common: - # Need this version of debhelper for DH_OPTIONS to work. - dh_testversion 1.1.17; - dh_testdir; - dh_testroot; + @dh_testdir; + @dh_testroot; + # Document what we're building against + if [ -x /usr/bin/dh_buildinfo ]; then \ + dh_buildinfo; \ + dh_installdocs; \ + else \ + $(MAKE) -f ${debian_dir}/rules buildinfo; \ + dh_installdocs -A ${debian_dir}/buildinfo; \ + fi; # Done in install-xxx, but still need to get rid of *.debhelper !!! #dh_clean -k; - $(RM) debian/*.debhelper; - dh_installchangelogs -k ${BUILD_TREE}/RELEASE_NOTES; - #-------- needs script name ala installinit ---- - # Done in install-xxx - #dh_installcron; + dh_installcron --name=${package}; if [ -x /usr/bin/dh_installdebconf ]; then dh_installdebconf; fi; - dh_installdocs; #dh_installemacsen; #dh_installexamples; #if [ -x /usr/bin/dh_installinfo ]; then dh_installinfo; fi; - dh_installinit --init-script=sendmail; - #-------- needs script name ala installinit ---- - # Done in install-xxx - #if [ -x /usr/bin/dh_installlogrotate ]; then dh_installlogrotate; fi; + dh_installinit --name=${package} --update-rcd-params="defaults 21 19"; + if [ -x /usr/bin/dh_installlogrotate ]; then \ + dh_installlogrotate --name=${package}; fi; if [ -x /usr/bin/dh_installman ]; then dh_installman; fi; #dh_installmenu; #dh_installmime; #dh_undocumented; if [ -x /usr/bin/dh_installpam ]; then dh_installpam; fi; - # Done in install-xxx - #if [ -x /usr/bin/dh_link ]; then dh_link; fi; -ifeq (, $(findstring nostrip,${DEB_BUILD_OPTIONS})) - dh_strip; -else - #dh_strip; -endif + #dh_strip; #-- done in install-arch dh_compress; - # Done in install-xxx - #dh_fixperms; + #dh_fixperms; #-- done in install-xxx # Need to special case this now that we're using dynamic uid/gid #if [ -x /usr/sbin/suidregister -a -s /etc/suid.conf ]; then # dh_suidregister; fi; @@ -1130,20 +1079,20 @@ endif # You may want to make some executables suid here. # Done in install-xxx # - #dh_makeshlibs; + #dh_makeshlibs -V; #-- done in install-arch + #dh_shlibdeps; #-- done in install-arch dh_installdeb; - dh_shlibdeps; if [ -x /usr/bin/dh_perl ]; then dh_perl; fi dh_gencontrol; dh_md5sums; dh_builddeb; - $(MAKE) -f ${debian_dir}/rules pristine; #------------- # Build architecture independant packages using the common target. # (Uncomment this next line if you have such packages.) +.PHONY: binary-indep binary-indep: ${STAMP_DIR}/build-indep ${STAMP_DIR}/install-indep # Skip work if nothing to do... @@ -1154,6 +1103,7 @@ endif #------------- # Build architecture dependant packages using the common target. +.PHONY: binary-arch binary-arch: ${STAMP_DIR}/build-arch ${STAMP_DIR}/install-arch # Skip work if nothing to do... @@ -1164,6 +1114,7 @@ endif #------------- # Any other binary targets build just one binary package at a time. +.PHONY: binary-% binary-%: $(MAKE) -f ${debian_dir}/rules binary-common DH_OPTIONS=-p$*; @@ -1171,19 +1122,23 @@ binary-%: #------------- # Below here is fairly generic really +.PHONY: FORCE +FORCE: ; + source diff: @echo >&2 'source and diff are obsolete - use dpkg-source -b'; false -# Due to buildd not (for the nonce) supporting build-arch, kluge next rule +# Due to buildd not (for the nonce) supporting build-arch, kluge next rules +# so that buildd ONLY build/install *-arch packages +.PHONY: build build: build-arch -install: install-indep install-arch -binary: binary-indep binary-arch -.PHONY: refresh-dbs refresh-debian update-debian refresh-faq -.PHONY: pristine -.PHONY: info buildinfo -.PHONY: setup autotools configure -.PHONY: clean build build-indep build-arch -.PHONY: install install-indep install-arch -.PHONY: binary binary-indep binary-arch +.PHONY: build-all +build-all: build-indep build-arch +.PHONY: install +install: install-arch +.PHONY: binary +binary: binary-all +.PHONY: binary-all +binary-all: binary-indep binary-arch .SUFFIXES: -.PRECIOUS: ${debian_dir}/rules +.PRECIOUS: ${debian_dir}/rule diff --git a/debian/sendmail.docs b/debian/sendmail-base.docs index 7f37dde..6327cc0 100644 --- a/debian/sendmail.docs +++ b/debian/sendmail-base.docs @@ -1,3 +1,2 @@ -debian/sendmail.buildinfo.Debian debian/Debian-specific debian/build/site.config.m4 diff --git a/debian/sendmail-base.links b/debian/sendmail-base.links new file mode 100644 index 0000000..435b090 --- /dev/null +++ b/debian/sendmail-base.links @@ -0,0 +1,2 @@ +usr/share/sendmail/examples usr/share/doc/sendmail-base/examples +usr/share/bug/sendmail usr/share/bug/sendmail-base diff --git a/debian/sendmail-base.sendmail.logrotate b/debian/sendmail-base.sendmail.logrotate new file mode 100644 index 0000000..2c212e6 --- /dev/null +++ b/debian/sendmail-base.sendmail.logrotate @@ -0,0 +1,94 @@ +# Sample Logrotate file for sendmail +# +# C A V E A T E M P T O R +# +# If you're using the stock syslog package, do *NOT* enable anything +# in this file, doing so may result in dual rotations of the logfiles +# and/or loss of logged data. The syslog package, by default, will +# rotate standard log files based upon various critera !!! +# +#/var/log/mail/mail.alert { +# notifempty +# rotate 4 +# size 100k +# weekly +# compress +# missingok +#} +# +#/var/log/mail/mail.crit { +# notifempty +# rotate 4 +# size 100k +# weekly +# compress +# missingok +#} +# +#/var/log/mail/mail.debug { +# notifempty +# rotate 4 +# size 100k +# weekly +# compress +# missingok +#} +# +#/var/log/mail/mail.emerg { +# notifempty +# rotate 4 +# size 100k +# weekly +# compress +# missingok +#} +# +#/var/log/mail/mail.err { +# notifempty +# rotate 4 +# size 100k +# weekly +# compress +# missingok +#} +# +#/var/log/mail/mail.info { +# notifempty +# rotate 4 +# size 100k +# weekly +# compress +# missingok +#} +# +#/var/log/mail/mail.log { +# create 0660 root mail +# notifempty +# rotate 4 +# size 100k +# weekly +# compress +# missingok +# postrotate +# /etc/init.d/sysklogd reload +# endscript +#} +# +#/var/log/mail/mail.notice { +# notifempty +# rotate 4 +# size 100k +# weekly +# compress +# missingok +#} +# +#/var/log/mail/mail.warn { +# notifempty +# rotate 4 +# size 100k +# weekly +# compress +# missingok +#} + diff --git a/debian/sendmail-bin.links b/debian/sendmail-bin.links new file mode 100644 index 0000000..28458f8 --- /dev/null +++ b/debian/sendmail-bin.links @@ -0,0 +1 @@ +usr/share/bug/sendmail usr/share/bug/sendmail-bin diff --git a/debian/sendmail-cf.links b/debian/sendmail-cf.links new file mode 100644 index 0000000..f7febab --- /dev/null +++ b/debian/sendmail-cf.links @@ -0,0 +1 @@ +usr/share/bug/sendmail usr/share/bug/sendmail-cf diff --git a/debian/sendmail-doc.dirs.in b/debian/sendmail-doc.dirs.in deleted file mode 100644 index b301667..0000000 --- a/debian/sendmail-doc.dirs.in +++ /dev/null @@ -1,5 +0,0 @@ -@docdir@/sendmail-doc -@docdir@/sendmail-doc/libmilter -@docdir@/sendmail-doc/libmilter/html -@docdir@/sendmail-doc/op -@docdir@/sendmail-doc/sendmail diff --git a/debian/sendmail-doc.docs b/debian/sendmail-doc.docs index 58c806d..7b3c4c5 100644 --- a/debian/sendmail-doc.docs +++ b/debian/sendmail-doc.docs @@ -1,4 +1,3 @@ debian/README.Debian.sendmail-doc -debian/sendmail.buildinfo.Debian debian/Debian-specific debian/build/site.config.m4 diff --git a/debian/sendmail-doc.links b/debian/sendmail-doc.links new file mode 100644 index 0000000..ed0a695 --- /dev/null +++ b/debian/sendmail-doc.links @@ -0,0 +1 @@ +usr/share/bug/sendmail usr/share/bug/sendmail-doc diff --git a/debian/sendmail-doc.postinst b/debian/sendmail-doc.postinst deleted file mode 100644 index bf0ac2a..0000000 --- a/debian/sendmail-doc.postinst +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/sh -e -# -# Debian post installation script -# -# Install of already installed package: -# 1) old-prerm upgrade new-version -# *) new-prerm failed-upgrade old-version -# *) old-postinst abort-upgrade new-version -# -# If a `conflicting' package is being removed at the same time: -# 1) forall packages depending on conflicting package and --auto-deconfigure -# deconfigured's-prerm deconfigure \ -# in-favour package-being-installed version \ -# removing conflicting-package version -# *) deconfigured's-postinst abort-deconfigure \ -# in-favour package-being-installed-but-failed version \ -# removing conflicting-package version -# 2) To prepare for removal of the conflicting package -# conflictor's-prerm remove \ -# in-favour package new-version -# *) conflictor's-postinst abort-remove \ -# in-favour package new-version -# -# Configuration of package: -# postinst configure most-recently-configured-version -# -set -e; - -PACKAGE=`echo "$(basename $0)" | sed -e 's/\.postinst$//'`; - -case "$1" in - configure) - # continue below - ;; - - abort-upgrade|abort-remove|abort-deconfigure) - exit 0; - ;; - - *) - echo "$PACKAGE postinst called with unknown argument \`$1'" >&2; - exit 1; - ;; - esac; - -#DEBHELPER# -exit 0; diff --git a/debian/sendmail-doc.prerm b/debian/sendmail-doc.prerm deleted file mode 100644 index 966dfdd..0000000 --- a/debian/sendmail-doc.prerm +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/sh -e -# -# Debian pre removal script -# -# Install of already installed package: -# 1) old-prerm upgrade new-version -# *) new-prerm failed-upgrade old-version -# *) old-postinst abort-upgrade new-version -# -# If a `conflicting' package is being removed at the same time: -# 1) forall packages depending on conflicting package and --auto-deconfigure -# deconfigured's-prerm deconfigure \ -# in-favour package-being-installed version \ -# removing conflicting-package version -# *) deconfigured's-postinst abort-deconfigure \ -# in-favour package-being-installed-but-failed version \ -# removing conflicting-package version -# 2) To prepare for removal of the conflicting package -# conflictor's-prerm remove \ -# in-favour package new-version -# *) conflictor's-postinst abort-remove \ -# in-favour package new-version -# -# Removal of a package: -# 1) prerm remove -# 2) The package's files are removed (except conffiles). -# 3) postrm remove -# 4) All the maintainer scripts except the postrm are removed. -# -set -e; - -PACKAGE=`echo "$(basename $0)" | sed -e 's/\.prerm$//'`; - -case "$1" in - remove) - ;; - - upgrade) - ;; - - failed-upgrade) - ;; - - deconfigure) - ;; - - *) - echo "$PACKAGE prerm called with unknown argument \`$1'" >&2; - exit 1; - ;; - esac; - -#DEBHELPER# -exit 0; diff --git a/debian/sendmail.dirs.in b/debian/sendmail.dirs.in deleted file mode 100644 index 6d33f58..0000000 --- a/debian/sendmail.dirs.in +++ /dev/null @@ -1,54 +0,0 @@ -/DEBIAN -@sysconfdir@/cron.d -@sysconfdir@/cron.daily -@sysconfdir@/default -@sysconfdir@/init.d -@sysconfdir@/logcheck -@sysconfdir@/logcheck/ignore.d.paranoid -@sysconfdir@/logcheck/ignore.d.server -@sysconfdir@/logcheck/ignore.d.workstation -@sysconfdir@/logcheck/violations.ignore.d -@sysconfdir@/logrotate.d -@sysconfdir@/mail -@sysconfdir@/mail/peers -@sysconfdir@/mail/smrsh -@sysconfdir@/mail/sasl -@sysconfdir@/mail/tls -@sysconfdir@/pam.d -@sysconfdir@/ppp/ip-up.d -@sysconfdir@/ppp/ip-down.d -@bindir@ -@sbindir@ -@libexecdir@ -@docdir@/sendmail -@mandir@/man1 -@mandir@/man5 -@mandir@/man8 -@datadir@/sendmail -@datadir@/sendmail/examples -@datadir@/sendmail/examples/db -@datadir@/sendmail/examples/dialup -@datadir@/sendmail/examples/ldap -@datadir@/sendmail/examples/logcheck -@datadir@/sendmail/examples/logcheck/ignore.d.paranoid -@datadir@/sendmail/examples/logcheck/ignore.d.server -@datadir@/sendmail/examples/logcheck/ignore.d.workstation -@datadir@/sendmail/examples/logcheck/violations.ignore.d -@datadir@/sendmail/examples/milter -@datadir@/sendmail/examples/pam -@datadir@/sendmail/examples/sasl -@datadir@/sendmail/examples/tls -@datadir@/sendmail/cf/cf -@datadir@/sendmail/cf/debian -@datadir@/sendmail/cf/domain -@datadir@/sendmail/cf/feature -@datadir@/sendmail/cf/hack -@datadir@/sendmail/cf/m4 -@datadir@/sendmail/cf/mailer -@datadir@/sendmail/cf/ostype -@datadir@/sendmail/cf/sh -@localstatedir@/lib/sendmail -@localstatedir@/run/sendmail -@localstatedir@/run/sendmail/msp -@localstatedir@/run/sendmail/mta -@localstatedir@/run/sendmail/stampdir diff --git a/debian/sendmail.init.d.in b/debian/sendmail.init.d.in deleted file mode 100644 index 5e72517..0000000 --- a/debian/sendmail.init.d.in +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/sh -e -# -# $Sendmail: init.d,v @sm_version@ @sm_date@ @sm_time@ cowboy Exp $ -# -# Sendmail rc script for Debian (/etc/init.d/sendmail) -# -# Copyright (c) 2001-@SM_CPYRT@, Richard Nelson <cowboy@debian.org>. -# -# Notes (to all): -# * *** Do not edit this file *** Instead edit /etc/mail/sendmail.conf -# -# Notes (to self): -# * -# -set -e; -PATH=/bin:/usr/bin:/sbin:/usr/sbin; - -# All the real work is done by helper functions defined herein (really!) -if [ ! -x @datadir@/sendmail/sendmail ]; then - echo "@datadir@/sendmail/sendmail not found/executable, aborting."; - exit 1; - fi; -. @datadir@/sendmail/sendmail; - -exit 0 - -# Control never reaches here, but lets keep lintian from bitching... -case "$1" in - start) - ;; - stop) - ;; - restart) - ;; - restart-if-running) - ;; - reload|force-reload) - ;; - *) - ;; - esac; -exit 0; diff --git a/debian/sendmail.links.in b/debian/sendmail.links.in deleted file mode 100644 index e465f5a..0000000 --- a/debian/sendmail.links.in +++ /dev/null @@ -1 +0,0 @@ -@datadir@/sendmail/examples @docdir@/sendmail/examples diff --git a/debian/sendmail.lintian-overrides b/debian/sendmail.lintian-overrides deleted file mode 100644 index dd94f51..0000000 --- a/debian/sendmail.lintian-overrides +++ /dev/null @@ -1,16 +0,0 @@ -# I *really* wish the next two items worked !!! -#sendmail source: dh_testversion-is-deprecated -#.*.changes: bad-distribution-in-changes-file private -# There's a dummy #DEBHELPER# at the bottom, can't use it directly -sendmail: duplicate-updaterc.d-calls-in-postinst sendmail -# suidregister conditionaly used to support older releases -sendmail: suidregister-used-in-maintainer-script postinst -# Expected, and required -sendmail: setuid-binary usr/sbin/sendmail 4755 root/mail -sendmail: setgid-binary usr/sbin/sendmail 2755 root/mail -sendmail: setgid-binary usr/lib/sm.bin/mailstats 2755 root/mail -# Not yet in lintian -sendmail-doc: prerm-does-not-remove-usr-doc-link -sendmail-doc: postinst-does-not-set-usr-doc-link -libmilter-dev: prerm-does-not-remove-usr-doc-link -libmilter-dev: postinst-does-not-set-usr-doc-link diff --git a/debian/sendmail.logrotate b/debian/sendmail.logrotate deleted file mode 100644 index 37f2537..0000000 --- a/debian/sendmail.logrotate +++ /dev/null @@ -1,86 +0,0 @@ -# Logrotate file for sendmail - -/var/log/mail/mail.alert { - notifempty - rotate 4 - size 100k - weekly - compress - missingok -} - -/var/log/mail/mail.crit { - notifempty - rotate 4 - size 100k - weekly - compress - missingok -} - -/var/log/mail/mail.debug { - notifempty - rotate 4 - size 100k - weekly - compress - missingok -} - -/var/log/mail/mail.emerg { - notifempty - rotate 4 - size 100k - weekly - compress - missingok -} - -/var/log/mail/mail.err { - notifempty - rotate 4 - size 100k - weekly - compress - missingok -} - -/var/log/mail/mail.info { - notifempty - rotate 4 - size 100k - weekly - compress - missingok -} - -/var/log/mail/mail.log { - create 0660 root mail - notifempty - rotate 4 - size 100k - weekly - compress - missingok - postrotate - /etc/init.d/sysklogd reload - endscript -} - -/var/log/mail/mail.notice { - notifempty - rotate 4 - size 100k - weekly - compress - missingok -} - -/var/log/mail/mail.warn { - notifempty - rotate 4 - size 100k - weekly - compress - missingok -} diff --git a/debian/sensible-mda.links b/debian/sensible-mda.links new file mode 100644 index 0000000..2f4cb3e --- /dev/null +++ b/debian/sensible-mda.links @@ -0,0 +1 @@ +usr/share/bug/sendmail usr/share/bug/sensible-mda diff --git a/debian/sensible_mda/Makefile.in b/debian/sensible_mda/Makefile.in index aa23f36..85aa871 100644 --- a/debian/sensible_mda/Makefile.in +++ b/debian/sensible_mda/Makefile.in @@ -1,61 +1,579 @@ -#!/usr/bin/make -f -#------------------------------------------------------------------------------ -# vim: syntax=make -# -# $Sendmail: Makefile,v @sm_version@ @sm_date@ @sm_time@ cowboy Exp $ -# -# Copyright (c) 1998-@SM_CPYRT@ Richard Nelson. All Rights Reserved. -# +# Makefile.in generated by automake 1.9.4 from Makefile.am. # @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +SOURCES = $(sensible_mda_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +sbin_PROGRAMS = sensible-mda$(EXEEXT) +subdir = sensible_mda +DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/sensible-mda.c.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/./build/mkinstalldirs +CONFIG_CLEAN_FILES = sensible-mda.c +am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)" +sbinPROGRAMS_INSTALL = $(INSTALL_PROGRAM) +PROGRAMS = $(sbin_PROGRAMS) +am_sensible_mda_OBJECTS = sensible-mda.$(OBJEXT) +sensible_mda_OBJECTS = $(am_sensible_mda_OBJECTS) +sensible_mda_LDADD = $(LDADD) +DEFAULT_INCLUDES = -I. -I$(srcdir) +depcomp = $(SHELL) $(top_srcdir)/./build/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(sensible_mda_SOURCES) +DIST_SOURCES = $(sensible_mda_SOURCES) +man8dir = $(mandir)/man8 +NROFF = nroff +MANS = $(dist_man_MANS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEBIAN = @DEBIAN@ +DEBIAN_DH = @DEBIAN_DH@ +DEB_BUILD_ARCH = @DEB_BUILD_ARCH@ +DEB_BUILD_GNU_CPU = @DEB_BUILD_GNU_CPU@ +DEB_BUILD_GNU_SYSTEM = @DEB_BUILD_GNU_SYSTEM@ +DEB_BUILD_GNU_TYPE = @DEB_BUILD_GNU_TYPE@ +DEB_HOST_ARCH = @DEB_HOST_ARCH@ +DEB_HOST_GNU_CPU = @DEB_HOST_GNU_CPU@ +DEB_HOST_GNU_SYSTEM = @DEB_HOST_GNU_SYSTEM@ +DEB_HOST_GNU_TYPE = @DEB_HOST_GNU_TYPE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SM_CPYRT = @SM_CPYRT@ +SM_DATE = @SM_DATE@ +SM_ENABLE_AUTH_FALSE = @SM_ENABLE_AUTH_FALSE@ +SM_ENABLE_AUTH_TRUE = @SM_ENABLE_AUTH_TRUE@ +SM_ENABLE_LDAP_FALSE = @SM_ENABLE_LDAP_FALSE@ +SM_ENABLE_LDAP_TRUE = @SM_ENABLE_LDAP_TRUE@ +SM_ENABLE_TLS_FALSE = @SM_ENABLE_TLS_FALSE@ +SM_ENABLE_TLS_TRUE = @SM_ENABLE_TLS_TRUE@ +SM_MAXVERS = @SM_MAXVERS@ +SM_MINVERS = @SM_MINVERS@ +SM_VERS = @SM_VERS@ +STRIP = @STRIP@ +VERSION = @VERSION@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_STRIP = @ac_ct_STRIP@ +ac_version = @ac_version@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +am_version = @am_version@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +buildtree = @buildtree@ +datadir = @datadir@ +docdir = @docdir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sm_auth_lib = @sm_auth_lib@ +sm_badepends = @sm_badepends@ +sm_build_arch = @sm_build_arch@ +sm_custom = @sm_custom@ +sm_databases = @sm_databases@ +sm_date = @sm_date@ +sm_depends = @sm_depends@ +sm_dist_name = @sm_dist_name@ +sm_dist_vers = @sm_dist_vers@ +sm_editmap_envdef = @sm_editmap_envdef@ +sm_editmap_libs = @sm_editmap_libs@ +sm_enable_auth = @sm_enable_auth@ +sm_enable_bind = @sm_enable_bind@ +sm_enable_dev = @sm_enable_dev@ +sm_enable_doc = @sm_enable_doc@ +sm_enable_hesiod = @sm_enable_hesiod@ +sm_enable_ipv6 = @sm_enable_ipv6@ +sm_enable_ldap = @sm_enable_ldap@ +sm_enable_maillock = @sm_enable_maillock@ +sm_enable_milter = @sm_enable_milter@ +sm_enable_ndbm = @sm_enable_ndbm@ +sm_enable_newdb = @sm_enable_newdb@ +sm_enable_nis = @sm_enable_nis@ +sm_enable_nisplus = @sm_enable_nisplus@ +sm_enable_regex = @sm_enable_regex@ +sm_enable_sfio = @sm_enable_sfio@ +sm_enable_shm = @sm_enable_shm@ +sm_enable_tcpd = @sm_enable_tcpd@ +sm_enable_tls = @sm_enable_tls@ +sm_envdef = @sm_envdef@ +sm_features = @sm_features@ +sm_ffr = @sm_ffr@ +sm_hesiod_parms = @sm_hesiod_parms@ +sm_host_arch = @sm_host_arch@ +sm_incdirs = @sm_incdirs@ +sm_ldap_lib = @sm_ldap_lib@ +sm_libmilter_envdef = @sm_libmilter_envdef@ +sm_libmilter_libs = @sm_libmilter_libs@ +sm_libs = @sm_libs@ +sm_libsm_envdef = @sm_libsm_envdef@ +sm_libsm_libs = @sm_libsm_libs@ +sm_libsmdb_envdef = @sm_libsmdb_envdef@ +sm_libsmdb_libs = @sm_libsmdb_libs@ +sm_libsmutil_envdef = @sm_libsmutil_envdef@ +sm_libsmutil_libs = @sm_libsmutil_libs@ +sm_m4_ffr = @sm_m4_ffr@ +sm_mail_local_envdef = @sm_mail_local_envdef@ +sm_mail_local_libs = @sm_mail_local_libs@ +sm_mailstats_envdef = @sm_mailstats_envdef@ +sm_mailstats_libs = @sm_mailstats_libs@ +sm_makemap_envdef = @sm_makemap_envdef@ +sm_makemap_libs = @sm_makemap_libs@ +sm_mapdef = @sm_mapdef@ +sm_newdb_lib = @sm_newdb_lib@ +sm_praliases_envdef = @sm_praliases_envdef@ +sm_praliases_libs = @sm_praliases_libs@ +sm_recommends = @sm_recommends@ +sm_revision = @sm_revision@ +sm_rmail_envdef = @sm_rmail_envdef@ +sm_rmail_libs = @sm_rmail_libs@ +sm_sendmail_envdef = @sm_sendmail_envdef@ +sm_sendmail_libs = @sm_sendmail_libs@ +sm_smrsh_envdef = @sm_smrsh_envdef@ +sm_smrsh_libs = @sm_smrsh_libs@ +sm_suggests = @sm_suggests@ +sm_time = @sm_time@ +sm_utc = @sm_utc@ +sm_vacation_envdef = @sm_vacation_envdef@ +sm_vacation_libs = @sm_vacation_libs@ +sm_version = @sm_version@ +sm_version_beta = @sm_version_beta@ +sm_version_major = @sm_version_major@ +sm_version_math = @sm_version_math@ +sm_version_minor = @sm_version_minor@ +sm_version_r = @sm_version_r@ +sm_version_v = @sm_version_v@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +# +# Shipped manpages # -# Rules file for Sendmail @sm_version@@sm_revision@(@sm_version_math@) -# on @sm_dist_name@ @sm_dist_vers@ -# via Debhelper V@DEBIAN_DH@ +dist_man_MANS = sensible-mda.8 # -# Note: the .in file supports Sendmail @SM_MINVERS@ - @SM_MAXVERS@ -# on Debian slink, potato, woody, testing, sid, ... -# but the generated file is customized to the version noted above. +# Program sources # -# Richard Nelson <cowboy@debian.org> @sm_date@ @sm_time@ (@sm_utc@) -#------------------------------------------------------------------------------ -#SHELL=/bin/sh -x +sensible_mda_SOURCES = sensible-mda.c +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sensible_mda/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu sensible_mda/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +sensible-mda.c: $(top_builddir)/config.status $(srcdir)/sensible-mda.c.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +install-sbinPROGRAMS: $(sbin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(sbindir)" || $(mkdir_p) "$(DESTDIR)$(sbindir)" + @list='$(sbin_PROGRAMS)'; for p in $$list; do \ + p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + if test -f $$p \ + ; then \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(sbindir)/$$f'"; \ + $(INSTALL_PROGRAM_ENV) $(sbinPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(sbindir)/$$f" || exit 1; \ + else :; fi; \ + done + +uninstall-sbinPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(sbin_PROGRAMS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \ + rm -f "$(DESTDIR)$(sbindir)/$$f"; \ + done + +clean-sbinPROGRAMS: + -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS) +sensible-mda$(EXEEXT): $(sensible_mda_OBJECTS) $(sensible_mda_DEPENDENCIES) + @rm -f sensible-mda$(EXEEXT) + $(LINK) $(sensible_mda_LDFLAGS) $(sensible_mda_OBJECTS) $(sensible_mda_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sensible-mda.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +uninstall-info-am: +install-man8: $(man8_MANS) $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man8dir)" || $(mkdir_p) "$(DESTDIR)$(man8dir)" + @list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.8*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 8*) ;; \ + *) ext='8' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst"; \ + done +uninstall-man8: + @$(NORMAL_UNINSTALL) + @list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.8*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 8*) ;; \ + *) ext='8' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f '$(DESTDIR)$(man8dir)/$$inst'"; \ + rm -f "$(DESTDIR)$(man8dir)/$$inst"; \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here -# Include Debian Autoconf settings -ifeq (yes, $(shell test -e ../build/autoconf.mk && echo 'yes')) - include ../build/autoconf.mk - endif +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -all: sensible-mda +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(MANS) +installdirs: + for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am -clean: - rm -rf core *~ sensible-mda; +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am -setup: ; +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: -build-indep: setup -build-arch: setup sensible-mda +clean-generic: -sensible-mda: sensible-mda.c - @rm -f $@; - $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $? $(LIBS) +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -install-indep: build-indep -install-arch: build-arch - $(INSTALL) -d ${libexecdir}; - $(INSTALL) -d ${mandir}/man8 - $(INSTALL_PROGRAM) sensible-mda ${libexecdir}; - $(INSTALL_DATA) sensible-mda.8 ${mandir}/man8; +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am -#------------- -# Below here is fairly generic really +clean-am: clean-generic clean-sbinPROGRAMS mostlyclean-am -source diff: - @echo >&2 'source and diff are obsolete - use dpkg-source -b'; false +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags -build: build-indep build-arch -install: install-indep install-arch -.PHONY: all -.PHONY: setup -.PHONY: clean build build-indep build-arch -.PHONY: install install-indep install-arch -.PHONY: source diff +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-man + +install-exec-am: install-sbinPROGRAMS + +install-info: install-info-am + +install-man: install-man8 + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-man uninstall-sbinPROGRAMS + +uninstall-man: uninstall-man8 + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-sbinPROGRAMS ctags distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-man install-man8 install-sbinPROGRAMS \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am uninstall-man \ + uninstall-man8 uninstall-sbinPROGRAMS + +# +# Debian targets, phase out +# +.PHONY: build-indep build-arch +.PHONY: install-indep install-arch +build-indep: +build-arch: sensible-mda +install-indep: +install-arch: install +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/debian/sensible_mda/sensible-mda.c.in b/debian/sensible_mda/sensible-mda.c.in index a31c718..40489a5 100644 --- a/debian/sensible_mda/sensible-mda.c.in +++ b/debian/sensible_mda/sensible-mda.c.in @@ -27,6 +27,7 @@ static char id[] = "@(#)$Id: sensible-mda.c,v @sm_version@ @sm_date@ @sm_time@ c #include <stdio.h> #include <stdlib.h> +#include <errno.h> #include <sys/stat.h> #include <sys/types.h> #include <limits.h> @@ -63,8 +64,6 @@ static unsigned char program[PATH_MAX]; static uid_t RealUid, RunAsUid; static gid_t RealGid, RunAsGid; -extern int errno; - int main (int argc, char *argv[]) { diff --git a/debian/source.lintian-overrides b/debian/source.lintian-overrides new file mode 100644 index 0000000..3ef019f --- /dev/null +++ b/debian/source.lintian-overrides @@ -0,0 +1,3 @@ +sendmail: newer-standards-version 3.6.10.0 +sendmail: dh_testversion-is-deprecated +sendmail: bad-distribution-in-changes-file private diff --git a/debian/sources b/debian/sources index 6005260..63cfbc1 100644 --- a/debian/sources +++ b/debian/sources @@ -1 +1 @@ -upstream tar sendmail.8.12.0.tar.gz +upstream tar sendmail.8.13.1.tar.gz diff --git a/debian/watch b/debian/watch new file mode 100644 index 0000000..e4483e3 --- /dev/null +++ b/debian/watch @@ -0,0 +1,10 @@ +# format version number, currently 2; this line is compulsory! +version=2 + +# Line continuations are performed with \ + +# This the format for an FTP site: +# Full-site-with-pattern [Version [Action]] +# NOTE...NOTE...NOTE...NOTE: This requires the --no-symlink option +opts=pasv ftp://ftp.sendmail.org/pub/sendmail/sendmail\.(.*)\.tar\.gz debian +opts=pasv ftp://ftp.sendmail.org/pub/sendmail/sendmail\.(.*)\.tar(\.gz)?\.sig debian |