summaryrefslogtreecommitdiffstats
path: root/contrib/sendmail/makemap
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/sendmail/makemap')
-rwxr-xr-xcontrib/sendmail/makemap/Build508
-rw-r--r--contrib/sendmail/makemap/Makefile17
-rw-r--r--contrib/sendmail/makemap/Makefile.m4130
-rw-r--r--contrib/sendmail/makemap/makemap.8214
-rw-r--r--contrib/sendmail/makemap/makemap.c1035
5 files changed, 457 insertions, 1447 deletions
diff --git a/contrib/sendmail/makemap/Build b/contrib/sendmail/makemap/Build
index ab8a49d..3bb6e85 100755
--- a/contrib/sendmail/makemap/Build
+++ b/contrib/sendmail/makemap/Build
@@ -1,513 +1,13 @@
#!/bin/sh
-# Copyright (c) 1998 Sendmail, Inc. All rights reserved.
-# Copyright (c) 1993, 1996-1997 Eric P. Allman. All rights reserved.
-# Copyright (c) 1993
-# The Regents of the University of California. All rights reserved.
+# 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.
#
#
-# @(#)Build 8.93 (Berkeley) 6/24/98
-#
-
-#
-# A quick-and-dirty script to compile sendmail and related programs
-# in the presence of multiple architectures. To use, just use
-# "sh Build".
-#
-
-trap "rm -f $obj/.settings$$; exit" 1 2 3 15
-
-cflag=""
-mflag=""
-sflag=""
-makeargs=""
-libdirs=""
-incdirs=""
-libsrch=""
-siteconfig=""
-EX_USAGE=64
-EX_NOINPUT=66
-EX_UNAVAILABLE=69
-
-while [ ! -z "$1" ]
-do
- case $1
- in
- -c) # clean out existing $obj tree
- cflag=1
- shift
- ;;
-
- -m) # show Makefile name only
- mflag=1
- shift
- ;;
-
- -E*) # environment variables to pass into Build
- arg=`echo $1 | sed 's/^-E//'`
- if [ -z "$arg" ]
- then
- shift # move to argument
- arg=$1
- fi
- if [ -z "$arg" ]
- then
- echo "Empty -E flag" >&2
- exit $EX_USAGE
- else
- case $arg
- in
- *=*) # check format
- eval $arg
- export `echo $arg | sed 's;=.*;;'`
- ;;
- *) # bad format
- echo "Bad format for -E argument ($arg)" >&2
- exit $EX_USAGE
- ;;
- esac
- shift
- fi
- ;;
-
- -L*) # set up LIBDIRS
- libdirs="$libdirs $1"
- shift
- ;;
-
- -I*) # set up INCDIRS
- incdirs="$incdirs $1"
- shift
- ;;
-
- -f*) # select site config file
- arg=`echo $1 | sed 's/^-f//'`
- if [ -z "$arg" ]
- then
- shift # move to argument
- arg=$1
- fi
- if [ "$siteconfig" ]
- then
- echo "Only one -f flag allowed" >&2
- exit $EX_USAGE
- else
- siteconfig=$arg
- if [ -z "$siteconfig" ]
- then
- echo "Missing argument for -f flag" >&2
- exit $EX_USAGE
- elif [ ! -f "$siteconfig" ]
- then
- echo "${siteconfig}: File not found"
- exit $EX_NOINPUT
- else
- shift # move past argument
- fi
- fi
- ;;
-
- -S) # skip auto-configure
- sflag="-s"
- shift
- ;;
-
- *) # pass argument to make
- makeargs="$makeargs \"$1\""
- shift
- ;;
- esac
-done
-
-#
-# Do heuristic guesses !ONLY! for machines that do not have uname
-#
-if [ -d /NextApps -a ! -f /bin/uname -a ! -f /usr/bin/uname ]
-then
- # probably a NeXT box
- arch=`hostinfo | sed -n 's/.*Processor type: \([^ ]*\).*/\1/p'`
- os=NeXT
- rel=`hostinfo | sed -n 's/.*NeXT Mach \([0-9\.]*\).*/\1/p'`
-elif [ -f /usr/sony/bin/machine -a -f /etc/osversion ]
-then
- # probably a Sony NEWS 4.x
- os=NEWS-OS
- rel=`awk '{ print $3}' /etc/osversion`
- arch=`/usr/sony/bin/machine`
-elif [ -d /usr/omron -a -f /bin/luna ]
-then
- # probably a Omron LUNA
- os=LUNA
- if [ -f /bin/luna1 ] && /bin/luna1
- then
- rel=unios-b
- arch=luna1
- elif [ -f /bin/luna2 ] && /bin/luna2
- then
- rel=Mach
- arch=luna2
- elif [ -f /bin/luna88k ] && /bin/luna88k
- then
- rel=Mach
- arch=luna88k
- fi
-elif [ -d /usr/apollo -a -d \`node_data ]
-then
- # probably a Apollo/DOMAIN
- os=DomainOS
- arch=$ISP
- rel=`/usr/apollo/bin/bldt | grep Domain | awk '{ print $4 }' | sed -e 's/,//g'`
-fi
-
-if [ ! "$arch" -a ! "$os" -a ! "$rel" ]
-then
- arch=`uname -m | sed -e 's/ //g'`
- os=`uname -s | sed -e 's/\//-/g' -e 's/ //g'`
- rel=`uname -r | sed -e 's/(/-/g' -e 's/)//g'`
-fi
-
-#
-# Tweak the values we have already got. PLEASE LIMIT THESE to
-# tweaks that are absolutely necessary because your system uname
-# routine doesn't return something sufficiently unique. Don't do
-# it just because you don't like the name that is returned. You
-# can combine the architecture name with the os name to create a
-# unique Makefile name.
-#
-
-# tweak machine architecture
-case $arch
-in
- sun4*) arch=sun4;;
-
- 9000/*) arch=`echo $arch | sed -e 's/9000.//' -e 's/..$/xx/'`;;
-
- DS/907000) arch=ds90;;
-
- NILE*) arch=NILE
- os=`uname -v`;;
-esac
-
-# tweak operating system type and release
-node=`uname -n | sed -e 's/\//-/g' -e 's/ //g'`
-if [ "$os" = "$node" -a "$arch" = "i386" -a "$rel" = 3.2 -a "`uname -v`" = 2 ]
-then
- # old versions of SCO UNIX set uname -s the same as uname -n
- os=SCO_SV
-fi
-if [ "$rel" = 4.0 ]
-then
- case $arch in
- 3[34]??|3[34]??,*)
- if [ -d /usr/sadm/sysadm/add-ons/WIN-TCP ]
- then
- os=NCR.MP-RAS.2.x
- elif [ -d /usr/sadm/sysadm/add-ons/inet ]
- then
- os=NCR.MP-RAS.3.x
- fi
- ;;
- esac
-fi
-
-case $os
-in
- DYNIX-ptx) os=PTX;;
- Paragon*) os=Paragon;;
- HP-UX) rel=`echo $rel | sed -e 's/^[^.]*\.0*//'`;;
- AIX) rela=$rel
- rel=`uname -v`
- case $rel in
- 2) arch=""
- ;;
- 4) if [ "$rela" = "3" ]
- then
- arch=$rela
- fi
- ;;
- esac
- rel=$rel.$rela
- ;;
- BSD-386) os=BSD-OS;;
- SCO_SV) os=SCO; rel=`uname -X | sed -n 's/Release = 3.2v//p'`;;
- UNIX_System_V) if [ "$arch" = "ds90" ]
- then
- os="UXPDS"
- rel=`uname -v | sed -e 's/\(V.*\)L.*/\1/'`
- fi;;
- SINIX-?) os=SINIX;;
- DomainOS) case $rel in
- 10.4*) rel=10.4;;
- esac
- ;;
-esac
-
-# get "base part" of operating system release
-rroot=`echo $rel | sed -e 's/\.[^.]*$//'`
-rbase=`echo $rel | sed -e 's/\..*//'`
-if [ "$rroot" = "$rbase" ]
-then
- rroot=$rel
-fi
-
-# heuristic tweaks to clean up names -- PLEASE LIMIT THESE!
-if [ "$os" = "unix" ]
-then
- # might be Altos System V
- case $rel
- in
- 5.3*) os=Altos;;
- esac
-elif [ -r /unix -a -r /usr/lib/libseq.a -a -r /lib/cpp ]
-then
- # might be a DYNIX/ptx 2.x system, which has a broken uname
- if strings /lib/cpp | grep _SEQUENT_ > /dev/null
- then
- os=PTX
- fi
-elif [ -d /usr/nec ]
-then
- # NEC machine -- what is it running?
- if [ "$os" = "UNIX_System_V" ]
- then
- os=EWS-UX_V
- elif [ "$os" = "UNIX_SV" ]
- then
- os=UX4800
- fi
-elif [ "$arch" = "mips" ]
-then
- case $rel
- in
- 4_*)
- if [ `uname -v` = "UMIPS" ]
- then
- os=RISCos
- fi;;
- esac
-fi
-
-# see if there is a "user suffix" specified
-if [ "${SENDMAIL_SUFFIX-}x" = "x" ]
-then
- sfx=""
-else
- sfx=".${SENDMAIL_SUFFIX}"
-fi
-
-echo "Configuration: os=$os, rel=$rel, rbase=$rbase, rroot=$rroot, arch=$arch, sfx=$sfx"
-
-
-SMROOT=${SMROOT-..}
-BUILDTOOLS=${BUILDTOOLS-$SMROOT/BuildTools}
-export SMROOT BUILDTOOLS
-
-# see if we are in a Build-able directory
-if [ ! -f Makefile.m4 ]; then
- echo "Makefile.m4 not found. Build can only be run from a source directory."
- exit $EX_UNAVAILABLE
-fi
-
-# now try to find a reasonable object directory
-if [ -r obj.$os.$rel.$arch$sfx ]; then
- obj=obj.$os.$rel.$arch$sfx
-elif [ -r obj.$os.$rroot.$arch$sfx ]; then
- obj=obj.$os.$rroot.$arch$sfx
-elif [ -r obj.$os.$rbase.x.$arch$sfx ]; then
- obj=obj.$os.$rbase.x.$arch$sfx
-elif [ -r obj.$os.$rel$sfx ]; then
- obj=obj.$os.$rel$sfx
-elif [ -r obj.$os.$rbase.x$sfx ]; then
- obj=obj.$os.$rbase.x$sfx
-elif [ -r obj.$os.$arch$sfx ]; then
- obj=obj.$os.$arch$sfx
-elif [ -r obj.$rel.$arch$sfx ]; then
- obj=obj.$rel.$arch$sfx
-elif [ -r obj.$rbase.x.$arch$sfx ]; then
- obj=obj.$rbase.x.$arch$sfx
-elif [ -r obj.$os$sfx ]; then
- obj=obj.$os$sfx
-elif [ -r obj.$arch$sfx ]; then
- obj=obj.$arch$sfx
-elif [ -r obj.$rel$sfx ]; then
- obj=obj.$rel$sfx
-elif [ -r obj$sfx ]; then
- obj=obj$sfx
-fi
-if [ -z "$obj" -o "$cflag" ]
-then
- if [ -n "$obj" ]
- then
- echo "Clearing out existing $obj tree"
- rm -rf $obj
- else
- # no existing obj directory -- try to create one if Makefile found
- obj=obj.$os.$rel.$arch$sfx
- fi
- if [ -r $BUILDTOOLS/OS/$os.$rel.$arch$sfx ]; then
- oscf=$os.$rel.$arch$sfx
- elif [ -r $BUILDTOOLS/OS/$os.$rel.$arch ]; then
- oscf=$os.$rel.$arch
- elif [ -r $BUILDTOOLS/OS/$os.$rroot.$arch$sfx ]; then
- oscf=$os.$rroot.$arch$sfx
- elif [ -r $BUILDTOOLS/OS/$os.$rroot.$arch ]; then
- oscf=$os.$rroot.$arch
- elif [ -r $BUILDTOOLS/OS/$os.$rbase.x.$arch$sfx ]; then
- oscf=$os.$rbase.x.$arch$sfx
- elif [ -r $BUILDTOOLS/OS/$os.$rbase.x.$arch ]; then
- oscf=$os.$rbase.x.$arch
- elif [ -r $BUILDTOOLS/OS/$os.$rel$sfx ]; then
- oscf=$os.$rel$sfx
- elif [ -r $BUILDTOOLS/OS/$os.$rel ]; then
- oscf=$os.$rel
- elif [ -r $BUILDTOOLS/OS/$os.$rroot$sfx ]; then
- oscf=$os.$rroot$sfx
- elif [ -r $BUILDTOOLS/OS/$os.$rroot ]; then
- oscf=$os.$rroot
- elif [ -r $BUILDTOOLS/OS/$os.$rbase.x$sfx ]; then
- oscf=$os.$rbase.x$sfx
- elif [ -r $BUILDTOOLS/OS/$os.$rbase.x ]; then
- oscf=$os.$rbase.x
- elif [ -r $BUILDTOOLS/OS/$os.$arch$sfx ]; then
- oscf=$os.$arch$sfx
- elif [ -r $BUILDTOOLS/OS/$os.$arch ]; then
- oscf=$os.$arch
- elif [ -r $BUILDTOOLS/OS/$rel.$arch$sfx ]; then
- oscf=$rel.$arch$sfx
- elif [ -r $BUILDTOOLS/OS/$rel.$arch ]; then
- oscf=$rel.$arch
- elif [ -r $BUILDTOOLS/OS/$rroot.$arch$sfx ]; then
- oscf=$rroot.$arch$sfx
- elif [ -r $BUILDTOOLS/OS/$rroot.$arch ]; then
- oscf=$rroot.$arch
- elif [ -r $BUILDTOOLS/OS/$rbase.x.$arch$sfx ]; then
- oscf=$rbase.x.$arch$sfx
- elif [ -r $BUILDTOOLS/OS/$rbase.x.$arch ]; then
- oscf=$rbase.x.$arch
- elif [ -r $BUILDTOOLS/OS/$os$sfx ]; then
- oscf=$os$sfx
- elif [ -r $BUILDTOOLS/OS/$os ]; then
- oscf=$os
- elif [ -r $BUILDTOOLS/OS/$arch$sfx ]; then
- oscf=$arch$sfx
- elif [ -r $BUILDTOOLS/OS/$arch ]; then
- oscf=$arch
- elif [ -r $BUILDTOOLS/OS/$rel$sfx ]; then
- oscf=$rel$sfx
- elif [ -r $BUILDTOOLS/OS/$rel ]; then
- oscf=$rel
- elif [ -r $BUILDTOOLS/OS/$rel$sfx ]; then
- oscf=$rel$sfx
- else
- echo "Cannot determine how to support $arch.$os.$rel" >&2
- exit $EX_UNAVAILABLE
- fi
- M4=`sh $BUILDTOOLS/bin/find_m4.sh`
- ret=$?
- if [ $ret -ne 0 ]
- then
- exit $ret
- fi
- echo "Using M4=$M4"
- export M4
- if [ "$mflag" ]
- then
- echo "Will run in virgin $obj using $BUILDTOOLS/OS/$oscf"
- exit 0
- fi
- if [ "$ABI" ]
- then
- echo "Using ABI $ABI"
- fi
- echo "Creating $obj using $BUILDTOOLS/OS/$oscf"
- mkdir $obj
- (cd $obj; ln -s ../*.[ch158] .)
- if [ -f sendmail.hf ]
- then
- (cd $obj; ln -s ../sendmail.hf .)
- fi
-
- rm -f $obj/.settings$$
- echo 'divert(-1)' > $obj/.settings$$
- cat $BUILDTOOLS/M4/header.m4 >> $obj/.settings$$
- if [ "$ABI" ]
- then
- echo "define(\`confABI', \`$ABI')" >> $obj/.settings$$
- fi
- cat $BUILDTOOLS/OS/$oscf >> $obj/.settings$$
-
- if [ -z "$siteconfig" ]
- then
- # none specified, use defaults
- if [ -f $BUILDTOOLS/Site/site.$oscf$sfx.m4 ]
- then
- siteconfig=$BUILDTOOLS/Site/site.$oscf$sfx.m4
- elif [ -f $BUILDTOOLS/Site/site.$oscf.m4 ]
- then
- siteconfig=$BUILDTOOLS/Site/site.$oscf.m4
- fi
- if [ -f $BUILDTOOLS/Site/site.config.m4 ]
- then
- siteconfig="$BUILDTOOLS/Site/site.config.m4 $siteconfig"
- fi
- fi
- if [ ! -z "$siteconfig" ]
- then
- echo "Including $siteconfig"
- cat $siteconfig >> $obj/.settings$$
- fi
- if [ "$libdirs" ]
- then
- echo "define(\`confLIBDIRS', confLIBDIRS \`\`$libdirs'')" >> $obj/.settings$$
- fi
- if [ "$incdirs" ]
- then
- echo "define(\`confINCDIRS', confINCDIRS \`\`$incdirs'')" >> $obj/.settings$$
- fi
- echo 'divert(0)dnl' >> $obj/.settings$$
- libdirs=`(cat $obj/.settings$$; echo "_SRIDBIL_= confLIBDIRS" ) | \
- sed -e 's/\(.\)include/\1_include_/g' -e 's/#define/#_define_/g' | \
- ${M4} -DconfBUILDTOOLSDIR=$BUILDTOOLS - | \
- grep "^_SRIDBIL_=" | \
- sed -e 's/#_define_/#define/g' -e 's/_include_/include/g' -e "s/^_SRIDBIL_=//"`
- libsrch=`(cat $obj/.settings$$; echo "_HCRSBIL_= confLIBSEARCH" ) | \
- sed -e 's/\(.\)include/\1_include_/g' -e 's/#define/#_define_/g' | \
- ${M4} -DconfBUILDTOOLSDIR=$BUILDTOOLS - | \
- grep "^_HCRSBIL_=" | \
- sed -e 's/#_define_/#define/g' -e 's/_include_/include/g' -e "s/^_HCRSBIL_=//"`
- echo 'divert(-1)' >> $obj/.settings$$
- LIBDIRS="$libdirs" LIBSRCH="$libsrch" SITECONFIG="$siteconfig" sh $BUILDTOOLS/bin/configure.sh $sflag $oscf >> $obj/.settings$$
- echo 'divert(0)dnl' >> $obj/.settings$$
- sed -e 's/\(.\)include/\1_include_/g' -e 's/#define/#_define_/g' $obj/.settings$$ | \
- ${M4} -DconfBUILDTOOLSDIR=$BUILDTOOLS - Makefile.m4 | \
- sed -e 's/#_define_/#define/g' -e 's/_include_/include/g' > $obj/Makefile
- if [ $? -ne 0 -o ! -s $obj/Makefile ]
- then
- echo "ERROR: ${M4} failed; You may need a newer version of M4, at least as new as System V or GNU" 1>&2
- rm -rf $obj
- exit $EX_UNAVAILABLE
- fi
- rm -f $obj/.settings$$
- echo "Making dependencies in $obj"
- (cd $obj; ${MAKE-make} depend)
-fi
-
-if [ "$mflag" ]
-then
- makefile=`ls -l $obj/Makefile | sed 's/.* //'`
- if [ -z "$makefile" ]
- then
- echo "ERROR: $obj exists but has no Makefile" >&2
- exit $EX_NOINPUT
- fi
- echo "Will run in existing $obj using $makefile"
- exit 0
-fi
+# $Id: Build,v 8.4 1999/03/02 02:33:50 peterh Exp $
-echo "Making in $obj"
-cd $obj
-eval exec ${MAKE-make} $makeargs
+exec ../devtools/bin/Build $*
diff --git a/contrib/sendmail/makemap/Makefile b/contrib/sendmail/makemap/Makefile
new file mode 100644
index 0000000..a6960c1
--- /dev/null
+++ b/contrib/sendmail/makemap/Makefile
@@ -0,0 +1,17 @@
+# $Id: Makefile,v 8.7 1999/09/23 22:36:37 ca Exp $
+
+SHELL= /bin/sh
+BUILD= ./Build
+OPTIONS= $(CONFIG) $(FLAGS)
+
+all: FRC
+ $(SHELL) $(BUILD) $(OPTIONS) $@
+clean: FRC
+ $(SHELL) $(BUILD) $(OPTIONS) $@
+install: FRC
+ $(SHELL) $(BUILD) $(OPTIONS) $@
+
+fresh: FRC
+ $(SHELL) $(BUILD) $(OPTIONS) -c
+
+FRC:
diff --git a/contrib/sendmail/makemap/Makefile.m4 b/contrib/sendmail/makemap/Makefile.m4
index 983ffdf..4077239 100644
--- a/contrib/sendmail/makemap/Makefile.m4
+++ b/contrib/sendmail/makemap/Makefile.m4
@@ -1,110 +1,20 @@
-#
-# This Makefile is designed to work on the old "make" program.
-#
-# @(#)Makefile.m4 8.21 (Berkeley) 7/12/1998
-#
-
-# C compiler
-CC= confCC
-
-# Shell
-SHELL= confSHELL
-
-# use O=-O (usual) or O=-g (debugging)
-O= ifdef(`confOPTIMIZE', `confOPTIMIZE', `-O')
-
-# location of sendmail source directory
-SRCDIR= ifdef(`confSRCDIR', `confSRCDIR', `../../src')
-
-# define the database mechanisms available for map & alias lookups:
-# -DNDBM -- use new DBM
-# -DNEWDB -- use new Berkeley DB
-# The really old (V7) DBM library is no longer supported.
-#
-MAPDEF= ifdef(`confMAPDEF', `confMAPDEF')
-
-# environment definitions (e.g., -D_AIX3)
-ENVDEF= -DNOT_SENDMAIL ifdef(`confENVDEF', `confENVDEF')
-
-# see also conf.h for additional compilation flags
-
-# include directories
-INCDIRS=-I${SRCDIR} confINCDIRS
-
-# loader options
-LDOPTS= ifdef(`confLDOPTS', `confLDOPTS')
-
-# library directories
-LIBDIRS=confLIBDIRS
-
-# libraries required on your system
-LIBS= ifdef(`confLIBS', `confLIBS')
-
-# location of makemap binary (usually /usr/sbin or /usr/etc)
-SBINDIR=${DESTDIR}ifdef(`confSBINDIR', `confSBINDIR', `/usr/sbin')
-
-# additional .o files needed
-OBJADD= ifdef(`confOBJADD', `confOBJADD')
-
-undivert(1)
-
-################### end of user configuration flags ######################
-
-BUILDBIN=confBUILDBIN
-COPTS= -I. ${INCDIRS} ${MAPDEF} ${ENVDEF}
-CFLAGS= $O ${COPTS}
-
-BEFORE= confBEFORE safefile.c snprintf.c
-OBJS= makemap.o safefile.o snprintf.o ${OBJADD}
-
-NROFF= ifdef(`confNROFF', `confNROFF', `groff -Tascii')
-MANDOC= ifdef(`confMANDOC', `confMANDOC', `-mandoc')
-
-INSTALL=ifdef(`confINSTALL', `confINSTALL', `install')
-BINOWN= ifdef(`confUBINOWN', `confUBINOWN', `bin')
-BINGRP= ifdef(`confUBINGRP', `confUBINGRP', `bin')
-BINMODE=ifdef(`confUBINMODE', `confUBINMODE', `555')
-
-MANOWN= ifdef(`confMANOWN', `confMANOWN', `bin')
-MANGRP= ifdef(`confMANGRP', `confMANGRP', `bin')
-MANMODE=ifdef(`confMANMODE', `confMANMODE', `444')
-
-MANROOT=${DESTDIR}ifdef(`confMANROOT', `confMANROOT', `/usr/share/man/cat')
-MAN8= ${MANROOT}ifdef(`confMAN8', `confMAN8', `8')
-MAN8EXT=ifdef(`confMAN8EXT', `confMAN8EXT', `8')
-MAN8SRC=ifdef(`confMAN8SRC', `confMAN8SRC', `0')
-
-ALL= makemap makemap.${MAN8SRC}
-
-all: ${ALL}
-
-makemap: ${BEFORE} ${OBJS}
- ${CC} -o makemap ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS}
-
-safefile.c: ${SRCDIR}/safefile.c
- -ln -s ${SRCDIR}/safefile.c safefile.c
-
-snprintf.c: ${SRCDIR}/snprintf.c
- -ln -s ${SRCDIR}/snprintf.c snprintf.c
-
-undivert(3)
-
-makemap.${MAN8SRC}: makemap.8
- ${NROFF} ${MANDOC} makemap.8 > makemap.${MAN8SRC}
-
-install: install-makemap install-docs
-
-install-makemap: makemap
- ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} makemap ${SBINDIR}
-
-install-docs: makemap.${MAN8SRC}
-ifdef(`confNO_MAN_INSTALL', `dnl',
-` ${INSTALL} -c -o ${MANOWN} -g ${MANGRP} -m ${MANMODE} makemap.${MAN8SRC} ${MAN8}/makemap.${MAN8EXT}')
-
-clean:
- rm -f ${OBJS} makemap makemap.${MAN8SRC}
-
-################ Dependency scripts
-include(confBUILDTOOLSDIR/M4/depend/ifdef(`confDEPEND_TYPE', `confDEPEND_TYPE',
-`generic').m4)dnl
-################ End of dependency scripts
+include(confBUILDTOOLSDIR`/M4/switch.m4')
+
+# sendmail dir
+SMSRCDIR= ifdef(`confSMSRCDIR', `confSMSRCDIR', `${SRCDIR}/sendmail')
+PREPENDDEF(`confENVDEF', `confMAPDEF')
+PREPENDDEF(`confINCDIRS', `-I${SMSRCDIR} ')
+
+bldPRODUCT_START(`executable', `makemap')
+define(`bldSOURCES', `makemap.c ')
+define(`bldINSTALL_DIR', `S')
+bldPUSH_SMLIB(`smutil')
+bldPUSH_SMLIB(`smdb')
+APPENDDEF(`confENVDEF', `-DNOT_SENDMAIL')
+bldPRODUCT_END
+
+bldPRODUCT_START(`manpage', `makemap')
+define(`bldSOURCES', `makemap.8')
+bldPRODUCT_END
+
+bldFINISH
diff --git a/contrib/sendmail/makemap/makemap.8 b/contrib/sendmail/makemap/makemap.8
index 81f53a8..9f72208 100644
--- a/contrib/sendmail/makemap/makemap.8
+++ b/contrib/sendmail/makemap/makemap.8
@@ -1,4 +1,5 @@
-.\" Copyright (c) 1998 Sendmail, Inc. All rights reserved.
+.\" Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
+.\" All rights reserved.
.\" Copyright (c) 1988, 1991, 1993
.\" The Regents of the University of California. All rights reserved.
.\"
@@ -7,121 +8,144 @@
.\" the sendmail distribution.
.\"
.\"
-.\" @(#)makemap.8 8.12 (Berkeley) 11/13/1998
+.\" $Id: makemap.8,v 8.21.16.1 2000/05/10 20:31:35 ca Exp $
.\"
-.Dd November 16, 1992
-.Dt MAKEMAP 8
-.Os BSD 4.4
-.Sh NAME
-.Nm makemap
-.Nd create database maps for sendmail
-.Sh SYNOPSIS
-.Nm
-.Op Fl N
-.if \nP .Op Fl c Ar cachesize
-.Op Fl d
-.Op Fl f
-.if \nP .Op Fl l
-.Op Fl o
-.Op Fl r
-.Op Fl s
-.Op Fl v
-.Ar maptype
-.Ar mapname
-.Sh DESCRIPTION
-.Nm
+.TH MAKEMAP 8 "November 16, 1992"
+.SH NAME
+.B makemap
+\- create database maps for sendmail
+.SH SYNOPSIS
+.B makemap
+.RB [ \-C
+.IR file ]
+.RB [ \-N ]
+.RB [ \-c
+.IR cachesize ]
+.RB [ \-d ]
+.RB [ \-e ]
+.RB [ \-f ]
+.RB [ \-l ]
+.RB [ \-o ]
+.RB [ \-r ]
+.RB [ \-s ]
+.RB [ \-u ]
+.RB [ \-v ]
+.I
+maptype mapnam
+.SH DESCRIPTION
+.B Makemap
creates the database maps used by the keyed map lookups in
-.Xr sendmail 8 .
+sendmail(8).
It reads input from the standard input
and outputs them to the indicated
-.Ar mapname .
-.Pp
+.I mapname.
+.PP
Depending on how it is compiled,
-.Nm
-handles up to three different database formats,
+.B makemap
+handles up to three different database formats,
selected using the
-.Ar maptype
-parameter.
+.I maptype
+parameter.
They may be
-.Bl -tag -width Fl
-.It Li dbm
-DBM format maps.
-This requires the
-.Xr ndbm 3
+.TP
+dbm
+DBM format maps.
+This requires the
+ndbm(3)
library.
-.It Li btree
-B-Tree format maps.
-This requires the new Berkeley DB
+.TP
+btree
+B-Tree format maps.
+This requires the new Berkeley DB
library.
-.It Li hash
-Hash format maps.
-This also requires the Berkeley DB
+.TP
+hash
+Hash format maps.
+This also requires the Berkeley DB
library.
-.El
-.Pp
+.PP
In all cases,
-.Nm
-reads lines from the standard input consisting of two
-words separated by white space.
-The first is the database key,
-the second is the value.
-The value may contain
-``%\fIn\fP''
-strings to indicated parameter substitution.
-Literal percents should be doubled
+.B makemap
+reads lines from the standard input consisting of two
+words separated by white space.
+The first is the database key,
+the second is the value.
+The value may contain
+``%\fIn\fP''
+strings to indicate parameter substitution.
+Literal percents should be doubled
(``%%'').
Blank lines and lines beginning with ``#'' are ignored.
-.Ss Flags
-.Bl -tag -width Fl
-.It Fl N
-Include the null byte that terminates strings
-in the map.
-This must match the \-N flag in the sendmail.cf
+.PP
+If the
+.I TrustedUser
+option is set in the sendmail configuration file and
+.B makemap
+is invoked as root, the generated files will be owned by
+the specified
+.IR TrustedUser.
+.SS Flags
+.TP
+.B \-C
+Use the specified sendmail configuration file for
+looking up the TrustedUser option.
+.TP
+.B \-N
+Include the null byte that terminates strings
+in the map.
+This must match the \-N flag in the sendmail.cf
``K'' line.
-.if \nP \
-\{\
-.It Fl c
+.TP
+.B \-c
Use the specified hash and B-Tree cache size.
-.\}
-.It Fl d
-Allow duplicate keys in the map.
-This is only allowed on B-Tree format maps.
-If two identical keys are read,
+.TP
+.B \-d
+Allow duplicate keys in the map.
+This is only allowed on B-Tree format maps.
+If two identical keys are read,
they will both be inserted into the map.
-.It Fl f
-Normally all upper case letters in the key
-are folded to lower case.
-This flag disables that behaviour.
-This is intended to mesh with the
-\-f flag in the
-\fBK\fP
-line in sendmail.cf.
+.TP
+.B \-e
+Allow empty value (right hand side).
+.TP
+.B \-f
+Normally all upper case letters in the key
+are folded to lower case.
+This flag disables that behaviour.
+This is intended to mesh with the
+\-f flag in the
+.B K
+line in sendmail.cf.
The value is never case folded.
-.if \nP \
-\{\
-.It Fl l
+.TP
+.B \-l
List supported map types.
-.\}
-.It Fl o
-Append to an old file.
+.TP
+.B \-o
+Append to an old file.
This allows you to augment an existing file.
-.It Fl r
-Allow replacement of existing keys.
+.TP
+.B \-r
+Allow replacement of existing keys.
Normally
-.Nm
-complains if you repeat a key,
+.B makemap
+complains if you repeat a key,
and does not do the insert.
-.It Fl s
-Ignore safety checks on maps being created.
-This includes checking for hard or symbolic
+.TP
+.B \-s
+Ignore safety checks on maps being created.
+This includes checking for hard or symbolic
links in world writable directories.
-.It Fl v
+.TP
+.B \-u
+dump (unmap) the content of the database to standard output.
+.TP
+.B \-v
Verbosely print what it is doing.
-.El
-.Sh SEE ALSO
-.Xr sendmail 8
-.Sh HISTORY
+.SH SEE ALSO
+sendmail(8)
+.SH HISTORY
The
-.Nm
-command appeared in
-.Bx 4.4 .
+.B makemap
+command appeared in
+4.4BSD.
diff --git a/contrib/sendmail/makemap/makemap.c b/contrib/sendmail/makemap/makemap.c
index aaaba32..13a397e 100644
--- a/contrib/sendmail/makemap/makemap.c
+++ b/contrib/sendmail/makemap/makemap.c
@@ -1,5 +1,6 @@
/*
- * Copyright (c) 1998 Sendmail, Inc. All rights reserved.
+ * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
+ * All rights reserved.
* Copyright (c) 1992 Eric P. Allman. All rights reserved.
* Copyright (c) 1992, 1993
* The Regents of the University of California. All rights reserved.
@@ -11,44 +12,33 @@
*/
#ifndef lint
-static char sccsid[] = "@(#)makemap.c 8.71 (Berkeley) 11/29/1998";
-#endif /* not lint */
+static char copyright[] =
+"@(#) Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.\n\
+ All rights reserved.\n\
+ Copyright (c) 1992 Eric P. Allman. All rights reserved.\n\
+ Copyright (c) 1992, 1993\n\
+ The Regents of the University of California. All rights reserved.\n";
+#endif /* ! lint */
+
+#ifndef lint
+static char id[] = "@(#)$Id: makemap.c,v 8.135.4.10 2000/07/18 05:41:39 gshapiro Exp $";
+#endif /* ! lint */
+
#include <sys/types.h>
-#include <sys/errno.h>
#ifndef ISC_UNIX
# include <sys/file.h>
-#endif
-#include "sendmail.h"
-#include "pathnames.h"
-
-#ifdef NDBM
-# include <ndbm.h>
-#endif
-
-#ifdef NEWDB
-# include <db.h>
-# ifndef DB_VERSION_MAJOR
-# define DB_VERSION_MAJOR 1
-# endif
-#endif
-
-enum type { T_DBM, T_BTREE, T_HASH, T_ERR, T_UNKNOWN };
-
-union dbent
-{
-#ifdef NDBM
- datum dbm;
-#endif
-#ifdef NEWDB
- DBT db;
-#endif
- struct
- {
- char *data;
- size_t size;
- } xx;
-};
+#endif /* ! ISC_UNIX */
+#include <ctype.h>
+#include <stdlib.h>
+#include <unistd.h>
+#ifdef EX_OK
+# undef EX_OK /* unistd.h may have another use for this */
+#endif /* EX_OK */
+#include <sysexits.h>
+#include <sendmail/sendmail.h>
+#include <sendmail/pathnames.h>
+#include <libsmdb/smdb.h>
uid_t RealUid;
gid_t RealGid;
@@ -58,11 +48,32 @@ uid_t RunAsGid;
char *RunAsUserName;
int Verbose = 2;
bool DontInitGroups = FALSE;
-long DontBlameSendmail = DBS_SAFE;
-u_char tTdvect[100];
uid_t TrustedUid = 0;
+BITMAP256 DontBlameSendmail;
#define BUFSIZE 1024
+#if _FFR_DELIM
+# define ISSEP(c) ((sep == '\0' && isascii(c) && isspace(c)) || (c) == sep)
+#else /* _FFR_DELIM */
+# define ISSEP(c) (isascii(c) && isspace(c))
+#endif /* _FFR_DELIM */
+
+
+static void
+usage(progname)
+ char *progname;
+{
+ fprintf(stderr,
+ "Usage: %s [-C cffile] [-N] [-c cachesize] [-d] [-e] [-f] [-l] [-o] [-r] [-s] %s[-u] [-v] type mapname\n",
+ progname,
+#if _FFR_DELIM
+ "[-t delimiter] "
+#else /* _FFR_DELIM */
+ ""
+#endif /* _FFR_DELIM */
+ );
+ exit(EX_USAGE);
+}
int
main(argc, argv)
@@ -74,86 +85,66 @@ main(argc, argv)
bool inclnull = FALSE;
bool notrunc = FALSE;
bool allowreplace = FALSE;
- bool allowdups = FALSE;
+ bool allowempty = FALSE;
bool verbose = FALSE;
bool foldcase = TRUE;
+ bool unmake = FALSE;
+#if _FFR_DELIM
+ char sep = '\0';
+#endif /* _FFR_DELIM */
int exitstat;
int opt;
char *typename = NULL;
char *mapname = NULL;
- char *ext = NULL;
int lineno;
int st;
int mode;
+ int smode;
int putflags = 0;
-#ifdef NEWDB
- long dbcachesize = 1024 * 1024;
-#endif
- enum type type;
-#if !O_EXLOCK
- int fd;
-#endif
- int sff = SFF_ROOTOK|SFF_REGONLY;
+ long sff = SFF_ROOTOK|SFF_REGONLY;
struct passwd *pw;
- union
- {
-#ifdef NDBM
- DBM *dbm;
-#endif
-#ifdef NEWDB
- DB *db;
-#endif
- void *dbx;
- } dbp;
- union dbent key, val;
-#ifdef NEWDB
-# if DB_VERSION_MAJOR < 2
- BTREEINFO bti;
- HASHINFO hinfo;
-# else
- DB_INFO dbinfo;
-# endif
-#endif
+ SMDB_DATABASE *database;
+ SMDB_CURSOR *cursor;
+ SMDB_DBENT db_key, db_val;
+ SMDB_DBPARAMS params;
+ SMDB_USER_INFO user_info;
char ibuf[BUFSIZE];
- char fbuf[MAXNAME];
- char dbuf[MAXNAME];
-#ifdef NDBM
- char pbuf[MAXNAME];
-#endif
-#if _FFR_TRUSTED_USER
+#if HASFCHOWN
FILE *cfp;
char buf[MAXLINE];
-#endif
+#endif /* HASFCHOWN */
static char rnamebuf[MAXNAME]; /* holds RealUserName */
- struct stat std;
-#ifdef NDBM
- struct stat stp;
-#endif
extern char *optarg;
extern int optind;
- progname = argv[0];
+ memset(&params, '\0', sizeof params);
+ params.smdbp_cache_size = 1024 * 1024;
+
+ progname = strrchr(argv[0], '/');
+ if (progname != NULL)
+ progname++;
+ else
+ progname = argv[0];
cfile = _PATH_SENDMAILCF;
+ clrbitmap(DontBlameSendmail);
RunAsUid = RealUid = getuid();
RunAsGid = RealGid = getgid();
pw = getpwuid(RealUid);
if (pw != NULL)
- {
- if (strlen(pw->pw_name) > MAXNAME - 1)
- pw->pw_name[MAXNAME] = 0;
- sprintf(rnamebuf, "%s", pw->pw_name);
- }
+ (void) strlcpy(rnamebuf, pw->pw_name, sizeof rnamebuf);
else
- sprintf(rnamebuf, "Unknown UID %d", (int) RealUid);
+ (void) snprintf(rnamebuf, sizeof rnamebuf, "Unknown UID %d",
+ (int) RealUid);
RunAsUserName = RealUserName = rnamebuf;
+ user_info.smdbu_id = RunAsUid;
+ user_info.smdbu_group_id = RunAsGid;
+ (void) strlcpy(user_info.smdbu_name, RunAsUserName,
+ SMDB_MAX_USER_NAME_LEN);
-#if _FFR_NEW_MAKEMAP_FLAGS
-#define OPTIONS "C:Nc:dflorsv"
-#else
-#define OPTIONS "C:Ndforsv"
-#endif
- while ((opt = getopt(argc, argv, OPTIONS)) != EOF)
+
+#define OPTIONS "C:Nc:t:deflorsuv"
+ while ((opt = getopt(argc, argv, OPTIONS)) != -1)
{
switch (opt)
{
@@ -165,34 +156,26 @@ main(argc, argv)
inclnull = TRUE;
break;
-#if _FFR_NEW_MAKEMAP_FLAGS
case 'c':
-# ifdef NEWDB
- dbcachesize = atol(optarg);
-# endif
+ params.smdbp_cache_size = atol(optarg);
break;
-#endif
case 'd':
- allowdups = TRUE;
+ params.smdbp_allow_dup = TRUE;
+ break;
+
+ case 'e':
+ allowempty = TRUE;
break;
case 'f':
foldcase = FALSE;
break;
-#if _FFR_NEW_MAKEMAP_FLAGS
case 'l':
-# ifdef NDBM
- printf("dbm\n");
-# endif
-# ifdef NEWDB
- printf("hash\n");
- printf("btree\n");
-# endif
+ smdb_print_available_types();
exit(EX_OK);
break;
-#endif
case 'o':
notrunc = TRUE;
@@ -203,7 +186,25 @@ main(argc, argv)
break;
case 's':
- DontBlameSendmail |= DBS_MAPINUNSAFEDIRPATH|DBS_WRITEMAPTOHARDLINK|DBS_WRITEMAPTOSYMLINK|DBS_LINKEDMAPINWRITABLEDIR;
+ setbitn(DBS_MAPINUNSAFEDIRPATH, DontBlameSendmail);
+ setbitn(DBS_WRITEMAPTOHARDLINK, DontBlameSendmail);
+ setbitn(DBS_WRITEMAPTOSYMLINK, DontBlameSendmail);
+ setbitn(DBS_LINKEDMAPINWRITABLEDIR, DontBlameSendmail);
+ break;
+
+#if _FFR_DELIM
+ case 't':
+ if (optarg == NULL || *optarg == '\0')
+ {
+ fprintf(stderr, "Invalid separator\n");
+ break;
+ }
+ sep = *optarg;
+ break;
+#endif /* _FFR_DELIM */
+
+ case 'u':
+ unmake = TRUE;
break;
case 'v':
@@ -211,51 +212,36 @@ main(argc, argv)
break;
default:
- type = T_ERR;
- break;
+ usage(progname);
+ /* NOTREACHED */
}
}
- if (!bitset(DBS_WRITEMAPTOSYMLINK, DontBlameSendmail))
+ if (!bitnset(DBS_WRITEMAPTOSYMLINK, DontBlameSendmail))
sff |= SFF_NOSLINK;
- if (!bitset(DBS_WRITEMAPTOHARDLINK, DontBlameSendmail))
+ if (!bitnset(DBS_WRITEMAPTOHARDLINK, DontBlameSendmail))
sff |= SFF_NOHLINK;
- if (!bitset(DBS_LINKEDMAPINWRITABLEDIR, DontBlameSendmail))
+ if (!bitnset(DBS_LINKEDMAPINWRITABLEDIR, DontBlameSendmail))
sff |= SFF_NOWLINK;
argc -= optind;
argv += optind;
if (argc != 2)
- type = T_ERR;
+ {
+ usage(progname);
+ /* NOTREACHED */
+ }
else
{
typename = argv[0];
mapname = argv[1];
- ext = NULL;
-
- if (strcmp(typename, "dbm") == 0)
- {
- type = T_DBM;
- }
- else if (strcmp(typename, "btree") == 0)
- {
- type = T_BTREE;
- ext = ".db";
- }
- else if (strcmp(typename, "hash") == 0)
- {
- type = T_HASH;
- ext = ".db";
- }
- else
- type = T_UNKNOWN;
}
-#if _FFR_TRUSTED_USER
+#if HASFCHOWN
+ /* Find TrustedUser value in sendmail.cf */
if ((cfp = fopen(cfile, "r")) == NULL)
{
- fprintf(stderr, "mailstats: ");
- perror(cfile);
+ fprintf(stderr, "makemap: %s: %s", cfile, errstring(errno));
exit(EX_NOINPUT);
}
while (fgets(buf, sizeof(buf), cfp) != NULL)
@@ -281,8 +267,6 @@ main(argc, argv)
TrustedUid = atoi(b);
else
{
- register struct passwd *pw;
-
TrustedUid = 0;
pw = getpwnam(b);
if (pw == NULL)
@@ -291,15 +275,17 @@ main(argc, argv)
else
TrustedUid = pw->pw_uid;
}
-
+
# ifdef UID_MAX
if (TrustedUid > UID_MAX)
{
- syserr("TrustedUser: uid value (%ld) > UID_MAX (%ld)",
- TrustedUid, UID_MAX);
+ fprintf(stderr,
+ "TrustedUser: uid value (%ld) > UID_MAX (%ld)",
+ (long) TrustedUid,
+ (long) UID_MAX);
TrustedUid = 0;
}
-# endif
+# endif /* UID_MAX */
break;
}
@@ -309,470 +295,187 @@ main(argc, argv)
}
}
(void) fclose(cfp);
-#endif
- switch (type)
+#endif /* HASFCHOWN */
+
+ if (!params.smdbp_allow_dup && !allowreplace)
+ putflags = SMDBF_NO_OVERWRITE;
+
+ if (unmake)
{
- case T_ERR:
-#if _FFR_NEW_MAKEMAP_FLAGS
- fprintf(stderr,
- "Usage: %s [-N] [-c cachesize] [-d] [-f] [-l] [-o] [-r] [-s] [-v] type mapname\n",
- progname);
-#else
- fprintf(stderr, "Usage: %s [-N] [-d] [-f] [-o] [-r] [-s] [-v] type mapname\n", progname);
-#endif
- exit(EX_USAGE);
-
- case T_UNKNOWN:
- fprintf(stderr, "%s: Unknown database type %s\n",
- progname, typename);
- exit(EX_USAGE);
-
-#ifndef NDBM
- case T_DBM:
-#endif
-#ifndef NEWDB
- case T_BTREE:
- case T_HASH:
-#endif
- fprintf(stderr, "%s: Type %s not supported in this version\n",
- progname, typename);
- exit(EX_UNAVAILABLE);
-
-#ifdef NEWDB
- case T_BTREE:
-# if DB_VERSION_MAJOR < 2
- bzero(&bti, sizeof bti);
-# else
- bzero(&dbinfo, sizeof dbinfo);
-# endif
- if (allowdups)
- {
-# if DB_VERSION_MAJOR < 2
- bti.flags |= R_DUP;
-# else
- dbinfo.flags |= DB_DUP;
-# endif
- }
- if (allowdups || allowreplace)
- putflags = 0;
- else
- {
-# if DB_VERSION_MAJOR < 2
- putflags = R_NOOVERWRITE;
-# else
- putflags = DB_NOOVERWRITE;
-# endif
- }
- break;
-
- case T_HASH:
-# if DB_VERSION_MAJOR < 2
- bzero(&hinfo, sizeof hinfo);
-# else
- bzero(&dbinfo, sizeof dbinfo);
-# endif
- if (allowreplace)
- putflags = 0;
- else
- {
-# if DB_VERSION_MAJOR < 2
- putflags = R_NOOVERWRITE;
-# else
- putflags = DB_NOOVERWRITE;
-# endif
- }
- break;
-#endif
-#ifdef NDBM
- case T_DBM:
- if (allowdups)
+ mode = O_RDONLY;
+ smode = S_IRUSR;
+ }
+ else
+ {
+ mode = O_RDWR;
+ if (!notrunc)
{
- fprintf(stderr, "%s: Type %s does not support -d (allow dups)\n",
- progname, typename);
- exit(EX_UNAVAILABLE);
+ mode |= O_CREAT|O_TRUNC;
+ sff |= SFF_CREAT;
}
- if (allowreplace)
- putflags = DBM_REPLACE;
- else
- putflags = DBM_INSERT;
- break;
-#endif
+ smode = S_IWUSR;
}
- /*
- ** Adjust file names.
- */
+ params.smdbp_num_elements = 4096;
- if (ext != NULL)
+ errno = smdb_open_database(&database, mapname, mode, smode, sff,
+ typename, &user_info, &params);
+ if (errno != SMDBE_OK)
{
- int el, fl;
+ char *hint;
- el = strlen(ext);
- fl = strlen(mapname);
- if (el + fl + 1 >= sizeof fbuf)
- {
- fprintf(stderr, "%s: file name too long", mapname);
- exit(EX_USAGE);
- }
- if (fl < el || strcmp(&mapname[fl - el], ext) != 0)
- {
- strcpy(fbuf, mapname);
- strcat(fbuf, ext);
- mapname = fbuf;
- }
+ if (errno == SMDBE_UNSUPPORTED_DB_TYPE &&
+ (hint = smdb_db_definition(typename)) != NULL)
+ fprintf(stderr,
+ "%s: Need to recompile with -D%s for %s support\n",
+ progname, hint, typename);
+ else
+ fprintf(stderr,
+ "%s: error opening type %s map %s: %s\n",
+ progname, typename, mapname, errstring(errno));
+ exit(EX_CANTCREAT);
}
- if (!notrunc)
- sff |= SFF_CREAT;
- switch (type)
+ (void) database->smdb_sync(database, 0);
+
+ if (geteuid() == 0 && TrustedUid != 0)
{
-#ifdef NEWDB
- case T_BTREE:
- case T_HASH:
- if (strlen(mapname) >= sizeof dbuf)
- {
- fprintf(stderr,
- "%s: map name too long\n", mapname);
- exit(EX_USAGE);
- }
- strcpy(dbuf, mapname);
- if ((st = safefile(dbuf, RealUid, RealGid, RealUserName,
- sff, S_IWUSR, &std)) != 0)
- {
- fprintf(stderr,
- "%s: could not create: %s\n",
- dbuf, errstring(st));
- exit(EX_CANTCREAT);
- }
- break;
-#endif
-#ifdef NDBM
- case T_DBM:
- if (strlen(mapname) + 5 > sizeof dbuf)
- {
- fprintf(stderr,
- "%s: map name too long\n", mapname);
- exit(EX_USAGE);
- }
- sprintf(dbuf, "%s.dir", mapname);
- if ((st = safefile(dbuf, RealUid, RealGid, RealUserName,
- sff, S_IWUSR, &std)) != 0)
- {
- fprintf(stderr,
- "%s: could not create: %s\n",
- dbuf, errstring(st));
- exit(EX_CANTCREAT);
- }
- sprintf(pbuf, "%s.pag", mapname);
- if ((st = safefile(pbuf, RealUid, RealGid, RealUserName,
- sff, S_IWUSR, &stp)) != 0)
+ errno = database->smdb_set_owner(database, TrustedUid, -1);
+ if (errno != SMDBE_OK)
{
fprintf(stderr,
- "%s: could not create: %s\n",
- pbuf, errstring(st));
- exit(EX_CANTCREAT);
+ "WARNING: ownership change on %s failed %s",
+ mapname, errstring(errno));
}
- break;
-#endif
- default:
- fprintf(stderr,
- "%s: internal error: type %d\n",
- progname,
- type);
- exit(EX_SOFTWARE);
}
/*
- ** Create the database.
+ ** Copy the data
*/
- mode = O_RDWR;
- if (!notrunc)
- mode |= O_CREAT|O_TRUNC;
-#if O_EXLOCK
- mode |= O_EXLOCK;
-#else
- /* pre-lock the database */
- fd = safeopen(dbuf, mode & ~O_TRUNC, 0644, sff);
- if (fd < 0)
- {
- fprintf(stderr, "%s: cannot create type %s map %s\n",
- progname, typename, mapname);
- exit(EX_CANTCREAT);
- }
-#endif
- switch (type)
+ exitstat = EX_OK;
+ if (unmake)
{
-#ifdef NDBM
- case T_DBM:
- dbp.dbm = dbm_open(mapname, mode, 0644);
- if (dbp.dbm != NULL &&
- dbm_dirfno(dbp.dbm) == dbm_pagfno(dbp.dbm))
- {
- fprintf(stderr, "dbm map %s: cannot run with GDBM\n",
- mapname);
- dbm_close(dbp.dbm);
- exit(EX_CONFIG);
- }
- if (dbp.dbm != NULL &&
- (filechanged(dbuf, dbm_dirfno(dbp.dbm), &std) ||
- filechanged(pbuf, dbm_pagfno(dbp.dbm), &stp)))
+ bool stop;
+ errno = database->smdb_cursor(database, &cursor, 0);
+ if (errno != SMDBE_OK)
{
+
fprintf(stderr,
- "dbm map %s: file changed after open\n",
- mapname);
- dbm_close(dbp.dbm);
- exit(EX_CANTCREAT);
+ "%s: cannot make cursor for type %s map %s\n",
+ progname, typename, mapname);
+ exit(EX_SOFTWARE);
}
-#if _FFR_TRUSTED_USER
- if (geteuid() == 0 && TrustedUid != 0)
+
+ memset(&db_key, '\0', sizeof db_key);
+ memset(&db_val, '\0', sizeof db_val);
+
+ for (stop = FALSE, lineno = 0; !stop; lineno++)
{
- if (fchown(dbm_dirfno(dbp.dbm), TrustedUid, -1) < 0 ||
- fchown(dbm_pagfno(dbp.dbm), TrustedUid, -1) < 0)
+ errno = cursor->smdbc_get(cursor, &db_key, &db_val,
+ SMDB_CURSOR_GET_NEXT);
+ if (errno != SMDBE_OK)
{
- fprintf(stderr,
- "WARNING: ownership change on %s failed: %s",
- mapname, errstring(errno));
+ stop = TRUE;
}
+ if (!stop)
+ printf("%.*s\t%.*s\n",
+ (int) db_key.data.size,
+ (char *) db_key.data.data,
+ (int) db_val.data.size,
+ (char *)db_val.data.data);
+
}
-#endif
-
- break;
-#endif
-
-#ifdef NEWDB
- case T_HASH:
- /* tweak some parameters for performance */
-# if DB_VERSION_MAJOR < 2
- hinfo.nelem = 4096;
- hinfo.cachesize = dbcachesize;
-# else
- dbinfo.h_nelem = 4096;
- dbinfo.db_cachesize = dbcachesize;
-# endif
-
-# if DB_VERSION_MAJOR < 2
- dbp.db = dbopen(mapname, mode, 0644, DB_HASH, &hinfo);
-# else
- {
- int flags = 0;
-
- if (bitset(O_CREAT, mode))
- flags |= DB_CREATE;
- if (bitset(O_TRUNC, mode))
- flags |= DB_TRUNCATE;
-
- dbp.db = NULL;
- errno = db_open(mapname, DB_HASH, flags, 0644,
- NULL, &dbinfo, &dbp.db);
- }
-# endif
- if (dbp.db != NULL)
+ (void) cursor->smdbc_close(cursor);
+ }
+ else
+ {
+ lineno = 0;
+ while (fgets(ibuf, sizeof ibuf, stdin) != NULL)
{
- int fd;
-
-# if DB_VERSION_MAJOR < 2
- fd = dbp.db->fd(dbp.db);
-# else
- fd = -1;
- errno = dbp.db->fd(dbp.db, &fd);
-# endif
- if (filechanged(dbuf, fd, &std))
+ register char *p;
+
+ lineno++;
+
+ /*
+ ** Parse the line.
+ */
+
+ p = strchr(ibuf, '\n');
+ if (p != NULL)
+ *p = '\0';
+ else if (!feof(stdin))
{
fprintf(stderr,
- "db map %s: file changed after open\n",
- mapname);
-# if DB_VERSION_MAJOR < 2
- dbp.db->close(dbp.db);
-# else
- errno = dbp.db->close(dbp.db, 0);
-# endif
- exit(EX_CANTCREAT);
+ "%s: %s: line %d: line too long (%ld bytes max)\n",
+ progname, mapname, lineno, (long) sizeof ibuf);
+ exitstat = EX_DATAERR;
+ continue;
}
- (void) (*dbp.db->sync)(dbp.db, 0);
-#if _FFR_TRUSTED_USER
- if (geteuid() == 0 && TrustedUid != 0)
+
+ if (ibuf[0] == '\0' || ibuf[0] == '#')
+ continue;
+ if (
+#if _FFR_DELIM
+ sep == '\0' &&
+#endif /* _FFR_DELIM */
+ isascii(ibuf[0]) && isspace(ibuf[0]))
{
- if (fchown(fd, TrustedUid, -1) < 0)
- {
- fprintf(stderr,
- "WARNING: ownership change on %s failed: %s",
- mapname, errstring(errno));
- }
+ fprintf(stderr,
+ "%s: %s: line %d: syntax error (leading space)\n",
+ progname, mapname, lineno);
+ exitstat = EX_DATAERR;
+ continue;
}
-#endif
- }
- break;
-
- case T_BTREE:
- /* tweak some parameters for performance */
-# if DB_VERSION_MAJOR < 2
- bti.cachesize = dbcachesize;
-# else
- dbinfo.db_cachesize = dbcachesize;
-# endif
-
-# if DB_VERSION_MAJOR < 2
- dbp.db = dbopen(mapname, mode, 0644, DB_BTREE, &bti);
-# else
- {
- int flags = 0;
-
- if (bitset(O_CREAT, mode))
- flags |= DB_CREATE;
- if (bitset(O_TRUNC, mode))
- flags |= DB_TRUNCATE;
-
- dbp.db = NULL;
- errno = db_open(mapname, DB_BTREE, flags, 0644,
- NULL, &dbinfo, &dbp.db);
- }
-# endif
- if (dbp.db != NULL)
- {
- int fd;
-
-# if DB_VERSION_MAJOR < 2
- fd = dbp.db->fd(dbp.db);
-# else
- fd = -1;
- errno = dbp.db->fd(dbp.db, &fd);
-# endif
- if (filechanged(dbuf, fd, &std))
+
+ memset(&db_key, '\0', sizeof db_key);
+ memset(&db_val, '\0', sizeof db_val);
+ db_key.data.data = ibuf;
+
+ for (p = ibuf; *p != '\0' && !(ISSEP(*p)); p++)
{
- fprintf(stderr,
- "db map %s: file changed after open\n",
- mapname);
-# if DB_VERSION_MAJOR < 2
- dbp.db->close(dbp.db);
-# else
- errno = dbp.db->close(dbp.db, 0);
-# endif
- exit(EX_CANTCREAT);
+ if (foldcase && isascii(*p) && isupper(*p))
+ *p = tolower(*p);
}
- (void) (*dbp.db->sync)(dbp.db, 0);
-#if _FFR_TRUSTED_USER
- if (geteuid() == 0 && TrustedUid != 0)
+ db_key.data.size = p - ibuf;
+ if (inclnull)
+ db_key.data.size++;
+
+ if (*p != '\0')
+ *p++ = '\0';
+ while (ISSEP(*p))
+ p++;
+ if (!allowempty && *p == '\0')
{
- if (fchown(fd, TrustedUid, -1) < 0)
- {
- fprintf(stderr,
- "WARNING: ownership change on %s failed: %s",
- mapname, errstring(errno));
- }
+ fprintf(stderr,
+ "%s: %s: line %d: no RHS for LHS %s\n",
+ progname, mapname, lineno,
+ (char *) db_key.data.data);
+ exitstat = EX_DATAERR;
+ continue;
}
-#endif
- }
- break;
-#endif
-
- default:
- fprintf(stderr, "%s: internal error: type %d\n",
- progname, type);
- exit(EX_SOFTWARE);
- }
-
- if (dbp.dbx == NULL)
- {
- fprintf(stderr, "%s: cannot open type %s map %s\n",
- progname, typename, mapname);
- exit(EX_CANTCREAT);
- }
-
- /*
- ** Copy the data
- */
-
- lineno = 0;
- exitstat = EX_OK;
- while (fgets(ibuf, sizeof ibuf, stdin) != NULL)
- {
- register char *p;
- lineno++;
+ db_val.data.data = p;
+ db_val.data.size = strlen(p);
+ if (inclnull)
+ db_val.data.size++;
- /*
- ** Parse the line.
- */
+ /*
+ ** Do the database insert.
+ */
- p = strchr(ibuf, '\n');
- if (p != NULL)
- *p = '\0';
- else if (!feof(stdin))
- {
- fprintf(stderr, "%s: %s: line %d: line too long (%ld bytes max)\n",
- progname, mapname, lineno, (long) sizeof ibuf);
- continue;
- }
-
- if (ibuf[0] == '\0' || ibuf[0] == '#')
- continue;
- if (isascii(ibuf[0]) && isspace(ibuf[0]))
- {
- fprintf(stderr, "%s: %s: line %d: syntax error (leading space)\n",
- progname, mapname, lineno);
- continue;
- }
-#ifdef NEWDB
- if (type == T_HASH || type == T_BTREE)
- {
- bzero(&key.db, sizeof key.db);
- bzero(&val.db, sizeof val.db);
- }
-#endif
-
- key.xx.data = ibuf;
- for (p = ibuf; *p != '\0' && !(isascii(*p) && isspace(*p)); p++)
- {
- if (foldcase && isascii(*p) && isupper(*p))
- *p = tolower(*p);
- }
- key.xx.size = p - key.xx.data;
- if (inclnull)
- key.xx.size++;
- if (*p != '\0')
- *p++ = '\0';
- while (isascii(*p) && isspace(*p))
- p++;
- if (*p == '\0')
- {
- fprintf(stderr, "%s: %s: line %d: no RHS for LHS %s\n",
- progname, mapname, lineno, key.xx.data);
- continue;
- }
- val.xx.data = p;
- val.xx.size = strlen(p);
- if (inclnull)
- val.xx.size++;
-
- /*
- ** Do the database insert.
- */
-
- if (verbose)
- {
- printf("key=`%s', val=`%s'\n", key.xx.data, val.xx.data);
- }
+ if (verbose)
+ {
+ printf("key=`%s', val=`%s'\n",
+ (char *) db_key.data.data,
+ (char *) db_val.data.data);
+ }
- switch (type)
- {
-#ifdef NDBM
- case T_DBM:
- st = dbm_store(dbp.dbm, key.dbm, val.dbm, putflags);
- break;
-#endif
-
-#ifdef NEWDB
- case T_BTREE:
- case T_HASH:
-# if DB_VERSION_MAJOR < 2
- st = (*dbp.db->put)(dbp.db, &key.db, &val.db, putflags);
-# else
- errno = (*dbp.db->put)(dbp.db, NULL, &key.db,
- &val.db, putflags);
+ errno = database->smdb_put(database, &db_key, &db_val,
+ putflags);
switch (errno)
{
- case DB_KEYEXIST:
+ case SMDBE_KEY_EXIST:
st = 1;
break;
@@ -784,25 +487,24 @@ main(argc, argv)
st = -1;
break;
}
-# endif
- break;
-#endif
- default:
- break;
- }
- if (st < 0)
- {
- fprintf(stderr, "%s: %s: line %d: key %s: put error\n",
- progname, mapname, lineno, key.xx.data);
- perror(mapname);
- exitstat = EX_IOERR;
- }
- else if (st > 0)
- {
- fprintf(stderr,
- "%s: %s: line %d: key %s: duplicate key\n",
- progname, mapname, lineno, key.xx.data);
+ if (st < 0)
+ {
+ fprintf(stderr,
+ "%s: %s: line %d: key %s: put error: %s\n",
+ progname, mapname, lineno,
+ (char *) db_key.data.data,
+ errstring(errno));
+ exitstat = EX_IOERR;
+ }
+ else if (st > 0)
+ {
+ fprintf(stderr,
+ "%s: %s: line %d: key %s: duplicate key\n",
+ progname, mapname,
+ lineno, (char *) db_key.data.data);
+ exitstat = EX_DATAERR;
+ }
}
}
@@ -810,114 +512,29 @@ main(argc, argv)
** Now close the database.
*/
- switch (type)
+ errno = database->smdb_close(database);
+ if (errno != SMDBE_OK)
{
-#ifdef NDBM
- case T_DBM:
- dbm_close(dbp.dbm);
- break;
-#endif
-
-#ifdef NEWDB
- case T_HASH:
- case T_BTREE:
-# if DB_VERSION_MAJOR < 2
- if ((*dbp.db->close)(dbp.db) < 0)
-# else
- if ((errno = (*dbp.db->close)(dbp.db, 0)) != 0)
-# endif
- {
- fprintf(stderr, "%s: %s: error on close\n",
- progname, mapname);
- perror(mapname);
- exitstat = EX_IOERR;
- }
-#endif
- default:
- break;
+ fprintf(stderr, "%s: close(%s): %s\n",
+ progname, mapname, errstring(errno));
+ exitstat = EX_IOERR;
}
+ smdb_free_database(database);
-#if !O_EXLOCK
- /* release locks */
- close(fd);
-#endif
-
- exit (exitstat);
-}
- /*
-** LOCKFILE -- lock a file using flock or (shudder) fcntl locking
-**
-** Parameters:
-** fd -- the file descriptor of the file.
-** filename -- the file name (for error messages).
-** ext -- the filename extension.
-** type -- type of the lock. Bits can be:
-** LOCK_EX -- exclusive lock.
-** LOCK_NB -- non-blocking.
-**
-** Returns:
-** TRUE if the lock was acquired.
-** FALSE otherwise.
-*/
-
-bool
-lockfile(fd, filename, ext, type)
- int fd;
- char *filename;
- char *ext;
- int type;
-{
-# if !HASFLOCK
- int action;
- struct flock lfd;
- extern int errno;
-
- bzero(&lfd, sizeof lfd);
- if (bitset(LOCK_UN, type))
- lfd.l_type = F_UNLCK;
- else if (bitset(LOCK_EX, type))
- lfd.l_type = F_WRLCK;
- else
- lfd.l_type = F_RDLCK;
- if (bitset(LOCK_NB, type))
- action = F_SETLK;
- else
- action = F_SETLKW;
-
- if (fcntl(fd, action, &lfd) >= 0)
- return TRUE;
-
- /*
- ** On SunOS, if you are testing using -oQ/tmp/mqueue or
- ** -oA/tmp/aliases or anything like that, and /tmp is mounted
- ** as type "tmp" (that is, served from swap space), the
- ** previous fcntl will fail with "Invalid argument" errors.
- ** Since this is fairly common during testing, we will assume
- ** that this indicates that the lock is successfully grabbed.
- */
-
- if (errno == EINVAL)
- return TRUE;
-
-# else /* HASFLOCK */
-
- if (flock(fd, type) >= 0)
- return TRUE;
-
-# endif
-
- return FALSE;
+ exit(exitstat);
+ /* NOTREACHED */
+ return exitstat;
}
/*VARARGS1*/
void
#ifdef __STDC__
message(const char *msg, ...)
-#else
+#else /* __STDC__ */
message(msg, va_alist)
const char *msg;
va_dcl
-#endif
+#endif /* __STDC__ */
{
const char *m;
VA_LOCAL_DECL
@@ -928,20 +545,20 @@ message(msg, va_alist)
isascii(m[2]) && isdigit(m[2]) && m[3] == ' ')
m += 4;
VA_START(msg);
- vfprintf(stderr, m, ap);
+ (void) vfprintf(stderr, m, ap);
VA_END;
- fprintf(stderr, "\n");
+ (void) fprintf(stderr, "\n");
}
/*VARARGS1*/
void
#ifdef __STDC__
syserr(const char *msg, ...)
-#else
+#else /* __STDC__ */
syserr(msg, va_alist)
const char *msg;
va_dcl
-#endif
+#endif /* __STDC__ */
{
const char *m;
VA_LOCAL_DECL
@@ -952,65 +569,7 @@ syserr(msg, va_alist)
isascii(m[2]) && isdigit(m[2]) && m[3] == ' ')
m += 4;
VA_START(msg);
- vfprintf(stderr, m, ap);
+ (void) vfprintf(stderr, m, ap);
VA_END;
- fprintf(stderr, "\n");
-}
-
-const char *
-errstring(err)
- int err;
-{
-#if !HASSTRERROR
- static char errstr[64];
-# if !defined(ERRLIST_PREDEFINED)
- extern char *sys_errlist[];
- extern int sys_nerr;
-# endif
-#endif
-
- /* handle pseudo-errors internal to sendmail */
- switch (err)
- {
- case E_SM_OPENTIMEOUT:
- return "Timeout on file open";
-
- case E_SM_NOSLINK:
- return "Symbolic links not allowed";
-
- case E_SM_NOHLINK:
- return "Hard links not allowed";
-
- case E_SM_REGONLY:
- return "Regular files only";
-
- case E_SM_ISEXEC:
- return "Executable files not allowed";
-
- case E_SM_WWDIR:
- return "World writable directory";
-
- case E_SM_GWDIR:
- return "Group writable directory";
-
- case E_SM_FILECHANGE:
- return "File changed after open";
-
- case E_SM_WWFILE:
- return "World writable file";
-
- case E_SM_GWFILE:
- return "Group writable file";
- }
-
-#if HASSTRERROR
- return strerror(err);
-#else
- if (err < 0 || err >= sys_nerr)
- {
- sprintf(errstr, "Error %d", err);
- return errstr;
- }
- return sys_errlist[err];
-#endif
+ (void) fprintf(stderr, "\n");
}
OpenPOWER on IntegriCloud