File metamail-2.7-19.dif of Package metamail

--- a/Makefile
+++ b/Makefile
@@ -26,7 +26,7 @@ MAKE = make
 CP = cp
 
 # How to compile C programs
-CC = cc
+CC = gcc
 
 # You may also want to change the CFLAGS variable, which will be passed on 
 # to all subdirectories.    If you do that, the changes will only work right if you
@@ -38,7 +38,7 @@ FOOBAR-sun4=-Bstatic
 
 STATICFLAG=FOOBAR${HOST_ARCH}
 
-CFLAGS = -g -I.  ${$(STATICFLAG)} 
+CFLAGS = $(RPM_OPT_FLAGS) -g -pipe -DLINUX -DSTDC_HEADERS -I. ${$(STATICFLAG)} 
 # The following is better if you want to make sure you run with SYSV defined
 # CFLAGS = -g -I.  ${$(STATICFLAG)}  -DSYSV
 # Also, for SGI Irix, compile in K&R mode
@@ -75,15 +75,15 @@ CONFIGDIR = .
 INSTALL = install -c -s
 
 # Root of installation tree
-INSTROOT = /usr/local
+INSTROOT = /usr
 #
 # This is where binaries should be copied
 LOCALBINDIR = ${INSTROOT}/bin
 
 # This is where man pages should be copied, and their extensions
-MAN1DIR = ${INSTROOT}/man/man1
+MAN1DIR = ${INSTROOT}/share/man/man1
 MAN1EXT = 1
-MAN4DIR = ${INSTROOT}/man/man4
+MAN4DIR = ${INSTROOT}/share/man/man4
 MAN4EXT = 4
 
 # Sets the font suffix your version of X uses - snf for X11R4, pcf for X11R5
@@ -91,7 +91,7 @@ MAN4EXT = 4
 FONTSUFFIX=pcf
 
 # This is where the mailcap file should be put
-MAILCAPDIR = ${INSTROOT}/etc
+MAILCAPDIR = /etc
 
 # This helps with the "for" constructs below on some platforms:
 SHELL=/bin/sh
@@ -129,22 +129,24 @@ install-all: basics
 	do 					\
 	    target=$(LOCALBINDIR)/$$file; 	\
 	    echo "installing binary $$target";	\
+	    test $$file = mimencode &&		\
+	    ${LN} -f mmencode $$target 2>/dev/null || \
 	    ${INSTALL} $$file $$target 2>/dev/null; \
 	done)
-#	@(cd man;				\
-#	for file in *.1;			\
-#	do 					\
-#	    target=$(MAN1DIR)/`basename $$file .1`.$(MAN1EXT); \
-#	    echo "installing man page $$target";\
-#	    ${CP} $$file $$target; 		\
-#	done)
-#	@(cd man;				\
-#	for file in *.4;			\
-#	do 					\
-#	    target=$(MAN4DIR)/`basename $$file .4`.$(MAN4EXT); \
-#	    echo "installing man page $$target";\
-#	    ${CP} $$file $$target; 		\
-#	done)
+	@(cd man;				\
+	for file in *.1;			\
+	do 					\
+	    target=$(MAN1DIR)/`basename $$file .1`.$(MAN1EXT); \
+	    echo "installing man page $$target";\
+	    install -m 644 $$file $$target;	\
+	done)
+	@(cd man;				\
+	for file in *.4;			\
+	do 					\
+	    target=$(MAN4DIR)/`basename $$file .4`.$(MAN4EXT); \
+	    echo "installing man page $$target";\
+	    install -m 644 $$file $$target;	\
+	done)
 #	@echo "Renaming old mailcap file to $(MAILCAPDIR)/mailcap.old"
 #	-mv $(MAILCAPDIR)/mailcap $(MAILCAPDIR)/mailcap.old
 #	@echo "installing file $(MAILCAPDIR)/mailcap"
--- a/config.h
+++ b/config.h
@@ -38,6 +38,9 @@ WITHOUT ANY EXPRESS OR IMPLIED WARRANTIE
 
 #ifdef LINUX
 #define SYSV /* Linux is SysV */
+#include <string.h>
+#include <unistd.h>
+#include <stdlib.h>
 #endif
 
 #ifdef SVR3
@@ -100,12 +103,14 @@ WITHOUT ANY EXPRESS OR IMPLIED WARRANTIE
 #endif
 
 #ifdef SYSV
+#if 0
 #define killpg(a, b) kill(-(a), (b))
 #define bcopy(a, b, c) memcpy(b, a, c)
 #define bzero(a, b) memset(a, 0, b)
 #define bcmp memcmp
 #define index strchr
 #define rindex strrchr
+#endif
 #define initstate srand
 #define random rand
 #define NO_RLIMITS 1
@@ -173,7 +178,7 @@ WITHOUT ANY EXPRESS OR IMPLIED WARRANTIE
 #else
 #define PATH_SEPARATOR ':'
 #ifndef STDPATH
-#define STDPATH "/.mailcap:/usr/local/etc/mailcap:/usr/etc/mailcap:/etc/mailcap:/etc/mail/mailcap:/usr/public/lib/mailcap"
+#define STDPATH "/usr/local/etc/mailcap:/usr/etc/mailcap:/etc/mailcap"
 #endif
 #endif
 #endif
--- a/bin/audiosend
+++ b/bin/audiosend
@@ -43,14 +43,14 @@ else
 	dev=/dev/audio
 fi
 
-if test -f /usr/lib/sendmail
+if test -x /usr/sbin/sendmail
 then
-    MAILCOMMAND=/usr/lib/sendmail
+    MAILCOMMAND=/usr/sbin/sendmail
 else
     MAILCOMMAND=/bin/mail
 fi
 
-if test ! -z "${1:-}"
+if test ! -z "${1:-}"; then
     to=$1
 else
     echo -n "To: "
@@ -70,8 +70,14 @@ do
 		echo -n "Press RETURN when you are ready to start recording: "
 		read foo
 
-		fname=${METAMAIL_TMPDIR}/audio-out.$$
-		fnameraw=${METAMAIL_TMPDIR}/audio-raw.$$
+		if [ -n "`type -p mktemp`" ] ; then
+			   fname=`mktemp ${METAMAIL_TMPDIR}/audio-out.$$.XXXXXX` || exit 1
+			fnameraw=`mktemp ${METAMAIL_TMPDIR}/audio-raw.$$.XXXXXX` || exit 1
+		else
+			   fname=${METAMAIL_TMPDIR}/audio-out.$$
+			fnameraw=${METAMAIL_TMPDIR}/audio-raw.$$
+			/bin/rm -f $fname $fnameraw
+		fi
 
 		echo "To: $to" > $fname
 		echo "Subject: $subject" >> $fname
@@ -111,7 +117,7 @@ do
 	read which
 	case $which in
 		1) echo -n "Sending mail, please wait...  "
-		  $MAILCOMMAND $to $cc < $fname
+		  $MAILCOMMAND "$to" "$cc" < $fname
 
 		  if test $? -eq 0
 		  then
--- a/bin/mailserver
+++ b/bin/mailserver
@@ -28,20 +28,28 @@ setenv PATH ${METAMAILDIR}:${PATH}
 rehash
 set FromName=""
 set Subject=""
-set TmpFile=/tmp/ms.$$
+#  Generate temporary file name:
+if ( -x /bin/mktemp || -x /usr/bin/mktemp ) then
+	set TmpFile="`mktemp /tmp/ms.$$.XXXXXXX`" || exit 1
+else
+	set TmpFile=/tmp/ms.$$
+	rm -rf $TmpFile
+endif
+onintr - end
+#
 set FOORAW=$<
 while ("$FOORAW" != "") 
-set FOO=(` echo "$FOORAW" | tr "[" "x"`)
+set FOO=(`echo "$FOORAW" | tr "[" "x"`)
 set BAR=($FOO)
-set BARLC=(`echo $FOO | tr A-Z a-z`)
-if ($BARLC[1] == "from:") then
+set BARLC=(`echo "$FOO" | tr A-Z a-z`)
+if ("$BARLC[1]" == "from:") then
 	if ("$FromName" == "") then
-		set FromName = ($BAR[2-])
+		set FromName = ("$BAR[2-]")
 	endif
-else if ($BARLC[1] == "reply-to:") then
-	set FromName = ($BAR[2-])
-else if ($BARLC[1] == "subject:") then
-	set Subject = ($BAR[2-])
+else if ("$BARLC[1]" == "reply-to:") then
+	set FromName = ("$BAR[2-]")
+else if ("$BARLC[1]" == "subject:") then
+	set Subject = ("$BAR[2-]")
 endif
 set FOORAW=$<
 end
@@ -52,12 +60,14 @@ if ("$Subject" == "") then
 endif
 
 if ("$FromName" == "") then
+	set noglob
 	cat > $TmpFile <<!
-From: $LOCALADDR@`hostname`
+From: $LOCALADDR@`hostname -f`
 To: $MAINTAINER
 Subject: $Subject
 
-The metamail mailserver script, installed locally as $LOCALADDR, has received a request without any reply address.
+The metamail mailserver script, installed locally as $LOCALADDR,
+has received a request without any reply address.
 
 It is possible that this is the result of a user running the "mailserver" 
 program by hand.  It is intended to be run as an automated recipient of 
@@ -68,7 +78,8 @@ reproduced below.  If no message appears
 probably run in some circumstance other than mail delivery.
 --------------------
 !
-	cat $TmpFile - | /usr/lib/sendmail $MAINTAINER
+	unset noglob
+	cat $TmpFile - | /usr/sbin/sendmail "$MAINTAINER"
 	# Takes the rest of the message from standard input
 	rm $TmpFile
 	exit 0
@@ -76,8 +87,9 @@ endif
 
 set danger=`echo $Subject | fgrep ..`
 if ($danger != "") then
+	set noglob
 	cat > $TmpFile <<!
-From: $LOCALADDR@`hostname`
+From: $LOCALADDR@`hostname -f`
 To: $FromName
 Subject: Re: $Subject
 
@@ -86,15 +98,17 @@ that contain ".." in the path name.
 
 The file you requested, if it exists, will not be sent to you.
 !
-	/usr/lib/sendmail -t < $TmpFile
+	unset noglob
+	/usr/sbin/sendmail -t < $TmpFile
 	rm $TmpFile
 	exit 0
 endif
 
 cd $ROOTDIR
 if (! -e "$Subject") then
+	set noglob
 	cat > $TmpFile <<!
-From: $LOCALADDR@`hostname`
+From: $LOCALADDR@`hostname -f`
 To: $FromName
 Subject: Re: $Subject
 
@@ -106,22 +120,24 @@ That file does not exist, so your reques
 Here is a list of the currently available files:
 --------------------------------
 !
+	unset noglob
 	ls -R >> $TmpFile
-	/usr/lib/sendmail -t < $TmpFile
+	/usr/sbin/sendmail -t < $TmpFile
 	rm $TmpFile
 	exit 0
 endif
 
-if (-e ${Subject}.ct) then
-	set ct=`cat ${Subject}.ct`
+if (-e "${Subject}.ct" ) then
+	set ct=`cat "${Subject}.ct"`
 else 
 	set ct="application/octet-stream"
 endif
 
 metasend -b -t "$FromName" -f "$Subject" -m "$ct" -s "Re: $Subject"
 if ($status != 0) then
+	set noglob
 	cat > $TmpFile <<!
-From: $LOCALADDR@`hostname`
+From: $LOCALADDR@`hostname -f`
 To: $FromName
 Subject: Re: $Subject
 
@@ -135,18 +151,24 @@ Command failed:
   metasend -b -t "$FromName" -f "$Subject" -m "$ct" -s "Re: $Subject"
 
 !
-	/usr/lib/sendmail -t < $TmpFile
+	unset noglob
+	/usr/sbin/sendmail -t < $TmpFile
 	rm $TmpFile
 	exit 0
 endif
 
 if ("$LOGADDR" != "") then
-	/usr/lib/sendmail -t <<!
-From: ${LOCALADDR}@`hostname`
+	set noglob
+	/usr/sbin/sendmail -t <<!
+From: ${LOCALADDR}@`hostname -f`
 To: $LOGADDR
 Subject: Autosend delivery report
 
 The file: $Subject 
 was sent to: $FromName
 !
+	unset noglob
+endif
+end:
+rm -f $TmpFile
 exit 0
--- a/bin/mailto-hebrew
+++ b/bin/mailto-hebrew
@@ -29,13 +29,13 @@
 # Brought into line with metamail 2.7 beta release Csh version
 #    Dave Shield	February 1994
 
-MYFONTDIR=/usr/lib/X11/fonts/misc
+MYFONTDIR=/usr/X11R6/lib/X11/fonts/misc
 
 if test ! -z "${MM_CHARSET:-}"
 then
 	if test "$MM_CHARSET" = iso-8859-8
 	then
-		mailto $*
+		mailto "$@"
 		exit 0
 	fi
 fi
@@ -73,4 +73,4 @@ fi
 echo Running xterm to compose mail in iso-8859-8, please wait...
 
 MM_CHARSET=iso-8859-8; export MM_CHARSET
-xterm -fn \*iso-8859-8 -e mailto $*
+xterm -fn \*iso-8859-8 -e mailto "$@"
--- a/bin/metasend
+++ b/bin/metasend
@@ -29,10 +29,10 @@
 #    Dave Shield	February 1994
 
 if [ -z "$METAMAIL_TMPDIR" ]
-then METAMAIL_TMPDIR=/tmp
+then METAMAIL_TMPDIR=${TMPDIR:-"/tmp"}
 fi
 
-hname=`hostname`
+hname=`hostname -f`
 idctr=0
 MustDelete=0
 batchmode=0
@@ -44,11 +44,20 @@ else
 	splitsize=100000
 fi
 
+if date --rfc-822 > /dev/null 2>&1
+then
+	d="--rfc-822"
+else
+	LC_TIME=POSIX
+	export LC_TIME
+	d="+%a, %e %b %Y %T %z"
+fi
+
 ouputfile=""
 multipartsubtype="mixed"
 cdescrip="An object packed by metasend"
 isentity=0
-newid=`date | tr " :" "__"`
+newid=`date ${d+"$d"}| tr " :" "__"`
 cid="<${newid}_$idctr@${hname}>"
 idctr=`expr $idctr + 1`
 
@@ -252,7 +261,7 @@ do
 		    datafile=""
 		    encode=""
 		    encodingprog=""
-		    newid=`date | tr " :" "__"`
+		    newid=`date ${d+"$d"}| tr " :" "__"`
 		    cid="<${newid}_$idctr@${hname}>"
 		    idctr=`expr $idctr + 1`
 		    cdescrip="An object packed by metasend"
@@ -362,7 +371,7 @@ then
 		    datafile=""
 		    encode=""
 		    encodingprog=""
-		    newid=`date | tr " :" "__"`
+		    newid=`date ${d+"$d"}| tr " :" "__"`
 		    cid="<${newid}_$idctr@${hname}>"
 		    idctr=`expr $idctr + 1`
 		    multipart=`expr $multipart + 1`
@@ -453,8 +462,17 @@ eval cid${multipart}=\"$cid\"
 eval isentity${multipart}=$isentity
 eval encodingprog${multipart}=\"\$encodingprog\"
 
-fname=$METAMAIL_TMPDIR/metasend.$$
-echo "MIME-Version: 1.0" > $fname
+if [ -n "`type -p mktemp`" ] ; then
+	fname=`mktemp $METAMAIL_TMPDIR/metasend.XXXXXX` || exit 1
+	echo "MIME-Version: 1.0" > $fname
+else
+	fname=$METAMAIL_TMPDIR/metasend.$$
+	rm -f $fname
+	set -Ce
+	echo "MIME-Version: 1.0" > $fname
+	set +Ce
+fi
+trap "rm -f $fname" 0 1 2 3 7 13 15
 
 if test ! -z "${to:-}"
 then echo "To: $to" >> $fname
@@ -471,8 +489,8 @@ fi
 
 if test $multipart -gt 1
 then
-	boundary=${hname}.$$.`date | tr "  " .`
-	newid=`date | tr " :" "__"`
+	boundary=${hname}.$$.`date ${d+"$d"}| tr "  " .`
+	newid=`date ${d+"$d"}| tr " :" "__"`
 	if test ! -z "${multicid:-}"
 	then
 		echo "Content-ID: $multicid" >> $fname
@@ -518,7 +536,7 @@ else
 	then
 		echo "Content-ID: $cid" >> $fname
 		echo "Content-type: $ctype" >> $fname
-		echo "Content-Description: $cdesrip" >> $fname
+		echo "Content-Description: $cdescrip" >> $fname
 		echo "Content-Transfer-Encoding: $encode" >> $fname
 	fi
 	echo "" >> $fname
--- a/bin/mimeit
+++ b/bin/mimeit
@@ -19,4 +19,4 @@ shift
   echo Subject: "$sub" ; \
   echo Content-Transfer-Encoding: base64 ;
   echo "" ; \
-  mimencode -b ) | splitmail -d $*
+  mimencode -b ) | splitmail -d "$@"
--- a/bin/patch-metamail
+++ b/bin/patch-metamail
@@ -67,9 +67,15 @@ read ans
 
 case "$ans" in
 	[Yy]*) cd $TREEROOT
-	       ident=`whoami`@`hostname`
+	       ident=`whoami`@`hostname -f`
 	       echo Using anonymous ftp with password $ident
-	       ftp -n <<!
+	       if [ -n "`type -p mktemp`" ] ; then
+		   TmpFtp=`mktemp ${METAMAIL_TMPDIR-/tmp}/mm.ftp.$$.XXXXXX` || exit 1
+	       else
+		   TmpFtp=${METAMAIL_TMPDIR-/tmp}/mm.ftp.$$
+	       fi
+	       set -f
+	       cat > $TmpFtp <<!
 open $HOSTNAME
 user anonymous $ident
 cd $DIRNAME
@@ -77,6 +83,9 @@ binary
 get ${PREFIX}${PATCHNUMBER}
 quit
 !
+	       set +f
+	       ftp -n < $TmpFtp
+	       rm -f $TmpFtp
 	       patch -p < ${PREFIX}${PATCHNUMBER} ;;
 	*) echo Patch not installed
 esac
--- a/bin/showaudio
+++ b/bin/showaudio
@@ -34,7 +34,7 @@ then
         METAMAIL_TMPDIR=/tmp
 fi
 
-thishost=`hostname`
+thishost=`hostname -f`
 
 AUDIOBINDIR=/u/andrew/phone-sau/bin
 AUDIOPHONEHOST=greenbush
@@ -96,7 +96,7 @@ then
 			if test $MM_NOTTTY -eq 1
 			then
 				MM_NOTTTY=0; export MM_NOTTTY
-				xterm -e showaudio $*
+				xterm -e showaudio "$@"
 				exit 0
 			fi
 		fi
@@ -135,6 +135,12 @@ fi
 
 if test $playphone -eq 0
 then
+	if [ -n "`type -p mktemp`" ] ; then
+		TmpAudio=`mktemp ${METAMAIL_TMPDIR}/audio.$$.XXXXXX` || exit 1
+	else
+		TmpAudio=${METAMAIL_TMPDIR}/audio.$$
+		rm -f $TmpAudio
+	fi
 	audiohost=$thishost
 	if test ! -z "${DISPLAY:-}"
 	then
@@ -162,7 +168,7 @@ then
 			then
 				cat | mms -host $audiohost "show audio/basic"
 			else
-				cat $* | mms -host $audiohost "show audio/basic"
+				cat "$@" | mms -host $audiohost "show audio/basic"
 			fi
 			exit 0
 		fi
@@ -171,7 +177,7 @@ then
 		then
 			cat | $RSH $audiohost $thisprog -s
 		else
-			cat $* | $RSH $audiohost $thisprog -s
+			cat "$@" | $RSH $audiohost $thisprog -s
 		fi
 		exit 0
 	fi
@@ -181,22 +187,22 @@ then
 	then
 		if test $# -ne 0
 		then
-			exec /usr/sbin/sfplay -i mu-law chan 1 rate 8000 end $*
+			exec /usr/sbin/sfplay -i mu-law chan 1 rate 8000 end "$@"
 		else
-			cat > ${METAMAIL}/audio.$$
-			/usr/sbin/sfplay -i mu-law chan 1 rate 8000 end ${METAMAIL}/audio.$$
-			rm ${METAMAIL}/audio.$$
+			cat > $TmpAudio
+			/usr/sbin/sfplay -i mu-law chan 1 rate 8000 end $TmpAudio
+			rm $TmpAudio
 			exit 0
 		fi
 	elif test -f /usr/bin/audioplay
 	then
 	# Solaris 2.0
-		/usr/bin/audioconvert -i raw,voice -f sun $* | /usr/bin/audioplay
+		/usr/bin/audioconvert -i raw,voice -f sun "$@" | /usr/bin/audioplay
 		exit $?
 	elif test -f /bin/audioplay
 	then
 	# Solaris 2.0
-		/bin/audioconvert -i raw,voice -f sun $* | /bin/audioplay
+		/bin/audioconvert -i raw,voice -f sun "$@" | /bin/audioplay
 		exit $?
 	elif test -d /usr/sony
 	then
@@ -212,7 +218,7 @@ then
 		then
 			if test ! -z "${SOX:-}"
 			then
-			    for ii in $*
+			    for ii in "$@"
 			    do
 #
 #  The "approved magic" to translate arbitary sounds
@@ -225,16 +231,16 @@ then
 				$SOX -t auto $ii -c 1 -t au -c 1 -r 8000 $dev
 			    done
 			else
-				cat $* > $dev
+				cat "$@" > $dev
 			fi
 		else
 			if test ! -z "${SOX:-}"
 			then
-				cat > ${METAMAIL}/audio.$$
+				cat > $TmpAudio
 #
 #  See also above
 #
-				$SOX -t auto ${METAMAIL}/audio.$$ -c 1 -t au -c 1 -r 8000 $dev
+				$SOX -t auto $TmpAudio -c 1 -t au -c 1 -r 8000 $dev
 			else
 				cat > $dev
 			fi
@@ -253,7 +259,7 @@ then
 			if test $MM_NOTTTY -eq 1
 			then
 				MM_NOTTTY=0; export MM_NOTTTY
-				xterm -e $thisprog $*
+				xterm -e $thisprog "$@"
 				exit 0
 			fi
 		fi
@@ -271,9 +277,9 @@ then
 		mail -s "showaudio: `whoami` called $AUDIOPHONE" $AUDIOLOGMAIL < /dev/null
 		if test $STDINPUT -eq 1
 		then
-			cat $AUDIOBINDIR/../GREET.au $* - | $AUDIOBINDIR/play -\# $AUDIOPHONE -
+			cat $AUDIOBINDIR/../GREET.au "$@" - | $AUDIOBINDIR/play -\# $AUDIOPHONE -
 		else
-			cat $AUDIOBINDIR/../GREET.au $* | $AUDIOBINDIR/play -\# $AUDIOPHONE -
+			cat $AUDIOBINDIR/../GREET.au "$@" | $AUDIOBINDIR/play -\# $AUDIOPHONE -
 		fi
 		echo All done
 		exit 0
@@ -281,9 +287,9 @@ then
 		echo Trying to rsh to $AUDIOPHONEHOST to send audio via telephone
 		if test $STDINPUT -eq 1
 		then
-			cat $* - | $RSH $AUDIOPHONEHOST $thisprog -p $AUDIOPHONE -
+			cat "$@" - | $RSH $AUDIOPHONEHOST $thisprog -p $AUDIOPHONE -
 		else
-			cat $* | $RSH $AUDIOPHONEHOST $thisprog -p $AUDIOPHONE -
+			cat "$@" | $RSH $AUDIOPHONEHOST $thisprog -p $AUDIOPHONE -
 		fi
 		exit 0
 	fi
@@ -302,7 +308,12 @@ then
 fi
 if test $MM_NOTTY -eq 1
 then
-	fname=/tmp/mm.aud.$$
+	if [ -n "`type -p mktemp`" ] ; then
+		fname=`mktemp ${METAMAIL_TMPDIR}/mm.aud.XXXXXX` || exit 1
+	else
+		fname=${METAMAIL_TMPDIR}/mm.aud.$$
+		rm -f $fname
+	fi
 else
 	echo -n "Do you want to write the audio out to a file [y] ? "
 	read ANS
--- a/bin/showexternal
+++ b/bin/showexternal
@@ -28,9 +28,9 @@
 # Brought into line with metamail 2.7 beta release Csh version
 #    Dave Shield	February 1994
 
-if test -f /usr/lib/sendmail
+if test -f /usr/sbin/sendmail
 then
-    MAILCOMMAND=/usr/lib/sendmail
+    MAILCOMMAND=/usr/sbin/sendmail
 else
     MAILCOMMAND=/bin/mail
 fi
@@ -46,22 +46,35 @@ then
 	METAMAIL_TMPDIR=/tmp
 fi
 
-bodyfile=$1
+if [ -n "$METAMAIL_PAGER" ]
+then
+	PAGER="$METAMAIL_PAGER"
+fi
+
+# Check argument integrity. Don't trust mail headers
+case "$1$2$3$4$5$6$7" in
+  *[\ \	]*)
+	echo "Illegal white space in arguments -- possibly a mail bomb?\!"
+	echo "Command was:"
+	echo \'$0\' \'$1\' \'$2\' \'$3\' \'$4\' \'$5\' \'$6\' \'$7\'
+	exit 2
+esac
+bodyfile="$1"
 atype=`echo $2 | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
-name=$3
+name="$3"
 
-site=$4
+site="$4"
 
-dir=$5
+dir="$5"
 
-mode=$6
+mode="$6"
 
-server=$7
+server="$7"
 
 if test -z "$server" -a $atype = "mail-server"
 then
 	server=${name}@${site}
-	echo WARNING -- old style mailserver syntax, using server $server
+	echo "WARNING -- old style mailserver syntax, using server $server"
 fi
 
 ctype=`grep -i content-type: $bodyfile | sed -e 's/............: //'`
@@ -72,8 +85,8 @@ cenc=`grep -i content-transfer-encoding:
 username=""
 pass=""
 TMPDIR=$METAMAIL_TMPDIR/XXXternal.$$
-trap 'cd $METAMAIL_TMPDIR ; rmdir "$TMPDIR" >/dev/null 2>&1' 1 2 3 15
-mkdir $TMPDIR
+trap "cd $METAMAIL_TMPDIR/ ; rm -rf $TMPDIR" 1 2 3 7 13 15
+mkdir $TMPDIR || exit 1
 PUSHED_DIR=`pwd`
 cd $TMPDIR
 NEWNAME="mm.ext.$$"
@@ -91,7 +104,14 @@ case $atype in
 		echo automatically using the FTP protocol to a site on the network. ;;
 
 	mail-server)
-		cat > $METAMAIL_TMPDIR/ext.junk.$$ <<!
+		if [ -n "`type -p mktemp`" ] ; then
+			TmpExtJunk=`mktemp ${METAMAIL_TMPDIR}/ext.junk.$$.XXXXXX` || exit 1
+		else
+			TmpExtJunk=${METAMAIL_TMPDIR}/ext.junk.$$
+			rm -f $TmpExtJunk
+		fi
+		set -f
+		cat > $TmpExtJunk <<!
 This mail message contains a POINTER (reference) to data that is not
 included in the message itself.  Rather, the data can be retrieved by
 sending a special mail message to a mail server on the network.
@@ -107,9 +127,14 @@ Subject: Automated Mail Server Request
 To: $server
 
 !
-		sed -e 1,/^\$/d < $bodyfile >> $METAMAIL_TMPDIR/ext.junk.$$
-		more $METAMAIL_TMPDIR/ext.junk.$$
-		rm $METAMAIL_TMPDIR/ext.junk.$$ ;;
+		set +f
+		sed -e 1,/^\$/d < $bodyfile >> $TmpExtJunk
+		if [ -n "$PAGER" ] ; then
+			$PAGER $TmpExtJunk
+		else
+			more   $TmpExtJunk
+		fi
+		rm $TmpExtJunk ;;
 
 	*)
 		NEEDSCONFIRMATION=0 ;;
@@ -132,7 +157,7 @@ case "$atype" in
 		case "$atype" in
 		anon-ftp )
 			username=anonymous
-			pass=`whoami`@`hostname`
+			pass=`whoami`@`hostname -f`
 			;;
 		esac
 
@@ -168,7 +193,14 @@ case "$atype" in
 		fi
 		echo OBTAINING MESSAGE BODY USING FTP
 		echo SITE: $site USER: $username
-		${FTP:-ftp} -n <<!
+		if [ -n "`type -p mktemp`" ] ; then
+			TmpFtp=`mktemp ${METAMAIL_TMPDIR}/mm.ftp.$$.XXXXXX` || exit 1
+		else
+			TmpFtp=${METAMAIL_TMPDIR}/mm.ftp.$$
+			rm -f $TmpFtp
+		fi
+		set -f
+		cat > $TmpFtp <<!
 open $site
 user $username $pass
 $DIRCMD
@@ -176,6 +208,9 @@ $MODECMD
 get $name $NEWNAME
 quit
 !
+		set +f
+		${FTP:-ftp} -n < $TmpFtp
+		rm -f $TmpFtp
 		if test ! -r "$NEWNAME"
 		then
 			echo FTP failed.
@@ -205,7 +240,7 @@ quit
 			exit 1
 		fi
 		echo Subject: Automated Mail Server Request > $NEWNAME
-		echo To: $server >> $NEWNAME
+		echo To: "$server" >> $NEWNAME
 		echo "" >> $NEWNAME
 		sed -e 1,/^\$/d < $bodyfile >> $NEWNAME
 		$MAILCOMMAND -t < $NEWNAME
--- a/bin/shownonascii
+++ b/bin/shownonascii
@@ -28,7 +28,12 @@
 # Brought into line with metamail 2.7 beta release Csh version
 #    Dave Shield	February 1994
 
-MYFONTDIR=/usr/lib/X11/fonts/misc
+MYFONTDIR=/usr/X11R6/lib/X11/fonts/misc
+
+if [ -n "$METAMAIL_PAGER" ]
+then
+	PAGER="$METAMAIL_PAGER"
+fi
 
 CHARSET=$1
 shift
@@ -36,18 +41,23 @@ shift
 if test "$1" = "-e"
 then
 	shift
-	CMD="$*"
-	RIGHTTERMCMD="$*"
+	CMD='"$@"'
+	RIGHTTERMCMD='"$@"'
 else
-	CMD="more $* /dev/null"
-	RIGHTTERMCMD="more $*"
+	if [ -n "$PAGER" ] ; then
+		more="$PAGER"
+	else
+		more=more
+	fi
+	CMD='$more "$@" /dev/null'
+	RIGHTTERMCMD='$more "$@"'
 fi
 
 if test ! -z "${MM_CHARSET:-}"
 then
 	if test "$MM_CHARSET" = "$CHARSET"
 	then
-		$RIGHTTERMCMD
+		eval $RIGHTTERMCMD
 		exit 0
 	fi
 fi
@@ -55,7 +65,7 @@ for f in "${MM_AUXCHARSETS:-}"
 do
 	if test "$f" = "$CHARSET"
 	then
-		$RIGHTTERMCMD
+		eval $RIGHTTERMCMD
 		exit 0
 	fi
 done
@@ -66,7 +76,7 @@ then
 	echo has not yet been installed on this machine.  What follows
 	echo "may be partially unreadable, but the English (ASCII) parts"
 	echo "should still be readable."
-	cat $*
+	cat "$@"
 	exit 0
 fi
 
@@ -76,7 +86,7 @@ then
 	echo properly if you are running X11.  What follows
 	echo "may be partially unreadable, but the English (ASCII) parts"
 	echo "should still be readable."
-	cat $*
+	cat "$@"
 	exit 0
 fi
 
@@ -103,4 +113,4 @@ echo Running xterm to display text in $C
 # Bogus -- need to unsetenv MM_NOTTTY, but can't in Bourne shell.  --bobg.
 MM_NOTTTY=''
 XCHARSET=\*`echo $CHARSET | sed -e s/iso-/iso/`
-xterm -fn $XCHARSET -e $CMD
+eval xterm -fn \$XCHARSET -e $CMD
--- a/bin/showpartial
+++ b/bin/showpartial
@@ -38,18 +38,18 @@ then
 	exit 1
 fi
 
-file=$1
+file="$1"
 
 # This next line is because message-id can contain weird chars
-id=`echo $2 | tr -d \!\$\&\*\(\)\|\'\"\;\/\<\>\\ `
+id=`echo "$2" | tr -d \!\$\&\*\(\)\|\'\"\;\/\<\>\\ `
 
-partnum=$3
+partnum="$3"
 
 if test -z "$4"
 then
 	totalnum=-1
 else
-	totalnum=$4
+	totalnum="$4"
 fi
 
 if test ! -d $TREEROOT
--- a/bin/showpicture
+++ b/bin/showpicture
@@ -58,7 +58,12 @@ then
 	echo X11, you will be able to see the picture properly.
 	if test $MM_NOTTY -eq 1
 	then
-		fname=$METAMAIL_TMPDIR/sp.$$
+		if [ -n "`type -p mktemp`" ] ; then
+			fname=`mktemp $METAMAIL_TMPDIR/sp.$$.XXXXXX` || exit 1
+		else
+			fname=$METAMAIL_TMPDIR/sp.$$
+			rm -f $fname
+		fi
 		echo "The picture is being automatically stored in the file $fname"
 		echo "If you do not want this file, please delete it."
 	else
@@ -90,7 +95,12 @@ fi
 
 if test -z "$1"
 then
-	SQUIRREL=${METAMAIL_TMPDIR}/sp.$$
+	if [ -n "`type -p mktemp`" ] ; then
+		SQUIRREL=`mktemp ${METAMAIL_TMPDIR}/sp.$$.XXXXXX` || exit 1
+	else
+		SQUIRREL=${METAMAIL_TMPDIR}/sp.$$
+		rm -f $SQUIRREL
+	fi
 	cat > $SQUIRREL
 else
 	SQUIRREL="$*"
--- a/bin/sun-audio-file
+++ b/bin/sun-audio-file
@@ -18,7 +18,13 @@ if [ -z "$METAMAIL_TMPDIR" ]
 then METAMAIL_TMPDIR=/tmp
 fi
 
+if [ -n "`type -p mktemp`" ] ; then
+	fn=`mktemp ${METAMAIL_TMPDIR}/audio-file.$$.XXXXXX` || exit 1
+else
+	fn=${METAMAIL_TMPDIR}/audio-file.$$
+	rm -f $fn
+fi
 cd $METAMAIL_TMPDIR
-uudecode < $1
-audiotool audio-file
-rm -f audio-file $1
+uudecode -o $fn < "$1"
+audiotool $fn
+rm -f $fn $1
--- a/bin/sun-message
+++ b/bin/sun-message
@@ -5,12 +5,24 @@
 #  then gives the user a short menu of choices:
 #    display, save or quit.
 
-mkdir /tmp/decode.$$
+mkdir /tmp/decode.$$ || exit 1
 cd /tmp/decode.$$
 
-if test $2 = "uuencode"
+if [ -n "`type -p mktemp`" ] ; then
+	fn=`mktemp uu.XXXXXX` || exit 1
+else
+	fn=uu.$$
+	rm -f $fn
+fi
+
+if [ -n "$METAMAIL_PAGER" ]
+then
+	PAGER="$METAMAIL_PAGER"
+fi
+
+if test "$2" = "uuencode"
 then 
-	uudecode $1
+	uudecode -o $fn < "$1"
 
 	echo "The following file was uudecoded:"
 	echo
@@ -37,7 +49,12 @@ then
 		fi
 
 		case $ans in
-			1)	more $fn ;;
+			1)	if [ -n "$PAGER" ] ; then
+					$PAGER $fn
+				else
+					more   $fn
+				fi
+				;;
 			2)	echo -n "Save as: $HOME/"
 				read nfn
 				if test ! -z "${nfn:-}"
@@ -57,5 +74,9 @@ then
 		defans=3
 	done
 else
-	more $1
+	if [ -n "$PAGER" ] ; then
+		$PAGER "$1"
+	else
+		more   "$1"
+	fi
 fi
--- a/bin/sun-message.csh
+++ b/bin/sun-message.csh
@@ -5,11 +5,22 @@
 # This is sun-message.  It looks at $2 to figure out how to decode $1, then gives the
 # user a short menu of choices, display, save, or quit.
 #
-mkdir /tmp/decode.$$
+mkdir /tmp/decode.$$ || exit 1
 cd /tmp/decode.$$
 
-if ($2 == "uuencode") then
-    uudecode $1
+if ( -x /bin/mktemp || -x /usr/bin/mktemp ) then
+	set fn="`mktemp uu.XXXXXX`" || exit 1
+else
+	set fn="uu.$$"
+	rm -f $fn
+endif
+
+if ( ${?METAMAIL_PAGER} ) then
+	set PAGER=$METAMAIL_PAGER
+endif
+
+if ("$2" == "uuencode") then
+    uudecode -o $fn < "$1"
 
     echo "The following file was uudecoded:"
     echo ""
@@ -17,7 +28,6 @@ if ($2 == "uuencode") then
     set defans = "1"
     while (1)
 	ls -l
-	set fn = *
 
 	echo ""
 	echo "Please choose one:"
@@ -29,20 +39,24 @@ if ($2 == "uuencode") then
 	echo -n "Which do you prefer (1 - 3)? [$defans] "
 
 	set ans = $< 
-	if (x$ans == x) then
+	if ("x$ans" == "x") then
 	    set ans = $defans
 	endif
-	if ($ans == 3)  then
+	if ("$ans" == "3")  then
 	    rm $1
 	    cd /tmp; /bin/rm -rf /tmp/decode.$$
 	    exit 0
-	else if ($ans == 1) then
-	    more $fn
-	else if ($ans == 2) then
+	else if ("$ans" == "1") then
+	    if ( ${?PAGER} ) then
+		${PAGER} $fn
+	    else
+		more     $fn
+	    endif
+	else if ("$ans" == "2") then
 	    set nfn = ""
 	    echo -n "Save as: $HOME/"
 	    set nfn = $<
-	    if (x$nfn != x) then
+	    if ("x$nfn" != "x") then
 		/bin/cp $fn ${HOME}/$nfn
 	    else
 		echo "Not Saved."
@@ -53,7 +67,11 @@ if ($2 == "uuencode") then
 	set defans = "3"
     end
 else
-    more $1
+    if ( ${?PAGER} ) then
+	${PAGER} $fn
+    else
+    	more     $1
+    endif
 endif
 
 
--- a/bin/sun-to-mime
+++ b/bin/sun-to-mime
@@ -18,10 +18,15 @@ if [ -z "$METAMAIL_TMPDIR" ]
 then METAMAIL_TMPDIR=/tmp
 fi
 
-TMPFILE=${METAMAIL_TMPDIR}/suntomime.$$
+if [ -n "`type -p mktemp`" ] ; then
+	TMPFILE=`mktemp ${METAMAIL_TMPDIR}/suntomime.$$.XXXXXX` || exit 1
+else
+	TMPFILE=${METAMAIL_TMPDIR}/suntomime.$$
+	rm -f $TMPFILE
+fi
 echo "Content-type: multipart/mixed; boundary=--------" > $TMPFILE
 echo "" >> $TMPFILE
-sed -e 's/X-Sun-Data-Type:/Content-type:/' >> $TMPFILE < $1
+sed -e 's/X-Sun-Data-Type:/Content-type:/' >> $TMPFILE < "$1"
 echo "------------" >> $TMPFILE
 #metamail -d -z $TMPFILE
 metamail -z $TMPFILE
--- a/bin/sun2mime
+++ b/bin/sun2mime
@@ -6,12 +6,19 @@
 # This program is for use with sun-message which takes an arg to figure out how
 # (or if) the message is encoded.
 #
-if [ x$METAMAIL_TMPDIR = x ]; then
+if [ "x$METAMAIL_TMPDIR" = "x" ]; then
     METAMAIL_TMPDIR=/tmp
 fi
-TMPFILE=${METAMAIL_TMPDIR}/suntomime.$$
 
-/usr/bin/nawk '
+if [ -n "`type -p mktemp`" ] ; then
+	TMPFILE=`mktemp ${METAMAIL_TMPDIR}/suntomime.$$.XXXXXX` || exit 1
+else
+	TMPFILE=${METAMAIL_TMPDIR}/suntomime.$$
+	rm -f $TMPFILE
+fi
+
+
+/usr/bin/gawk '
   BEGIN { printf("Content-type: multipart/mixed; boundary=--------\n\n")
           RS=""; FS="\n"; mode="HEADER" }
   mode == "HEADER" {
@@ -36,7 +43,7 @@ TMPFILE=${METAMAIL_TMPDIR}/suntomime.$$
       print
   }
   END { printf("----------\n") }
-' $1 > $TMPFILE
+' "$1" > $TMPFILE
 
 metamail -z $TMPFILE
 rm -f $TMPFILE
--- a/bin/uudepipe
+++ b/bin/uudepipe
@@ -10,6 +10,11 @@
 # MAKES NO REPRESENTATIONS ABOUT THE ACCURACY OR SUITABILITY
 # OF THIS MATERIAL FOR ANY PURPOSE.  IT IS PROVIDED "AS IS",
 # WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES.
-file=${TMPDIR=/tmp}/UUP$$
+if [ -n "`type -p mktemp`" ] ; then
+	file=`mktemp ${TMPDIR=/tmp}/UUP$$.XXXXXX` || exit 1
+else
+	file=${TMPDIR=/tmp}/UUP$$
+	rm -f $file
+fi
 cat ${1-"-"} | sed "s:begin [0-9][0-9]* .*:begin 600 $file:" | uudecode
 cat $file && rm -f $file
--- a/fonts/Makefile
+++ b/fonts/Makefile
@@ -30,11 +30,11 @@ heb8x13B.${FONTSUFFIX}: heb8x13B.bdf
 	-${DIRBUILDER}
 
 shownonascii: Xshownonascii
-	sed -e s@/u/nsb/lib/fonts@`pwd`@ < Xshownonascii > shownonascii
+	sed -e s@/u/nsb/lib/fonts@/usr/X11R6/lib/X11/fonts/mis@ < Xshownonascii > shownonascii
 	chmod +x shownonascii
 
 mailto-hebrew: Xmailto-hebrew
-	sed -e s@/u/nsb/lib/fonts@`pwd`@ < Xmailto-hebrew > mailto-hebrew
+	sed -e s@/u/nsb/lib/fonts@/usr/X11R6/lib/X11/fonts/mis@ < Xmailto-hebrew > mailto-hebrew
 	chmod +x mailto-hebrew
 
 clean:
--- a/fonts/Xmailto-hebrew
+++ b/fonts/Xmailto-hebrew
@@ -1,7 +1,7 @@
 #!/bin/csh -fb
 # (The "-fb" might need to be changed to "-f" on some systems)
 #
-set MYFONTDIR=/usr/lib/X11/fonts/misc
+set MYFONTDIR=/usr/X11R6/lib/X11/fonts/misc
 
 if ($?MM_CHARSET) then
     if ($MM_CHARSET == iso-8859-8) then
--- a/fonts/Xshownonascii
+++ b/fonts/Xshownonascii
@@ -1,7 +1,11 @@
 #!/bin/csh -fb
 # (The "-fb" might need to be changed to "-f" on some systems)
 #
-set MYFONTDIR=/usr/lib/X11/fonts/misc
+set MYFONTDIR=/usr/X11R6/lib/X11/fonts/misc
+
+if ( ${?METAMAIL_PAGER} ) then
+	set PAGER=$METAMAIL_PAGER
+endif
 
 set CHARSET="$1"
 shift
@@ -10,8 +14,13 @@ if ("$1" == "-e") then
     set CMD="$*"
     set RIGHTTERMCMD="$*"
 else
-    set CMD="more $* /dev/null"
-    set RIGHTTERMCMD="more $*"
+    if ( ${?PAGER} ) then
+	set more="${PAGER}"
+    else
+	set more="more"
+    endif
+    set CMD="$more $* /dev/null"
+    set RIGHTTERMCMD="$more $*"
 endif
 if ($?MM_CHARSET) then
     if ($MM_CHARSET == "$CHARSET") then
@@ -58,7 +67,5 @@ unsetenv MM_NOTTTY
 #      think it smart inhibit 8 bit chars in xterms.
 # xterm -fn $CHARSET -tm litout -e $CMD
 set XCHARSET=\*`echo $CHARSET | sed -e s/iso-/iso/`
-xterm -fn "$XCHARSET" -e $CMD
-
-
+exec xterm -fn "$XCHARSET" -e $CMD
 
--- a/man/mailto.1
+++ b/man/mailto.1
@@ -1,6 +1,6 @@
 .TH MAILTO 1 "Release 1" "Bellcore Prototype"
 .SH NAME
-mailto - Simple mutlimedia mail sending program
+mailto - Simple multimedia mail sending program
 .SH SYNOPSIS
 .ta 8n
 \fBmailto\fP	[-a] [-c] [-s] [recipient name(s)]
@@ -230,7 +230,7 @@ The .mailrc file in your home directory
    dot -- controls whether or not a period alone on a line 
         should be interpreted as terminating your mail
    ignore -- controls whether or not interrupts are ignored
-   verbose -- controls the verbosity of output from /usr/lib/sendmail
+   verbose -- controls the verbosity of output from /usr/sbin/sendmail
    quiet -- controls the verbosity of output from the mailto program.
    keepblind -- controls whether or not a 'blind' copy of the mail is kept.
   commasonly -- controls whether or not a space character
--- a/metamail/Makefile
+++ b/metamail/Makefile
@@ -41,9 +41,9 @@ shared.o:  shared.c ../config.h
 
 splitmail.o:  shared.c ../config.h
 
-mmencode: mmencode.o codes.o
+mmencode: mmencode.o codes.o shared.o
 	$(RM) -f mmencode
-	$(CC) $(LOCALCFLAGS) -o mmencode  mmencode.o  codes.o $(LDLIBS)
+	$(CC) $(LOCALCFLAGS) -o mmencode  mmencode.o  codes.o shared.o $(LDLIBS)
 
 mailto: mailto.o codes.o shared.o
 	$(RM) -f mailto
@@ -53,9 +53,10 @@ splitmail: splitmail.o shared.o
 	$(RM) -f splitmail
 	$(CC) $(LOCALCFLAGS) -o splitmail  splitmail.o shared.o $(LDLIBS)
 
-metamail:  metamail.o codes.o uue.o shared.o putenv.o
+#metamail:  metamail.o codes.o uue.o shared.o putenv.o
+metamail:  metamail.o codes.o uue.o shared.o
 	$(RM) -f metamail
-	$(CC) $(LOCALCFLAGS) -o metamail  metamail.o  putenv.o codes.o uue.o shared.o $(LDLIBS)
+	$(CC) $(LOCALCFLAGS) -o metamail  metamail.o  codes.o uue.o shared.o $(LDLIBS)
 
 clean:
 	$(RM) -f metamail mmencode mailto splitmail *.o *.BAK
--- a/metamail/codes.c
+++ b/metamail/codes.c
@@ -19,6 +19,7 @@ WITHOUT ANY EXPRESS OR IMPLIED WARRANTIE
 extern char *index();
 static char basis_64[] =
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+void output64chunk();
 
 static char index_64[128] = {
     -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
@@ -69,6 +70,7 @@ int PortableNewlines;
 #endif
 }
 
+void
 to64(infile, outfile, PortableNewlines) 
 FILE *infile, *outfile;
 int PortableNewlines;
@@ -97,6 +99,7 @@ int PortableNewlines;
     fflush(outfile);
 }
 
+void
 output64chunk(c1, c2, c3, pads, outfile)
 FILE *outfile;
 {
@@ -114,6 +117,7 @@ FILE *outfile;
     }
 }
 
+int
 PendingBoundary(s, Boundaries, BoundaryCt)
 char *s;
 char **Boundaries;
@@ -140,6 +144,7 @@ int *BoundaryCt;
 static int CRpending = 0;
 
 #ifdef NEWLINE_CHAR
+void
 almostputc(c, outfile, PortableNewlines)
 int c;
 FILE *outfile;
@@ -165,6 +170,7 @@ int PortableNewlines;
     }
 }
 #else
+void
 almostputc(c, outfile, PortableNewlines)
 int c;
 FILE *outfile;
@@ -174,6 +180,7 @@ int PortableNewlines;
 }
 #endif
 
+void
 from64(infile, outfile, boundaries, boundaryct, PortableNewlines) 
 FILE *infile, *outfile;
 char **boundaries;
@@ -275,6 +282,7 @@ char c;
 }
 */
 
+void
 toqp(infile, outfile) 
 FILE *infile, *outfile;
 {
@@ -350,6 +358,7 @@ FILE *infile, *outfile;
     }
 }
 
+void
 fromqp(infile, outfile, boundaries, boundaryct) 
 FILE *infile, *outfile;
 char **boundaries;
@@ -360,7 +369,7 @@ int *boundaryct;
     /* The neednewline hack is necessary because the newline leading into 
       a multipart boundary is part of the boundary, not the data */
 
-    while ((c1 = getc(infile)) != EOF) {
+    while ((int)(c1 = getc(infile)) != EOF) {
         if (sawnewline && boundaries && (c1 == '-')) {
             char Buf[200];
             unsigned char *s;
--- a/metamail/mailto.c
+++ b/metamail/mailto.c
@@ -60,8 +60,63 @@ extern char *getenv();
 #include <unistd.h>
 #endif
 
+#ifndef LINUX
 extern char *malloc(), *realloc(), *index(), *getmyname();
+#else
+#include <stdlib.h>
+#include <string.h>
+#include <curses.h>
+#include <term.h>
+#include <time.h>
+extern char *getmyname();
+#endif
+extern FILE *Fopen();
+extern void to64();
+extern void toqp();
+extern int DoesNeedPortableNewlines();
+extern int lc2strcmp();
+extern int lc2strncmp();
+extern int ExceptionalNewline();
+extern void from64();
+extern void fromqp();
+
 struct mailpart *CreateNewPart();
+void nomemabort();
+int tfputs();
+void cleanexit();
+void ProcessInitFiles();
+void InitSignals();
+int ProcessMailcapFiles();
+void FputsQuotingLT();
+void TryClosingStyle();
+void TryOpeningStyle();
+void TempCloseStyles();
+void ReopenStyles();
+void ToggleStyle();
+int TranslateInputToEncodedOutput();
+void EditCurrentMessage();
+void EndStyle();
+void StartStyle();
+void WriteOutMessage();
+void RestoreCurrentStyles();
+int WriteDeadLetter();
+void SwitchToEuropean();
+void EmitHeader();
+void EmitHeaderWithAliases();
+void WriteContentTypeAndEncoding();
+void WriteCtypeNicely();
+int WhichEncodingForFile();
+void SetTextFlags();
+void BuildCommand();
+int ContainsEightBitChar();
+void ProcessOneMailRC();
+void HandleAliasCommand();
+void HandleSetCommand();
+void HeaderFputs();
+void PutQP();
+void EmitAddresses();
+void DeAlias();
+void fputsquoting();
 
 /* The main data structure for the multiple parts of the mail */
 
@@ -138,7 +193,7 @@ int  V_askcc=0, /* To ask about the Cc f
 int JustificationState = JUST_LEFT;
 
 
-EightBitCharHelp() {
+void EightBitCharHelp() {
     if (!CharacterSet || !strcmp(CharacterSet, "us-ascii")) {
         printf("There are no extended characters available for your US-ASCII terminal.\n\n");
         printf("If you are actually using a terminal or terminal emulator with a richer\ncharacter set, you must use the '-a' option or the 'MM_CHARSET' environment\nvariable to inform this program of that fact.\n");
@@ -199,13 +254,16 @@ tmpname() {
     return(s);
 }
 
-TildeHelp() {
-    char *pager = getenv("PAGER");
+void TildeHelp() {
     char TmpName[100], CmdBuf[150];
+    char *pager;
     FILE *fp;
 
+    if ((pager = getenv("METAMAIL_PAGER")) == NULL)
+	pager = getenv("PAGER");
+
     strcpy(TmpName, tmpname());
-    fp = fopen(TmpName, "w");
+    fp = Fopen(TmpName, "w");
     if (!fp) fp = stdout;
     fprintf(fp, "The following tilde escapes are BSD-mail-compatible:\n");
     fprintf(fp, "~? Show help on tilde escapes\n");
@@ -298,7 +356,7 @@ char *gethome() {
 static char standoutbuf[50], standendbuf[50], StartUnderline[50], StopUnderline[50], BoldOn[50], BoldOff[50], KS[50], KE[50];
 static int termcolumns, termrows;
 
-InitTerminal() {
+void InitTerminal() {
 #ifdef AMIGA
     strcpy(standoutbuf, "\x9b\x37m");   /* Enter standout (highlighted) mode */
     strcpy(standendbuf, "\x9b\x30m");   /* Exit standout mode */
@@ -350,7 +408,7 @@ InitTerminal() {
 #endif
 }
 
-FinalizeTerminal() {
+void FinalizeTerminal() {
     tfputs(standendbuf);
     tfputs(BoldOff);
     tfputs(StopUnderline);
@@ -375,7 +433,7 @@ NewPart() {
     return(p);
 }
 
-nomemabort() {
+void nomemabort() {
     fprintf(stderr, "mailto: Out of memory\n");
     cleanexit(-1);
 }
@@ -431,7 +489,7 @@ char *s;
 
     if (V_commasonly) {
         ans = malloc(1+strlen(s));
-        if (!ans) nomemabort;
+        if (!ans) nomemabort();
         strcpy(ans, s);
         return(ans);
     }
@@ -484,7 +542,7 @@ int definitelynew;
     return(List);
 }
 
-main(argc, argv)
+int main(argc, argv)
 char **argv;
 {
     char *sdum, *LineBuf, CmdBuf[100];
@@ -591,7 +649,7 @@ char **argv;
     }
     FirstPart = NewPart();
     CurrentPart = FirstPart;
-    fpout = fopen(CurrentPart->filename, "w");
+    fpout = Fopen(CurrentPart->filename, "w");
     if (!fpout) {
         fprintf(stderr, "mailto:  Can't open temporary file %s\n", CurrentPart->filename);
         cleanexit(-1);
@@ -678,7 +736,7 @@ char **argv;
                     CurrentPart->next = NewPart();
                     CurrentPart->next->prev = CurrentPart;
                     CurrentPart = CurrentPart->next;
-                    fpout = fopen(CurrentPart->filename, "w");
+                    fpout = Fopen(CurrentPart->filename, "w");
                     if (!fpout) {
                         fprintf(stderr, "mailto:  Can't open temporary file %s\n", CurrentPart->filename);
                         cleanexit(-1);
@@ -717,7 +775,7 @@ char **argv;
                     CurrentPart = CurrentPart->next;
                     CurrentPart->istext = 0;
                     CurrentPart->content_type = "message/rfc822";
-                    fpout = fopen(CurrentPart->filename, "w");
+                    fpout = Fopen(CurrentPart->filename, "w");
                     if (!fpout) {
                         fprintf(stderr, "mailto: Cannot open temporary file %s\n", CurrentPart->filename);
                         break;
@@ -729,7 +787,7 @@ char **argv;
                     CurrentPart->next = NewPart();
                     CurrentPart->next->prev = CurrentPart;
                     CurrentPart = CurrentPart->next;
-                    fpout = fopen(CurrentPart->filename, "w");
+                    fpout = Fopen(CurrentPart->filename, "w");
                     if (!fpout) {
                         fprintf(stderr, "mailto:  Can't open temporary file %s\n", CurrentPart->filename);
                         cleanexit(-1);
@@ -808,11 +866,11 @@ char **argv;
                     char Cmd[TMPFILE_NAME_SIZE + 15];
                     char *s=tmpname();
                     fclose(fpout);
-                    fptmp = fopen(s, "w");
+                    fptmp = Fopen(s, "w");
                     WriteOutMessage(fptmp, ToList, Subject, CCList, FirstPart);
                     TempCloseStyles(fptmp);
                     fclose(fptmp);
-                    fpout = fopen(CurrentPart->filename, "a");
+                    fpout = Fopen(CurrentPart->filename, "a");
                     if (!fpout) {
                         fprintf(stderr, "mailto:  Can't open temporary file %s\n", CurrentPart->filename);
                         cleanexit(-1);
@@ -896,7 +954,7 @@ char **argv;
                     char *fname;
                     fclose(fpout);
                     fname = start;
-                    fptmp = fopen(fname, "w");
+                    fptmp = Fopen(fname, "w");
                     WriteOutMessage(fptmp, ToList, Subject, CCList, FirstPart);
                     TempCloseStyles(fptmp);
                     if(fclose(fptmp)) {
@@ -904,7 +962,7 @@ char **argv;
                     } else {
                         printf("Wrote draft to %s\n", fname);
                     }
-                    fpout = fopen(CurrentPart->filename, "a");
+                    fpout = Fopen(CurrentPart->filename, "a");
                     if (!fpout) {
                         fprintf(stderr, "mailto:  Can't open temporary file %s\n", CurrentPart->filename);
                         cleanexit(-1);
@@ -969,7 +1027,7 @@ char **argv;
                     CurrentPart = CurrentPart->next;
                     CurrentPart->istext = 0;
                     CurrentPart->content_type = "message/rfc822";
-                    fpout = fopen(CurrentPart->filename, "w");
+                    fpout = Fopen(CurrentPart->filename, "w");
                     if (!fpout) {
                         fprintf(stderr, "mailto: Cannot open temporary file %s\n", CurrentPart->filename);
                         break;
@@ -991,7 +1049,7 @@ char **argv;
                     CurrentPart->next = NewPart();
                     CurrentPart->next->prev = CurrentPart;
                     CurrentPart = CurrentPart->next;
-                    fpout = fopen(CurrentPart->filename, "w");
+                    fpout = Fopen(CurrentPart->filename, "w");
                     if (!fpout) {
                         fprintf(stderr, "mailto:  Can't open temporary file %s\n", CurrentPart->filename);
                         cleanexit(-1);
@@ -1028,6 +1086,7 @@ char **argv;
         cleanexit(-1);
     }
     cleanexit(0); /* Never returns */
+    return 0;
 }
 
 char *newid() {
@@ -1042,7 +1101,7 @@ char *newid() {
     return(idbuf);
 }
 
-WriteOutMessage(fp, ToList, Subject, CCList, FirstPart)
+void WriteOutMessage(fp, ToList, Subject, CCList, FirstPart)
 FILE *fp;
 char *ToList, *Subject, *CCList;
 struct mailpart *FirstPart;
@@ -1121,7 +1180,7 @@ struct mailpart *FirstPart;
     }
 }
 
-WriteContentTypeAndEncoding(fp, part)
+void WriteContentTypeAndEncoding(fp, part)
 FILE *fp;
 struct mailpart *part;
 {
@@ -1160,7 +1219,7 @@ struct mailpart *part;
     }
 }
 
-TranslateInputToEncodedOutput(InputFP, OutputFP, Ecode, ctype)
+int TranslateInputToEncodedOutput(InputFP, OutputFP, Ecode, ctype)
 FILE *InputFP, *OutputFP;
 int Ecode;
 char *ctype;
@@ -1192,7 +1251,7 @@ static char *EnvStartStack[MAX_STACK_SIZ
    kept open across an inserted object -- i.e. the richtext is split into 
    two parts of a multipart message */
 
-TempCloseStyles(fp)
+void TempCloseStyles(fp)
 FILE *fp;
 {
     int i = StackSize;
@@ -1205,7 +1264,7 @@ FILE *fp;
     fflush(stdout);
 }
 
-RestoreCurrentStyles() {
+void RestoreCurrentStyles() {
     int i=0;
     while (i<StackSize) {
         if (EnvStartStack[i]) {
@@ -1215,7 +1274,7 @@ RestoreCurrentStyles() {
     }
 }
 
-ReopenStyles(fp, part)
+void ReopenStyles(fp, part)
 FILE *fp;
 struct mailpart *part;
 {
@@ -1227,12 +1286,12 @@ struct mailpart *part;
     }
 }
 
-richtextreset()
+void richtextreset()
 {
     StackSize = 0;
 }
 
-AlreadyInStyle(s)
+int AlreadyInStyle(s)
 char *s;
 {
     int i;
@@ -1242,7 +1301,7 @@ char *s;
     return(0);
 }
 
-StartStyle(fp, s, envstartstr)
+void StartStyle(fp, s, envstartstr)
 FILE *fp;
 char *s;
 char *envstartstr;
@@ -1258,7 +1317,7 @@ char *envstartstr;
     if (!V_quiet) printf("Beginning: %s\n", t);
 }
 
-EndStyle(fp, s)
+void EndStyle(fp, s)
 FILE *fp;
 char *s;
 {
@@ -1282,7 +1341,7 @@ char *s;
     if (!V_quiet) printf("Ending: %s\n", s);
 }
 
-ToggleStyle(name, fp, part, turnonstr, turnoffstr)
+void ToggleStyle(name, fp, part, turnonstr, turnoffstr)
 char *name;
 FILE *fp;
 struct mailpart *part;
@@ -1301,7 +1360,7 @@ char *turnonstr, *turnoffstr;
     }
 }
 
-TryOpeningStyle(name, fp, part, envstartstr)
+void TryOpeningStyle(name, fp, part, envstartstr)
 char *name;
 FILE *fp;
 struct mailpart *part;
@@ -1315,7 +1374,7 @@ char *envstartstr;
     }
 }
 
-TryClosingStyle(name, fp, part)
+void TryClosingStyle(name, fp, part)
 char *name;
 FILE *fp;
 struct mailpart *part;
@@ -1328,7 +1387,7 @@ struct mailpart *part;
     }
 }
 
-FputsQuotingLT(s, fp, part, EightBitMode, RightToLeftMode)
+void FputsQuotingLT(s, fp, part, EightBitMode, RightToLeftMode)
 char *s;
 FILE *fp;
 struct mailpart *part;
@@ -1393,14 +1452,7 @@ int EightBitMode, RightToLeftMode;
     }
 }
 
-cleanexit(code)
-int code;
-{
-    finalize();
-    exit(code);
-}
-
-finalize() {
+void finalize() {
     while (FirstPart) {
         unlink(FirstPart->filename);
         FirstPart = FirstPart->next;
@@ -1408,6 +1460,13 @@ finalize() {
     FinalizeTerminal();
 }
 
+void cleanexit(code)
+int code;
+{
+    finalize();
+    exit(code);
+}
+
 void
 cleanup(signum)
 int signum;
@@ -1436,7 +1495,7 @@ int signum;
 #endif
 }
 
-InitSignals() {
+void InitSignals() {
     signal(SIGINT, cleanup);
 #ifndef AMIGA
     signal(SIGPIPE, cleanup);
@@ -1456,7 +1515,7 @@ InitSignals() {
 #endif
 }
 
-WriteDeadLetter()
+int WriteDeadLetter()
 {
     FILE *fp;
 #ifdef AMIGA
@@ -1473,7 +1532,7 @@ WriteDeadLetter()
     char DeadFile[1000];
 
     sprintf(DeadFile, "%s/dead.letter", gethome());
-    fp = fopen(DeadFile, "w");
+    fp = Fopen(DeadFile, "w");
     WriteOutMessage(fp, ToList, Subject, CCList, FirstPart);
     if(fclose(fp)) {
         perror("Could not write ~/dead.letter\n");
@@ -1587,7 +1646,7 @@ FILE *fp;
 	if (LineBuf[0] == '#') continue;
 	len = strlen(LineBuf);
         if (LineBuf[len-1] == '\n') LineBuf[--len] = '\0';
-	if ((len + strlen(rawentry)) > rawentryalloc) {
+	if ((len + (int)strlen(rawentry)) > rawentryalloc) {
             rawentryalloc += MAX_LINELENGTH;
 	    rawentry = realloc(rawentry, rawentryalloc+1);
 	    if (!rawentry) nomemabort();
@@ -1662,7 +1721,7 @@ FILE *fp;
     return(mc);
 }
 
-ProcessMailcapFiles() 
+int ProcessMailcapFiles() 
 {
     char *s, *path = getenv("MAILCAPS"), *origpath;
     static char *stdpath = STDPATH;
@@ -1773,7 +1832,7 @@ CreateNewPart() {
             printf("Cannot read %s, data insertion cancelled\n", sdum);
             return(NULL);
         }
-        fpo = fopen(mp->filename, "w");
+        fpo = Fopen(mp->filename, "w");
         if (!fpo) {
             printf("Cannot open temporary file, data insertion cancelled\n");
             return(NULL);
@@ -1791,7 +1850,9 @@ CreateNewPart() {
                 int ct;
                 printf("\nEnter the MIME Content-type value for the data from file %s\n    (type '?' for a list of locally-valid content-types): ", sdum);
                 fflush(stdout);
-                gets(LineBuf);
+                fgets(LineBuf, sizeof(LineBuf), stdin);
+                if (LineBuf[strlen(LineBuf)-1] == '\n')
+                    LineBuf[strlen(LineBuf)-1] = '\0';
                 if (index(LineBuf, '/')) {
                     char lc[100], *s, AnsBuf[100];
                     strcpy(lc, LineBuf);
@@ -1809,7 +1870,7 @@ CreateNewPart() {
                     }
                     if (mc) break;
                     printf("The MIME content-type '%s' is not listed in your local mailcap files,\nand may not be a valid MIME type.  Do you want to use it anyway [no] ? ", LineBuf);
-                    s = gets(AnsBuf);
+                    s = fgets(AnsBuf, sizeof(AnsBuf), stdin);
                     while (s && *s && isspace((unsigned char) *s)) ++s;
                     if (s && (*s == 'y' || *s == 'Y')) break;
                     continue;
@@ -1866,9 +1927,9 @@ CreateNewPart() {
         mp->content_type = mc->contenttype;
         mp->encoding_type_needed = WhichEncodingForFile(mp->filename, mp->content_type);
     } else {
-        char c, LineBuf[1000], *colon, *ctypebuf = NULL, *cencbuf = NULL, *s, *newfilename;
+        char LineBuf[1000], *colon, *ctypebuf = NULL, *cencbuf = NULL, *s, *newfilename;
         FILE *fp, *fpout;
-        int inheaders=1, bct=0;
+        int c, inheaders=1, bct=0;
 
         s = LineBuf;
         fp = fopen(mp->filename, "r");
@@ -1936,7 +1997,7 @@ CreateNewPart() {
             mp->encoding_type_needed = ENC_NONE;
         }
         newfilename = tmpname();
-        fpout = fopen(newfilename, "w");
+        fpout = Fopen(newfilename, "w");
         if (!fpout) {
             fprintf(stderr, "Cannot open file %s for writing, no data included.\n", newfilename);
             free(CmdBuf);
@@ -1967,7 +2028,7 @@ CreateNewPart() {
     return(mp);
 }
 
-SetTextFlags(mp)
+void SetTextFlags(mp)
 struct mailpart *mp;
 {
     if (!lc2strncmp(mp->content_type, "text/", 5)) {
@@ -1978,7 +2039,7 @@ struct mailpart *mp;
     }
 }
 
-WhichEncodingForFile(fname, ctype)
+int WhichEncodingForFile(fname, ctype)
 char *fname, *ctype;
 {
     int c, linesize=0, total=0, unsafechars=0, longlines=0;
@@ -2014,7 +2075,7 @@ char *fname, *ctype;
     return(ENC_NONE);
 }
 
-BuildCommand(Buf, controlstring, TmpFileName)
+void BuildCommand(Buf, controlstring, TmpFileName)
 char *Buf, *controlstring, *TmpFileName;
 {
     char *from, *to;
@@ -2052,7 +2113,7 @@ char *Buf, *controlstring, *TmpFileName;
     }
 }
 
-CtypeMatch(ctype, pat)
+int CtypeMatch(ctype, pat)
 char *ctype, *pat;
 {
     int len;
@@ -2073,7 +2134,7 @@ char *ctype, *pat;
     return(0);
 }
 
-EditCurrentMessage(UseVisual)
+void EditCurrentMessage(UseVisual)
 int UseVisual;
 {
     char *editor = NULL;
@@ -2106,7 +2167,7 @@ int UseVisual;
              ContainsEightBitChar(FirstPart->filename)) {
             FirstPart->encoding_type_needed = ENC_QP;
         }
-        fpout = fopen(FirstPart->filename, "a");
+        fpout = Fopen(FirstPart->filename, "a");
         free(CmdBuf);
         free(CmdBuf2);
         return;
@@ -2156,13 +2217,13 @@ int UseVisual;
         lastmp = mp;
         mp = mp->next;
     }
-    fpout = fopen(lastmp->filename, "a");
+    fpout = Fopen(lastmp->filename, "a");
     free(CmdBuf);
     free(CmdBuf2);
 }
 
 
-ProcessInitFiles() {
+void ProcessInitFiles() {
 #ifdef AMIGA
     ProcessOneMailRC(mailRC, 0);
 #else
@@ -2212,7 +2273,7 @@ int IsAndrew;
     }
 }
 
-ProcessOneMailRC(fname, IsAndrew)
+void ProcessOneMailRC(fname, IsAndrew)
 char *fname;
 int IsAndrew;
 {
@@ -2246,7 +2307,7 @@ int IsAndrew;
     fclose(fp);
 }
 
-HandleSetCommand(cmd, DoSet)
+void HandleSetCommand(cmd, DoSet)
 char *cmd;
 int DoSet;
 {
@@ -2290,7 +2351,7 @@ struct alias {
     struct alias *next;
 } *FirstAlias = NULL;
 
-HandleAliasCommand(aliasline)
+void HandleAliasCommand(aliasline)
 char *aliasline;
 {
     struct alias *tmpalias;
@@ -2319,7 +2380,7 @@ char *aliasline;
     FirstAlias = tmpalias;
 }
 
-EmitHeader(fp, hdr, body)
+void EmitHeader(fp, hdr, body)
 FILE *fp;
 char *hdr;
 char *body;
@@ -2357,7 +2418,7 @@ char *s;
     return(NULL);
 }
 
-HeaderFputs(s, fp, hdr)
+void HeaderFputs(s, fp, hdr)
 char *s;
 FILE *fp;
 char *hdr;
@@ -2384,7 +2445,7 @@ char *hdr;
                 PutQP(*s, fp);
                 ++s;
             }
-            fputs("?= ", fp); /* close encoded word */
+            fputs("?=", fp); /* close encoded word */
             firstnonascii=firstbad(s);
         }
         while (*s) {
@@ -2398,7 +2459,7 @@ char *hdr;
 
 static char basis_hex[] = "0123456789ABCDEF";
 
-PutQP(c, fp)
+void PutQP(c, fp)
 unsigned char c;
 FILE *fp;
 {
@@ -2407,7 +2468,7 @@ FILE *fp;
     putc(basis_hex[c&0xF], fp);
 }
 
-EmitHeaderWithAliases(fp, hdr, names)
+void EmitHeaderWithAliases(fp, hdr, names)
 FILE *fp;
 char *hdr;
 char *names;
@@ -2418,7 +2479,7 @@ char *names;
     fputs("\n", fp);
 }
 
-EmitAddresses(fp, names, hdr)
+void EmitAddresses(fp, names, hdr)
 FILE *fp;
 char *names;
 char *hdr;
@@ -2436,7 +2497,7 @@ char *hdr;
     }
 }
 
-DeAlias(name, fp, hdr)
+void DeAlias(name, fp, hdr)
 char *name;
 FILE *fp;
 char *hdr;
@@ -2462,7 +2523,7 @@ char *hdr;
 }
 
 
-WriteCtypeNicely(fp, ct)
+void WriteCtypeNicely(fp, ct)
 FILE *fp;
 char *ct;
 {
@@ -2497,7 +2558,7 @@ char *ct;
     }
 }
 
-fputsquoting(s, fp)
+void fputsquoting(s, fp)
 char *s;
 FILE *fp;
 {
@@ -2566,28 +2627,29 @@ char *cmd;
 }
 #endif
 
-controlputc(c)
+int controlputc(c)
 char c;
 {
-    fputc(c, stdout);
+    return fputc(c, stdout);
 }
 
 /* Do the equivalent of an fputs for the terminal escape stuff */
 #ifdef AMIGA
-tfputs(s)
+int tfputs(s)
 char *s;
 {
     fputs(s, stdout);
     return (0);
 }
 #else
-tfputs(s)
+int tfputs(s)
 char *s;
 {
     tputs(s, 1, controlputc);
+    return (0);
 }
 #endif
-ContainsEightBitChar(fname)
+int ContainsEightBitChar(fname)
 char *fname;
 {
     int c, eightBitSeen = 0;
@@ -2607,7 +2669,7 @@ char *fname;
     return(eightBitSeen);
 }
 
-SwitchToEuropean() {
+void SwitchToEuropean() {
     printf("WARNING:  You have entered 8-bit characters in what is supposed to be\n");
     printf("plain ASCII text.  If you are using a non-ASCII character set, you should\n");
     printf("declare this to be the case with the MM_CHARSET environment variable.\n");
--- a/metamail/metamail.c
+++ b/metamail/metamail.c
@@ -47,7 +47,17 @@ extern char *mktemp(char *);
 
 #ifndef AMIGA
 #ifdef SYSV
+#ifdef LINUX
+#include <termios.h>
+#include <malloc.h>
+#include <stdlib.h>
+#include <time.h>
+#include <signal.h>
+#include <string.h>
+#else
 #include <termio.h>
+#endif
+#include <sys/ioctl.h>
 #include <unistd.h>
 #else /* SYSV */
 #include <sgtty.h>
@@ -56,7 +66,7 @@ extern char *mktemp(char *);
 #endif /* MICROSOFT */
 #endif /* BORLAND */
 
-#ifdef SYSV
+#if defined(SYSV) && !defined(LINUX)
 #define LPRTEMPLATE "lp %s"
 #define LPRCOMMAND "lp"
 #else
@@ -83,12 +93,19 @@ extern char *MkRmScript();
 #define MAX_FILE_NAME_SIZE 256
 #define WRITE_BINARY	"w"
 #else /* AMIGA */
-extern char **environ, *gets();
+#include <stdio.h>	/* declare gets(3) */
+extern char **environ;
 #define CATCOMMAND  "cat"
 #define CATTEMPLATE "cat %s"
 #define METAMAIL    "metamail"
+#ifdef LINUX
+#include <limits.h>
+#define TMPFILE_NAME_SIZE	PATH_MAX
+#define MAX_FILE_NAME_SIZE	PATH_MAX
+#else
 #define TMPFILE_NAME_SIZE   1000
 #define MAX_FILE_NAME_SIZE 1000
+#endif
 #define WRITE_BINARY	"w"
 #endif /* AMIGA */
 #endif /* MSDOS */
@@ -100,17 +117,61 @@ extern char **environ, *gets();
 #define CMDSIZE 1200 /* Maximum size of command to execute */
 
 #define LINE_BUF_SIZE       2000
-#ifndef MICROSOFT
-extern char *malloc();
-extern char *realloc();
-#endif
+#ifndef LINUX
 extern char *getenv();
 extern char *index();
 extern char *rindex();
+#endif
 char fileToDelete[MAX_FILE_NAME_SIZE];
+void ExitWithError();
+void RestoreTtyState();
+int ProcessArguments();
+int HandleMessage();
+void PauseForUser();
+int Read822Prefix();
+void PrepareMessage();
+int ProcessMailcapFiles(); 
+int ProcessMailcapFile();
+int SaveSquirrelFile();
+void MkTmpFileName();
+int TryBuiltIns(); 
+void TranslateInputToOutput();
+void usage();
+void StripTrailingSpace();
+void RunInNewWindow();
+void CreateNewWindowPrefix();
+void SetUpEnvironment();
+int TryMailcapEntry();
+int IsDirectory();
+int GetMailcapEntry();
+int CtypeMatch();
+int PassesTest();
+int ExecuteMailcapEntry();
+void BuildCommand();
+void SaveTtyState();
+int NeedToAskBeforeExecuting();
+int OKToRun();
+void strcatquoting();
+int WriteTmpFile();
+int ExecuteCommand();
+void maybephead();
+void phead();
+void EliminateNastyChars();
+void strcpynoquotes();
+int StartRawStdin();
 
 char *FindParam();
 extern FILE *popen();
+extern FILE *Fopen();
+extern int lc2strncmp();
+extern int lc2strcmp();
+extern int ExceptionalNewline();
+extern void from64();
+extern int DoesNeedPortableNewlines();
+extern void fromqp();
+extern void fromuue ();
+extern int PendingBoundary();
+
 static char *nomem = "Out of memory!";
 static char *mmversion = MM_VERSTRING;
 static char *NoAskDefault = "text,text/plain,text/richtext";
@@ -295,6 +356,7 @@ char *auxpath;
     }
 }
 
+int
 main(argc, argv)
 int argc;
 char **argv;
@@ -387,6 +449,7 @@ char *fname;
     }
 }
 
+int
 HandleMessage(SquirrelFile, nestingdepth)
 char *SquirrelFile;
 /* SquirrelFile, if non-NULL, is a place to save a recognized body instead of executing it. */
@@ -423,7 +486,7 @@ int nestingdepth;
       } else {
         char *LineBuf, NewSquirrelFile[TMPFILE_NAME_SIZE];
         char *subtype = NULL;
-        int currct, result, IsAlternative, WroteSquirrelFile, boundarylen;
+        int currct, result, IsAlternative, WroteSquirrelFile = 0, boundarylen;
 
         if (SquirrelFile) return(SaveSquirrelFile(SquirrelFile));
         if (boundary[0] == '"') {
@@ -579,7 +642,7 @@ int nestingdepth;
                                 int overwriteans = -1;
                                 do {
                                     printf("File %s exists.  Do you want to overwrite it (y/n) ?\n", Fname);
-                                    s = gets(AnsBuf);
+                                    s = fgets(AnsBuf, sizeof(AnsBuf), stdin);
                                     if (!s) {
                                         overwriteans = 0;
                                     } else {
@@ -645,7 +708,7 @@ int nestingdepth;
         if (Fname[0] == 0 || Fname[0] == '\n') {
             ConsumeRestOfPart(NULL);
         } else {
-            fp = fopen(Fname, WRITE_BINARY);
+            fp = Fopen(Fname, WRITE_BINARY);
             if (!fp) ExitWithError("Cannot open temporary file");
             TranslateInputToOutput(InputFP, fp, EncodingCode, ContentType);
             ecode = fclose(fp);
@@ -661,6 +724,7 @@ int nestingdepth;
     return(-1); /* Unrecognized, really */
 }
 
+int
 ProcessArguments(argc, argv)
 int argc;
 char **argv;
@@ -940,11 +1004,13 @@ char **argv;
     return(0);
 }
 
+void
 usage() {
     fprintf(stderr, "Usage:  metamail [-b] [-B] [-d] [-e] [-h] [-r] [-R] [-p]  [-P] [-x] [-y] [-z] [-c content-type] [-E content-transfer-encoding] [-f from-name] [-m mailername] [-s subject] [message-file-name]\n");
     ExitWithError(NULL);
 }
 
+void
 RunInNewWindow(argv, argc, SourceFileNamePtr)
 char **argv, **SourceFileNamePtr;
 int argc;
@@ -960,7 +1026,7 @@ int argc;
         /* Create it, ugh.  Also needs to affect later command. */
         MkTmpFileName(TmpName);
         DeleteSourceFileWhenDone = 1;
-        fptmp = fopen(TmpName, WRITE_BINARY);
+        fptmp = Fopen(TmpName, WRITE_BINARY);
         if (!fptmp) ExitWithError("Can't open temporary file\n");
         while (fgets(LineBuf, LINE_BUF_SIZE, stdin)) {
             fputs(LineBuf, fptmp);
@@ -1026,6 +1092,7 @@ struct MailcapEntry BuiltInsAlternative[
     {"text/plain", CATTEMPLATE, NULL, 0, 1, 0, "plain text", LPRTEMPLATE},
     {NULL, NULL, NULL, 0, 0, 0}};
 
+int
 ProcessMailcapFiles(SquirrelFile) 
 char *SquirrelFile;
 {
@@ -1082,6 +1149,7 @@ char *SquirrelFile;
 #endif /* MICROSOFT */
 }
 
+int
 TryBuiltIns(SquirrelFile) 
 char *SquirrelFile;
 {
@@ -1094,6 +1162,7 @@ char *SquirrelFile;
     return(-1);
 }
 
+int
 ProcessMailcapFile(file, SquirrelFile)
 char *file, *SquirrelFile;
 {
@@ -1166,6 +1235,7 @@ eatmore:
     }
 }    
 
+int
 TryMailcapEntry(mc, SquirrelFile)
 struct MailcapEntry mc;
 char *SquirrelFile;
@@ -1189,12 +1259,13 @@ char *SquirrelFile;
     return(-1);
 }
 
+int
 SaveSquirrelFile(SquirrelFile)
 char *SquirrelFile;
 {
     int j;
     FILE *outfp;
-    outfp = fopen(SquirrelFile, WRITE_BINARY);
+    outfp = Fopen(SquirrelFile, WRITE_BINARY);
     if (!outfp) {
         fprintf(stderr, "Cannot open %s to squirrel away a portion of a multipart/alternative\n", SquirrelFile);
         return(-1);
@@ -1214,6 +1285,7 @@ char *SquirrelFile;
     return(0);
 }
 
+int
 ExecuteMailcapEntry(mc, TmpFileName, ThisContentType)
 char *TmpFileName, *ThisContentType;
 struct MailcapEntry mc;
@@ -1361,6 +1433,7 @@ struct MailcapEntry mc;
     return(0);
 }
 
+int
 PassesTest(mc)
 struct MailcapEntry *mc;
 {
@@ -1414,6 +1487,7 @@ char *s, **t;
     return(NULL);
 }	
 
+int
 GetMailcapEntry(fp, mc)
 FILE *fp;
 struct MailcapEntry *mc;
@@ -1431,7 +1505,7 @@ struct MailcapEntry *mc;
         len = strlen(LineBuf);
         if (len == 0) continue;
         if (LineBuf[len-1] == '\n') LineBuf[--len] = 0;
-	if ((len + strlen(rawentry)) > rawentryalloc) {
+	if ((len + (int)strlen(rawentry)) > rawentryalloc) {
 	    rawentryalloc += 2000;
 	    rawentry = realloc(rawentry, rawentryalloc+1);
 	    if (!rawentry) ExitWithError(nomem);
@@ -1507,6 +1581,7 @@ struct MailcapEntry *mc;
     return(1);
 }
 
+void
 ExitWithError(txt)
 char *txt;
 {
@@ -1526,7 +1601,7 @@ char *s;
     while (t && (*(t+1) == ' ' || *(t+1) == '\t')) {
         t = index(t+1, '\n');
     }
-    len = t ? (t-s+1) : (strlen(s)+1);
+    len = t ? (t-s+1) : (int)(strlen(s)+1);
     newcopy = malloc(len+3);/* two extra bytes for a bizarre bug caused by the fact that FindParam calls FreshHeaderCopy and sometimes tacks on "--". */
     if (!newcopy) ExitWithError(nomem);
     strncpy(newcopy, s, len);
@@ -1534,6 +1609,7 @@ char *s;
     return(newcopy);
 }
 
+int
 Read822Prefix(PrintHeads, nestingdepth)
 int PrintHeads, nestingdepth;
 {
@@ -1654,6 +1730,7 @@ yankagain:
     return 0;
 }
 
+void
 PrepareMessage() {
     int c;
 
@@ -1688,6 +1765,7 @@ PrepareMessage() {
     SetUpEnvironment();  
 }
 
+void
 SetUpEnvironment() { 
     int i, j, environsize;
     char **newenviron, *mailervar, *summaryvar, *ctypevar, *s;
@@ -1798,7 +1876,7 @@ char *def;
     nameBuf[(cp - def) + 4] = 0;
     cp++;               /* Now points to value part of environment string. */
 
-    if ((envFile = fopen(nameBuf, "w")) == NULL) {
+    if ((envFile = Fopen(nameBuf, "w")) == NULL) {
         return(2);
     }
 
@@ -1809,6 +1887,7 @@ char *def;
 }
 #endif
 
+int
 OKToRun(ctype, progname, label)
 char *ctype, *progname, *label;
 {
@@ -1823,7 +1902,7 @@ char *ctype, *progname, *label;
         } else {
             printf("This message contains '%s'-format data.\nDo you want to view it using the '%s' command (y/n) [y] ? ", ctype, ShortCommand(progname));
         }
-        s = gets(AnsBuf);
+        s = fgets(AnsBuf, sizeof(AnsBuf), stdin);
         if (!s) return(0); /* EOF */
 	while (s && *s && isspace((unsigned char) *s)) ++s;
 	if (*s == 'y' || *s == 'Y' || !*s || *s == '\n') return(1);
@@ -1834,6 +1913,7 @@ char *ctype, *progname, *label;
     }
 }
 
+void
 EliminateNastyChars(s)
 char *s;
 {
@@ -1848,6 +1928,7 @@ char *s;
     }
 }
 
+void
 StripTrailingSpace(s)
 char *s;
 {
@@ -1900,6 +1981,7 @@ char *hdr;
 }
 
 /* check the header given to see if it matches any in the KeyHeadList */
+void
 maybephead(hdr)
 char *hdr;
 {
@@ -1934,6 +2016,7 @@ char *hdr;
 }
 
 /* This next routine prints out a mail header, and needs to deal with the new extended charset headers. */
+void
 phead(s)
 char *s;
 {
@@ -2037,7 +2120,7 @@ int ShowLeadingWhitespace;
     } else {
         /* What follows is REALLY bogus, but all my encoding stuff is pipe-oriented right now... */
         MkTmpFileName(TmpFile);
-        fp = fopen(TmpFile, WRITE_BINARY);
+        fp = Fopen(TmpFile, WRITE_BINARY);
         if (!fp) {
             fprintf(stderr, "Could not open temporary file\n");
         } else {
@@ -2068,6 +2151,7 @@ int ShowLeadingWhitespace;
     PrintHeader(txtend + 2, 0);
 }
 
+void
 BuildCommand(Buf, controlstring, TmpFileName, UsedTmpFileName, PartsWritten)
 char *Buf, *controlstring, *TmpFileName;
 int *UsedTmpFileName;
@@ -2192,7 +2276,7 @@ struct part **PartsWritten;
                             strcpy(thispart->fname, TmpFileNameBuf);
                             WriteTmpFile(thispart->fname, thispart->ctype);
                             strcat(TmpFileNameBuf, "H");
-                            headfp = fopen(TmpFileNameBuf, "w");
+                            headfp = Fopen(TmpFileNameBuf, "w");
                             if (headfp) {
                                 fputs(mailheaders+12, headfp);
                                 /* The +12 gets rid of MM_HEADERS=\n */
@@ -2280,6 +2364,7 @@ struct part **PartsWritten;
     *to = 0;
 }
 
+void
 strcpynoquotes(t,f)
 char *t, *f;
 {
@@ -2291,6 +2376,7 @@ char *t, *f;
     }
 }
 
+int
 WriteTmpFile(fname, ctype)
 char *fname;
 char *ctype;
@@ -2298,7 +2384,7 @@ char *ctype;
     FILE *fpout;
     int retval = 0;
 
-    fpout = fopen(fname, WRITE_BINARY);
+    fpout = Fopen(fname, WRITE_BINARY);
     if (!fpout) {
         perror("WriteTmpFile");
         ExitWithError("Can't create temporary file");
@@ -2309,7 +2395,7 @@ char *ctype;
     return(retval);
 }
 
-
+void
 TranslateInputToOutput(InputFP, OutputFP, Ecode, ctype)
 FILE *InputFP, *OutputFP;
 int Ecode;
@@ -2337,6 +2423,7 @@ char *ctype;
 #endif
 }
 
+void
 CreateNewWindowPrefix(Prefix)
 char *Prefix;
 {
@@ -2377,18 +2464,28 @@ char *Prefix;
 int HasSavedTtyState=0;
 #if !defined(AMIGA) && !defined(MSDOS)
 #ifdef SYSV
+#ifdef LINUX
+static struct termios MyTtyStateIn, MyTtyStateOut;
+#else
 static struct termio MyTtyStateIn, MyTtyStateOut;
+#endif
 #else
 static struct sgttyb MyTtyStateIn, MyTtyStateOut;
 #endif
 #endif
 
+void
 SaveTtyState() {
     /* Bogus -- would like a good portable way to reset the terminal state here */
 #if !defined(AMIGA) && !defined(MSDOS)
 #ifdef SYSV
+#ifdef LINUX
+    tcgetattr(fileno(stdin),  &MyTtyStateIn);
+    tcgetattr(fileno(stdout), &MyTtyStateOut);
+#else
     ioctl(fileno(stdin), TCGETA, &MyTtyStateIn);
     ioctl(fileno(stdout), TCGETA, &MyTtyStateOut);
+#endif
 #else
     gtty(fileno(stdin), &MyTtyStateIn);
     gtty(fileno(stdout), &MyTtyStateOut);
@@ -2397,12 +2494,18 @@ SaveTtyState() {
 #endif
 }
 
+void
 RestoreTtyState() {
 #if !defined(AMIGA) && !defined(MSDOS)
 #ifdef SYSV
     if (HasSavedTtyState) {
+#ifdef LINUX
+	tcsetattr(fileno(stdout), TCSANOW, &MyTtyStateOut);
+	tcsetattr(fileno(stdin),  TCSANOW, &MyTtyStateIn);
+#else
         ioctl(fileno(stdout), TCSETA, &MyTtyStateOut);
         ioctl(fileno(stdin), TCSETA, &MyTtyStateIn);
+#endif
     }
 #else
     if (HasSavedTtyState) {
@@ -2413,6 +2516,7 @@ RestoreTtyState() {
 #endif
 }
 
+int
 NeedToAskBeforeExecuting(type)
 char *type;
 {
@@ -2424,6 +2528,7 @@ char *type;
     return(1);
 }
 
+int
 NeedToBeQuiet(cmd)
 char *cmd;
 {
@@ -2434,6 +2539,7 @@ char *cmd;
     return(0);
 }
 
+int
 CtypeMatch(ctype, pat)
 char *ctype, *pat;
 {
@@ -2460,6 +2566,7 @@ char *ctype, *pat;
     return(0);
 }
 
+int
 ExecuteCommand(cmd, really)
 char *cmd;
 int really;
@@ -2485,6 +2592,7 @@ int really;
     return(0);
 }
 
+void
 MkTmpFileName(name)
 char *name;
 {
@@ -2519,7 +2627,7 @@ char *nameBuf;
     FILE *script;
 
     MkTmpFileName(nameBuf);
-    if ((script = fopen(nameBuf, "w")) == NULL) {
+    if ((script = Fopen(nameBuf, "w")) == NULL) {
         fprintf(stderr, "Unable to open %s for writing\n", nameBuf);
         exit(1);
     }
@@ -2641,11 +2749,12 @@ char *s;
 }
 #endif
 
+void
 strcatquoting(s1, s2)
 char *s1;
 char *s2;
 {
-    strcat(s1, s2);
+    (void)strcat(s1, s2);
 #ifdef NOTDEF
     while (*s1) ++s1;
     while (*s2) {
@@ -2656,6 +2765,7 @@ char *s2;
 #endif
 }
 
+void
 PauseForUser() {
 #if defined(MSDOS) || defined(AMIGA)
     char Buf[100];
@@ -2680,17 +2790,27 @@ PauseForUser() {
 #endif
 }
 
+int
 StartRawStdin() {
 #if !defined(AMIGA) && !defined(MSDOS)
 #ifdef SYSV
+#ifdef LINUX
+    struct termios  orterm, fterm;
+    tcgetattr(0, &orterm);	/* get current (i.e. cooked) termio */
+#else
     struct termio   orterm, fterm;
     ioctl(0, TCGETA, &orterm);	/* get current (i.e. cooked) termio */
+#endif
     fterm = orterm;		/* get termio to modify */
 
     fterm.c_lflag &= ~ICANON;	/* clear ICANON giving raw mode */
     fterm.c_cc[VMIN] = 1;	/* set MIN char count to 1 */
     fterm.c_cc[VTIME] = 0;	/* set NO time limit */
+#ifdef LINUX
+    return tcsetattr(0, TCSADRAIN, &fterm);	/* modify termio for raw mode */
+#else
     return ioctl(0, TCSETAW, &fterm);	/* modify termio for raw mode */
+#endif
 #else
     struct sgttyb ts;
     gtty(fileno(stdin), &ts);
--- a/metamail/mmencode.c
+++ b/metamail/mmencode.c
@@ -18,14 +18,27 @@ WITHOUT ANY EXPRESS OR IMPLIED WARRANTIE
 #include <fcntl.h>
 #endif
 
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+
 #define BASE64 1
 #define QP 2 /* quoted-printable */
 
+extern FILE *Fopen(char * Fopen_path, char * Fopen_mode);
+extern void to64(); 
+extern void toqp(); 
+extern void from64();
+extern void fromqp();
+
+int
 main(argc, argv)
 int argc;
 char **argv;
 {
     int encode = 1, which = BASE64, i, portablenewlines = 0;
+    struct stat fpstat;
     FILE *fp = stdin;
     FILE *fpo = stdout;
 
@@ -37,7 +50,7 @@ char **argv;
 			fprintf(stderr, "mimencode: -o requires a file name.\n");
 			exit(-1);
 		    }
-		    fpo = fopen(argv[i], "w");
+		    fpo = Fopen(argv[i], "w");
 		    if (!fpo) {
 			perror(argv[i]);
 			exit(-1);
@@ -63,14 +76,14 @@ char **argv;
         } else {
 #ifdef MSDOS
             if (encode)
-                fp = fopen(argv[i], "rb");
+                fp = Fopen(argv[i], "rb");
             else
             {
-                fp = fopen(argv[i], "rt");
+                fp = Fopen(argv[i], "rt");
                 setmode(fileno(fpo), O_BINARY);
             } /* else */
 #else
-            fp = fopen(argv[i], "r");
+            fp = Fopen(argv[i], "r");
 #endif /* MSDOS */
             if (!fp) {
                 perror(argv[i]);
@@ -81,6 +94,12 @@ char **argv;
 #ifdef MSDOS
     if (fp == stdin) setmode(fileno(fp), O_BINARY);
 #endif /* MSDOS */
+    if(fstat(fileno(fp), &fpstat) == -1) {
+	perror("fstat");
+	exit(3);
+    }
+    if (fpo != stdout)
+	fchmod(fileno(fpo), fpstat.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO));
     if (which == BASE64) {
         if (encode) {
             to64(fp, fpo, portablenewlines);
--- a/metamail/putenv.c
+++ b/metamail/putenv.c
@@ -23,7 +23,6 @@ Cambridge, MA 02139, USA.  */
 #include <stdlib.h>
 #else
 extern int errno;
-#endif
 
 #if defined(STDC_HEADERS) || defined(USG) || defined(SYSV)
 #include <string.h>
@@ -98,3 +97,4 @@ putenv (string)
 
   return 0;
 }
+#endif
--- a/metamail/shared.c
+++ b/metamail/shared.c
@@ -1,16 +1,25 @@
 #include <stdio.h>
 #include <ctype.h>
 #include <config.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
 #ifdef SYSV
 #include <unistd.h>
 #include <sys/utsname.h>
 #endif
 
-extern char *malloc();
+#include <stdlib.h>
+
 char **Exceptions;
 int *NeedsPortableNewlines;
 int ExceptionsAlloced = 0, ExceptionsUsed = 0;
+int lc2strncmp();
+int lc2strcmp();
 
+int
 ExceptionalNewline(contenttype, needsportable)
 char *contenttype;
 int needsportable;
@@ -40,6 +49,7 @@ int needsportable;
     return(0);
 }
 
+int
 DoesNeedPortableNewlines(ctype)
 char *ctype;
 {
@@ -65,6 +75,7 @@ char *ctype;
     return(0);
 }
 
+int
 lc2strncmp(s1, s2, len)
 char *s1, *s2;
 int len;
@@ -78,6 +89,7 @@ int len;
     return((*s1 == *s2) ? 0 : -1);
 }
 
+int
 lc2strcmp(s1, s2)
 char *s1, *s2;
 {
@@ -118,3 +130,53 @@ char *getmyname() {
     return(hostname);
 }
 
+
+/*  This fopen wrapper function is designed to avoid /tmp-file race
+ *  conditions where a temporary filename is created and somebody
+ *  throws a link in your way before the fopen(...,"w").  This
+ *  would only happen if another user on the system were actively
+ *  trying to trick you into destroying files.
+ *  Sorry, but "a" mode is not really handled any safer than fopen,
+ *  since I really have no criterium for deciding what files are
+ *  OK to write to.  */
+FILE *Fopen(Fopen_path,Fopen_mode)
+char *Fopen_path; char *Fopen_mode;
+{
+#ifdef MSDOS
+return(fopen(Fopen_path,Fopen_mode));
+#else
+int Fopen_fd;
+struct stat Fopen_sb;
+int Fopen_appendmode = 0;
+int Fopen_readmode = 0;
+int Fopen_openflags = 0;
+int Fopen_r;
+if ( strchr(Fopen_mode,'r') != (char *)0 ) return(fopen(Fopen_path,Fopen_mode));
+if ( strchr(Fopen_mode,'a') != (char *)0 ) Fopen_appendmode = 1;
+if ( strchr(Fopen_mode,'+') != (char *)0 ) Fopen_readmode = 1;
+if ( ( Fopen_appendmode && (strchr(Fopen_mode,'w') != (char *)0) ) ||
+     ( (! Fopen_appendmode) && (strchr(Fopen_mode,'w') == (char *)0) ) )
+    {
+    errno = EINVAL ;
+    return( (FILE *)0 );
+    }
+if ( Fopen_appendmode )
+    {
+    /*  If "a" and file exists, pass it to the real fopen()  */
+    Fopen_r = stat(Fopen_path,&Fopen_sb) ;
+    if ( (Fopen_r != -1) || (errno != ENOENT) )
+        return( fopen(Fopen_path,Fopen_mode) );
+    }
+if ( Fopen_readmode )
+    Fopen_openflags = O_RDWR|O_CREAT|O_EXCL ;
+else
+    Fopen_openflags = O_WRONLY|O_CREAT|O_EXCL ;
+if ( Fopen_appendmode ) Fopen_openflags |= O_APPEND ;
+remove( Fopen_path );
+/*  0666?  We'd better hope their umask is safe...  */
+Fopen_fd = open(Fopen_path,Fopen_openflags,0666);
+if ( Fopen_fd > -1 ) return( fdopen(Fopen_fd,Fopen_mode) );
+return( (FILE *)0 );
+#endif
+}
+
--- a/metamail/splitmail.c
+++ b/metamail/splitmail.c
@@ -26,9 +26,16 @@ WITHOUT ANY EXPRESS OR IMPLIED WARRANTIE
 #include <config.h>
 #include <ctype.h>
 #include <time.h>
+#include <fcntl.h>
 
 #define MINCHUNKSIZE 20000 /* Better be enough to hold the headers, or we die! */
+#ifndef LINUX
 extern char *malloc(), *index(), *getmyname();
+#else
+#include <stdlib.h>
+#include <string.h>
+extern char *getmyname();
+#endif
 
 #ifdef AMIGA
 #define Prototype   extern
@@ -41,11 +48,11 @@ extern char *malloc(), *index(), *getmyn
 #define VERBOSEDELIVERYCMD VerboseDeliveryCmd
 #else
 extern char *getenv();
-#define NORMALDELIVERYCMD "/usr/lib/sendmail -t -oi"
-#define VERBOSEDELIVERYCMD "/usr/lib/sendmail -t -v -oi"
+#define NORMALDELIVERYCMD "/usr/sbin/sendmail -t -oi"
+#define VERBOSEDELIVERYCMD "/usr/sbin/sendmail -t -v -oi"
 #endif
 
-usageexit() {
+void usageexit() {
     fprintf(stderr, "Usage:  splitmail [-d] [-v] [-s splitsize] [-i id-suffix] [-p prefix] [file-name]\n");
     exit(-1);
 }
@@ -53,6 +60,11 @@ usageexit() {
 char *MonthNames[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
 char *DayNames[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
 
+int ShareThisHeader();
+void HandleOnePart();
+int ULstrcmp();
+int IllegalContentType();
+
 char *
 endofheader(s)
 char *s;
@@ -67,6 +79,7 @@ char *s;
     }
 }
 
+int
 main(argc, argv)
 char **argv;
 {
@@ -238,11 +251,12 @@ char **argv;
     return(0);
 }
 
-HandleOnePart(DoDeliver, deliverycmd, prefix, numparts, whichpart, SharedHeaders, SubjectBuf, id, MessageID, bigbuf, OrigID)
+void HandleOnePart(DoDeliver, deliverycmd, prefix, numparts, whichpart, SharedHeaders, SubjectBuf, id, MessageID, bigbuf, OrigID)
 int DoDeliver, numparts, whichpart;
 char *deliverycmd, *prefix, *SharedHeaders, *SubjectBuf, *id, *MessageID, *bigbuf, *OrigID;
 {
     FILE *fpout;
+    int fd;
     char OutputFile[1000];
     int code;
 #if defined(sequent)
@@ -255,7 +269,11 @@ char *deliverycmd, *prefix, *SharedHeade
         fpout = popen(deliverycmd, "w");
     } else {
         sprintf(OutputFile, "%s%d", prefix, whichpart);
-        fpout = fopen(OutputFile, "w");
+        /* fpout = fopen(OutputFile, "w"); */
+        remove(OutputFile);
+        fpout = NULL;
+        fd = open(OutputFile, O_WRONLY|O_CREAT|O_EXCL, 0600);
+        if ( fd > -1 ) fpout = fdopen(fd, "w");
     }
     if (!fpout) {
 	fprintf(stderr, "splitmail: Can't open %s for writing\n", DoDeliver ? deliverycmd : OutputFile);
@@ -339,7 +357,7 @@ static char *SharedHeads[] = {
     NULL
 };
 
-ShareThisHeader(s, SubjectBuf, SubjectBufLen, OrigID)
+int ShareThisHeader(s, SubjectBuf, SubjectBufLen, OrigID)
 char *s;
 char *SubjectBuf;
 size_t SubjectBufLen;
@@ -381,7 +399,7 @@ char **OrigID;
 
 static char *tspecials = "()<>@,;:\\\"/[]?.=";
 
-IllegalContentType(ctype)
+int IllegalContentType(ctype)
 char *ctype;
 {
     char *ct, *semicolon, *st, *s, *param, *eq, *matcheq;
--- a/metamail/uue.c
+++ b/metamail/uue.c
@@ -1,10 +1,13 @@
 #include <stdio.h>
+#include <string.h>
+
+int PendingBoundary();
 
 /*
  * hack to metamail to decode uuencoded bodyparts
  * Written by Keith Moore, February 1992
  */
-
+void
 uueget (ptr, outfp, n)
 char *ptr;
 FILE *outfp;
@@ -29,7 +32,7 @@ FILE *outfp;
 	putc (c3, outfp);
 }
 
-
+int
 getline (buf, size, fp)
 char *buf;
 int size;
@@ -61,7 +64,7 @@ FILE *fp;
 (0); /* shut lint up */
 }
 
-
+void
 fromuue (infp, outfp, boundaries, ctptr)
 FILE *infp, *outfp;
 char **boundaries;
--- a/richmail/iso2022.c
+++ b/richmail/iso2022.c
@@ -41,9 +41,13 @@
 
 #include <stdio.h>
 #include <ctype.h>
+#include <string.h>
 #include "richlex.h"
 #include "richset.h"
 
+extern void controloutput();
+extern int controlputc();
+
 /*
  * Global data for this module.
  */
@@ -73,7 +77,7 @@ static	int	OutAsciiMode;
 /*
  * Initialise the ISO-2022 character set processor.
  */
-iso2022_init (name)
+void iso2022_init (name)
 char	*name;
 {
     SwToAscii = 'B';
@@ -257,7 +261,7 @@ RCHAR	ch;
 /*
  * Render the given ISO-2022 character.
  */
-iso2022_render (ch,param)
+int iso2022_render (ch,param)
 RCHAR	ch;
 void	*param;
 {
@@ -274,7 +278,7 @@ void	*param;
 	    }
 	}
         (*RichtextPutc) ((int)((ch & 0xFF00) >> 8),param);
-        (*RichtextPutc) ((int)(ch & 0xFF),param);
+        return (*RichtextPutc) ((int)(ch & 0xFF),param);
     } else {
 	if (OutCharLen > 1 && ch >= 0x20) {
 	    /* Add extra escape sequences before stray ASCII characters */
@@ -287,14 +291,14 @@ void	*param;
 		(*RichtextPutc) (SI,param);
 	    }
 	}
-	(*RichtextPutc) ((int)(ch & 0xFF),param);
+	return (*RichtextPutc) ((int)(ch & 0xFF),param);
     }
 }
 
 /*
  * Enter or leave the ISO-2022 encoding.
  */
-iso2022_encoding (newenc)
+int iso2022_encoding (newenc)
 int	newenc;
 {
     switch (newenc) {
@@ -306,6 +310,7 @@ int	newenc;
 	case RICH_ENC_KSC_5601: controloutput("\016",0);   break;
 	default:		controloutput("\033(B",0); break;
     }
+    return 0;
 }
 
 /*
@@ -372,4 +377,5 @@ FILE	*file;
     }
     OutPrevPrevChar = OutPrevChar;
     OutPrevChar = ch;
+    return 0;
 }
--- a/richmail/richlex.c
+++ b/richmail/richlex.c
@@ -42,6 +42,7 @@
 -------------------------------------------------------------------------*/
 
 #include <stdio.h>
+#include <string.h>
 #include <ctype.h>
 #include "richlex.h"
 #include "richset.h"
@@ -89,7 +90,7 @@ static	int	PushbackExtract=0;
  * on the terminal.
  */
 #define	ISO2022_GENERIC	"x-iso-2022-gen-%2x"
-#define	ISO2022_CHARSET "x-iso-charset-"
+#define	ISO2022_CHARSET "x-iso-charset-%8x"
 
 /*
  * Define the character set shift characters for ISO-2022-KR.
@@ -105,7 +106,7 @@ static	int	PushbackExtract=0;
 /*
  * Reset the richtext parsing mechanism.
  */
-richtextreset()
+void richtextreset()
 {
     StackSize = 0;
     FlushStack = 0;
@@ -191,7 +192,7 @@ static int richtextmatchup()
  * Determine if the current token is one of the singleton
  * richtext commands: <nl>, <lt>, <np>.
  */
-static richtextsingle(TextEnriched)
+static int richtextsingle(TextEnriched)
 int TextEnriched;
 {
     return (charsetsingle (NextToken) ||
@@ -416,7 +417,7 @@ int nofill; /* Inside a nofill env we pa
 /*
  * Output a string via "RichtextPutc".
  */
-static richtextoutstr(str,outparam)
+static void richtextoutstr(str,outparam)
 char *str;
 void *outparam;
 {
@@ -430,7 +431,7 @@ void *outparam;
  * Read the input stream, correct the richtext, and write the
  * results to the output stream.
  */
-richtextcorrect(inparam,outparam,TextEnriched)
+void richtextcorrect(inparam,outparam,TextEnriched)
 void *inparam,*outparam;
 int TextEnriched;
 {
@@ -459,7 +460,7 @@ int TextEnriched;
  * Change the encoding used for characters not present in
  * richtext command sequences.
  */
-richtextencoding(encoding)
+void richtextencoding(encoding)
 int	encoding;
 {
     RichtextCharEncoding = encoding;
--- a/richmail/richlex.h
+++ b/richmail/richlex.h
@@ -101,7 +101,7 @@ extern	int (*RichtextPutc) ();
 /*
  * Reset the richtext parsing mechanism.
  */
-extern	richtextreset();
+extern	void richtextreset();
 
 /*
  * Get the next token from the input stream.  RICHTEXT_COMMAND
@@ -123,7 +123,7 @@ extern	RCHAR	richtextlex( /* void *file,
  * "RichtextPutc" function as the second argument, and "inparam"
  * is passed to "richtextlex" during parsing.
  */
-extern	richtextcorrect( /* void *inparam,void *outparam,int TextEnriched */ );
+extern	void richtextcorrect( /* void *inparam,void *outparam,int TextEnriched */ );
 
 #define	RICH_ENC_US_ASCII	0	/* US-ASCII encoding: one-byte */
 #define	RICH_ENC_JP_ASCII	1	/* JP-ASCII encoding: one-byte */
@@ -143,7 +143,7 @@ extern	int	RichtextCharEncoding;
  * Change the encoding used for characters not present in
  * richtext command sequences.
  */
-extern	richtextencoding( /* int encoding */ );
+extern	void richtextencoding( /* int encoding */ );
 
 /*
  * Define a number of macros for decoding multi-byte character
--- a/richmail/richset.c
+++ b/richmail/richset.c
@@ -34,6 +34,7 @@
 -------------------------------------------------------------------------*/
 
 #include <stdio.h>
+#include <stdlib.h>
 #include "richlex.h"
 #include "richset.h"
 
@@ -58,7 +59,7 @@ static	int	CharEncStack[MAX_CHAR_SETS];
  * a particular base processor.  The initialisation function of all
  * character set processors is called.
  */
-charsetinit (charset,name)
+void charsetinit (charset,name)
 struct	charsetproc *charset;
 char	*name;
 {
@@ -76,7 +77,7 @@ char	*name;
  * Initialise the stack, starting with a character set processor with
  * a particular name.
  */
-charsetnameinit	(name)
+void charsetnameinit	(name)
 char	*name;
 {
     int temp = 0;
@@ -110,7 +111,7 @@ char	*name;
 /*
  * Push a new character set processor onto the stack.
  */
-charsetpush (charset)
+void charsetpush (charset)
 struct	charsetproc *charset;
 {
     if (NumCharSets >= MAX_CHAR_SETS) {
@@ -128,7 +129,7 @@ struct	charsetproc *charset;
  * if it matches the given processor.  Note: the base
  * processor is never popped off.
  */
-charsetpop (charset)
+void charsetpop (charset)
 struct	charsetproc *charset;
 {
     if (NumCharSets > 1 && CharSets[NumCharSets - 1] == charset) {
@@ -156,7 +157,7 @@ struct	charsetproc *charset;
  * Set the details for a character set member in the top-most
  * character set.
  */
-charmember (member,ch)
+void charmember (member,ch)
 struct	charsetmember *member;
 RCHAR	ch;
 {
@@ -167,7 +168,7 @@ RCHAR	ch;
 /*
  * Set the details for a member of a specific character set.
  */
-charmemberspec (member,ch,charset)
+void charmemberspec (member,ch,charset)
 struct	charsetmember *member;
 RCHAR	ch;
 struct	charsetproc *charset;
@@ -179,7 +180,7 @@ struct	charsetproc *charset;
 /*
  * Set the details for a output control code character.
  */
-charmemberctrl (member,ch)
+void charmemberctrl (member,ch)
 struct	charsetmember *member;
 RCHAR	ch;
 {
--- a/richmail/richset.h
+++ b/richmail/richset.h
@@ -58,7 +58,7 @@ extern "C" {
 struct	charsetproc
 		{
 		    char *names;
-		    int (*init) ( /* char *name */ );
+		    void (*init) ( /* char *name */ );
 		    int (*command) ( /* char *token, int negated */ );
 		    int (*single) ( /* char *token */ );
 		    int (*width) ( /* RCHAR c */ );
@@ -89,25 +89,25 @@ struct	charsetmember
  * a particular base processor.  The initialisation function of all
  * character set processors is called.
  */
-extern	charsetinit	( /* struct charsetproc *charset, char *name */ );
+extern	void charsetinit	( /* struct charsetproc *charset, char *name */ );
 
 /*
  * Initialise the stack, starting with a character set processor with
  * a particular name.
  */
-extern	charsetnameinit	( /* char *name */ );
+extern	void charsetnameinit	( /* char *name */ );
 
 /*
  * Push a new character set processor onto the stack.
  */
-extern	charsetpush	( /* struct charsetproc *charset */ );
+extern	void charsetpush	( /* struct charsetproc *charset */ );
 
 /*
  * Pop the top-most character set processor off the stack
  * if it matches the given processor.  Note: the base
  * processor is never popped off.
  */
-extern	charsetpop	( /* struct charsetproc *charset */ );
+extern	void charsetpop	( /* struct charsetproc *charset */ );
 
 /*
  * See if the character set processor on the top of the stack
@@ -119,18 +119,18 @@ extern	int	charsettop ( /* struct charse
  * Set the details for a character set member in the top-most
  * character set.
  */
-extern	charmember	( /* struct charsetmember *member, RCHAR ch */ );
+extern	void charmember	( /* struct charsetmember *member, RCHAR ch */ );
 
 /*
  * Set the details for a member of a specific character set.
  */
-extern	charmemberspec	( /* struct charsetmember *member, RCHAR ch,
+extern	void charmemberspec	( /* struct charsetmember *member, RCHAR ch,
 			     struct charset *charset */ );
 
 /*
  * Set the details for a output control code character.
  */
-extern	charmemberctrl	( /* struct charsetmember *member, RCHAR ch */ );
+extern	void charmemberctrl	( /* struct charsetmember *member, RCHAR ch */ );
 
 /*
  * Determine if the given character is a control code character.
--- a/richmail/richtext.c
+++ b/richmail/richtext.c
@@ -16,6 +16,8 @@ WITHOUT ANY EXPRESS OR IMPLIED WARRANTIE
 #include <stdio.h>
 #include <ctype.h>
 #include <signal.h>
+#include <stdlib.h>
+#include <string.h>
 #include "richlex.h"
 #include "richset.h"
 #include <config.h>
@@ -82,7 +84,18 @@ static int FakeTerminal;
 extern tputs();
 #endif
 
-static outputc(), realoutputc(), MakeWorkingMargins(), Pause(), fputsmovingright(), ResetTerminalCodes(), FinalizeTerminal(), outputstr(), FPUTS(), lc2strcmp();
+void controloutput();
+
+static void outputc();
+static void realoutputc();
+static void MakeWorkingMargins();
+static void Pause();
+static void fputsmovingright();
+static void ResetTerminalCodes();
+static void FinalizeTerminal();
+static void outputstr();
+static void FPUTS();
+static int lc2strcmp();
 
 #define	OUTC(c)		(outputc((RCHAR)(c)))
 
@@ -128,7 +141,7 @@ int signum;
 #endif
 }
 
-static InitSignals() {
+static void InitSignals() {
     signal(SIGINT, cleanup);
 #if !defined(AMIGA)
 #if !defined(MSDOS)
@@ -149,7 +162,8 @@ static InitSignals() {
 #endif
 }
 
-static nomemabort() {
+#if 0
+static void nomemabort() {
     fprintf(stderr, "richtext: Out of memory\n");
     FinalizeTerminal();
 #ifdef AMIGA
@@ -158,15 +172,17 @@ static nomemabort() {
     exit(-1);
 #endif
 }
+#endif
 
 #ifndef	RICHTEXT_LIBRARY
 
+int richtext_main();
 /*
  * Only include the main function if this module is not being used as a
  * library call.
  */
 
-main(argc, argv)
+int main(argc, argv)
 int argc;
 char **argv;
 {
@@ -175,7 +191,7 @@ char **argv;
 
 #endif
 
-richtext_main(argc, argv)
+int richtext_main(argc, argv)
 int argc;
 char **argv;
 {
@@ -341,15 +357,15 @@ char **argv;
         char *cp;
                    
         cp = cb; 
-        if (dum = tgetstr("ks", &cp)) strcpy (KS, dum); else KS[0] = '\0';
-        if (dum = tgetstr("ke", &cp)) strcpy (KE, dum); else KE[0] = '\0';
-        if (dum = tgetstr("so", &cp)) strcpy (standoutbuf, dum); standoutbuf[0] = '\0';
-        if (dum = tgetstr("se", &cp)) strcpy (standendbuf, dum); standendbuf[0] = '\0';
-        if (dum = tgetstr("md", &cp)) strcpy (BoldOn, dum); else strcpy(BoldOn, standoutbuf);
-        if (dum = tgetstr("me", &cp)) strcpy (BoldOff, dum); else strcpy(BoldOff, standendbuf);
-        if (dum = tgetstr("us", &cp)) strcpy (StartUnderline, dum); else StartUnderline[0] = '\0';
-        if (dum = tgetstr("ue", &cp)) strcpy (StopUnderline, dum); else StopUnderline[0] = '\0';
-        if (dum = tgetstr("nd", &cp)) strcpy (MoveRight, dum); else {
+        if ((dum = tgetstr("ks", &cp))) strcpy (KS, dum); else KS[0] = '\0';
+        if ((dum = tgetstr("ke", &cp))) strcpy (KE, dum); else KE[0] = '\0';
+        if ((dum = tgetstr("so", &cp))) strcpy (standoutbuf, dum); standoutbuf[0] = '\0';
+        if ((dum = tgetstr("se", &cp))) strcpy (standendbuf, dum); standendbuf[0] = '\0';
+        if ((dum = tgetstr("md", &cp))) strcpy (BoldOn, dum); else strcpy(BoldOn, standoutbuf);
+        if ((dum = tgetstr("me", &cp))) strcpy (BoldOff, dum); else strcpy(BoldOff, standendbuf);
+        if ((dum = tgetstr("us", &cp))) strcpy (StartUnderline, dum); else StartUnderline[0] = '\0';
+        if ((dum = tgetstr("ue", &cp))) strcpy (StopUnderline, dum); else StopUnderline[0] = '\0';
+        if ((dum = tgetstr("nd", &cp))) strcpy (MoveRight, dum); else {
             MoveRight[0] = ' ';
             MoveRight[1] = '\0';
         }
@@ -654,31 +670,32 @@ char **argv;
     return(0);
 }
 
-static struct charsetmember OutputBuf[1000] = {0,0};
+static struct charsetmember OutputBuf[1000];
 static int PendingOutput = 0, PendingControls = 0;
 
-controlputc(c)
+int controlputc(c)
 int c;
 {
     charmemberctrl (&OutputBuf[PendingOutput],(RCHAR)c);
     ++PendingOutput;
     ++PendingControls;
+    return 0;
 }
 
-static immediate_controlputc(c)
+static int immediate_controlputc(c)
 int c;
 {
-    (*RichtextPutc) (c, stdout);
+    return (*RichtextPutc) (c, stdout);
 }
 
-controloutput(s, immediate)
+void controloutput(s, immediate)
 char *s;
 int immediate;
 {
     tputs(s, 1, immediate ? immediate_controlputc : controlputc);
 }
 
-static folding_point (buf, pos)
+static int folding_point (buf, pos)
 struct	charsetmember *buf;
 int	pos;
 {
@@ -690,7 +707,7 @@ int	pos;
     return (0);
 }
 
-static calc_column (buf, pos)
+static int calc_column (buf, pos)
 struct	charsetmember *buf;
 int	pos;
 {
@@ -705,7 +722,7 @@ int	pos;
     return (col);
 }
 
-static FlushOut() {
+static void FlushOut() {
     int i, j, x;
     static struct charsetmember NewOutputBuf[1000];
     struct charsetmember *s;
@@ -795,7 +812,7 @@ static FlushOut() {
                         StopUnderline, 0, BoldOn, BoldOff, 0);
 }
 
-static outputc(c)
+static void outputc(c)
 RCHAR c;
 {
     struct charsetmember member;
@@ -803,7 +820,7 @@ RCHAR c;
     realoutputc(member, 0);
 }
 
-static realoutputc(c, alreadyformatted)
+static void realoutputc(c, alreadyformatted)
 struct charsetmember c;
 int alreadyformatted;
 {
@@ -875,7 +892,7 @@ int alreadyformatted;
     }
 }
 
-static MakeWorkingMargins() {
+static void MakeWorkingMargins() {
     int oldworkingleft=workingleft, i;
 
     workingleft = leftmargin;
@@ -889,7 +906,7 @@ static MakeWorkingMargins() {
     }
 }
 
-static Pause()
+static void Pause()
 {
     int	c;
 
@@ -903,7 +920,7 @@ static Pause()
 /* Leading spaces should be output as MoveRight, to avoid 
    having margins that are underlined or reverse video */
 
-static fputsmovingright(s, fp)
+static void fputsmovingright(s, fp)
 struct charsetmember *s;
 FILE *fp;
 {
@@ -923,7 +940,7 @@ FILE *fp;
     }
 }
 
-static ResetTerminalCodes(FakeTerminal, standout, underline, bold, standoutbuf, standendbuf,
+static void ResetTerminalCodes(FakeTerminal, standout, underline, bold, standoutbuf, standendbuf,
                     modifiedstandout, StartUnderline, StopUnderline, modifiedunderline,
                     BoldOn, BoldOff, modifiedbold)
 char *standoutbuf, *standendbuf, *StartUnderline, *StopUnderline,
@@ -951,14 +968,14 @@ char *standoutbuf, *standendbuf, *StartU
     }
 }
 
-static FinalizeTerminal() {
+static void FinalizeTerminal() {
     tputs(standendbuf, 1, immediate_controlputc);
     tputs(BoldOff, 1, immediate_controlputc);
     tputs(StopUnderline, 1, immediate_controlputc);
     FPUTS(KE, stdout);
 }
 
-static outputstr(s)
+static void outputstr(s)
 char *s;
 {
     while (*s) OUTC(*s++);
@@ -980,14 +997,14 @@ int (*func)();
 }
 #endif
 
-static FPUTS(s,fp)
+static void FPUTS(s,fp)
 unsigned char *s;
 FILE *fp;
 {
     while(*s) (*RichtextPutc)((int)(*s++),fp);
 }
 
-static lc2strcmp(s1, s2)
+static int lc2strcmp(s1, s2)
 char *s1, *s2;
 {
     if (!s1 || !s2) return (-1);
@@ -998,7 +1015,8 @@ char *s1, *s2;
     return((*s1 == *s2) ? 0 : -1);
 }
 
-static lc2strncmp(s1, s2, len)
+#if 0
+static int lc2strncmp(s1, s2, len)
 char *s1, *s2;
 int len;
 {
@@ -1010,3 +1028,4 @@ int len;
     if (len <= 0) return(0);
     return((*s1 == *s2) ? 0 : -1);
 }
+#endif
--- a/richmail/richtoatk.c
+++ b/richmail/richtoatk.c
@@ -13,9 +13,12 @@ OF THIS MATERIAL FOR ANY PURPOSE.  IT IS
 WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES.
 */
 #include <stdio.h>
+#include <string.h>
 #include <ctype.h>
 #include "richlex.h"
 
+int ignoretoken();
+
 char *translate(t)
 char *t;
 {
@@ -25,7 +28,7 @@ char *t;
     return(t);
 }
 
-main() {
+int main() {
     RCHAR c;
     int i, JustDidNewline = 0;
     char tok[MAX_TOKEN_SIZE + 1],*token;
@@ -73,10 +76,10 @@ main() {
             JustDidNewline = 0;
         }
     }
-    fputs("\n \n\\enddata{text, 42}\n", stdout);
+    return fputs("\n \n\\enddata{text, 42}\n", stdout);
 }
 
-ignoretoken(t)
+int ignoretoken(t)
 char *t;
 {
     if (*t == '/') ++t;
@@ -86,12 +89,12 @@ char *t;
     return(0);
 }
 
-controlputc(c)
+void controlputc(c)
 int c;
 {
 }
 
-controloutput(s, immediate)
+void controloutput(s, immediate)
 char *s;
 int immediate;
 {
--- a/richmail/usascii.c
+++ b/richmail/usascii.c
@@ -34,6 +34,7 @@
 -------------------------------------------------------------------------*/
 
 #include <stdio.h>
+#include <string.h>
 #include <ctype.h>
 #include "richlex.h"
 #include "richset.h"
@@ -41,7 +42,7 @@
 /*
  * Initialise the US-ASCII character set processor.
  */
-usascii_init (name)
+void usascii_init (name)
 char	*name;
 {
     if (name)
@@ -98,20 +99,21 @@ RCHAR	ch;
 /*
  * Render the given US-ASCII character.
  */
-usascii_render (ch,param)
+int usascii_render (ch,param)
 RCHAR	ch;
 void	*param;
 {
-    (*RichtextPutc) ((int)ch,param);
+    return (*RichtextPutc) ((int)ch,param);
 }
 
 /*
  * Enter or leave the US-ASCII encoding.
  */
-usascii_encoding (newenc)
+int usascii_encoding (newenc)
 int	newenc;
 {
     /* Nothing to be done in this version */
+    return 0;
 }
 
 /*
@@ -119,10 +121,10 @@ int	newenc;
  */
 struct 	charsetproc	usascii_charset =
 	  {"us-ascii",
-	   usascii_init,
-	   usascii_command,
-	   usascii_single,
-	   usascii_width,
-	   usascii_fold,
-	   usascii_render,
-	   usascii_encoding};
+	   &usascii_init,
+	   &usascii_command,
+	   &usascii_single,
+	   &usascii_width,
+	   &usascii_fold,
+	   &usascii_render,
+	   &usascii_encoding};
openSUSE Build Service is sponsored by