diff options
Diffstat (limited to 'contrib/sendmail/makemap')
-rwxr-xr-x | contrib/sendmail/makemap/Build | 508 | ||||
-rw-r--r-- | contrib/sendmail/makemap/Makefile | 17 | ||||
-rw-r--r-- | contrib/sendmail/makemap/Makefile.m4 | 130 | ||||
-rw-r--r-- | contrib/sendmail/makemap/makemap.8 | 214 | ||||
-rw-r--r-- | contrib/sendmail/makemap/makemap.c | 1035 |
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(¶ms, '\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, ¶ms); + 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"); } |