summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJon Portnoy <avenj@gentoo.org>2003-03-28 21:46:40 +0000
committerJon Portnoy <avenj@gentoo.org>2003-03-28 21:46:40 +0000
commit3937effba091c6ee3d6ac8cff57f3e0bdc1b3cc1 (patch)
tree65fd7166e8a020834aceea5b7c0a83ecc195cf2e /net-mail/mailx
parentVersion bumped. Should close #18396. (diff)
downloadhistorical-3937effba091c6ee3d6ac8cff57f3e0bdc1b3cc1.tar.gz
historical-3937effba091c6ee3d6ac8cff57f3e0bdc1b3cc1.tar.bz2
historical-3937effba091c6ee3d6ac8cff57f3e0bdc1b3cc1.zip
Bug fix revision.
Diffstat (limited to 'net-mail/mailx')
-rw-r--r--net-mail/mailx/ChangeLog12
-rw-r--r--net-mail/mailx/files/digest-mailx-8.1.2.20021129-r11
-rw-r--r--net-mail/mailx/files/multifix.diff13303
-rw-r--r--net-mail/mailx/mailx-8.1.2.20021129-r1.ebuild60
4 files changed, 13374 insertions, 2 deletions
diff --git a/net-mail/mailx/ChangeLog b/net-mail/mailx/ChangeLog
index d0dca9d334bc..8e12f92824fd 100644
--- a/net-mail/mailx/ChangeLog
+++ b/net-mail/mailx/ChangeLog
@@ -1,9 +1,17 @@
# ChangeLog for net-mail/mailx
# Copyright 2002-2003 Gentoo Technologies, Inc.; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/net-mail/mailx/ChangeLog,v 1.8 2003/02/12 08:13:05 vapier Exp $
+# $Header: /var/cvsroot/gentoo-x86/net-mail/mailx/ChangeLog,v 1.9 2003/03/28 21:46:40 avenj Exp $
+
+*mailx-8.1.2.20021129-r1 (27 Mar 2003)
+
+ 27 Mar 2003; Jon Portnoy <avenj@gentoo.org> mailx-8.1.2.20021129-r1.ebuild
+ digest-mailx-8.1.2.20021129-r1 multifix.diff :
+ Added multifix.diff to fix bug #18259, reported by C. Brewer.
+
06 Dec 2002; Rodney Rees <manson@gentoo.org> : changed sparc ~sparc keywords
-
+
+
*mailx-8.1.2.20021129 (01 Dec 2002)
07 Dec 2002; Nick Hadaway <raker@gentoo.org>
diff --git a/net-mail/mailx/files/digest-mailx-8.1.2.20021129-r1 b/net-mail/mailx/files/digest-mailx-8.1.2.20021129-r1
new file mode 100644
index 000000000000..ab658e38e44a
--- /dev/null
+++ b/net-mail/mailx/files/digest-mailx-8.1.2.20021129-r1
@@ -0,0 +1 @@
+MD5 c779002cb043b57fd5198ec2032cacb0 mailx_8.1.1.orig.tar.gz 89069
diff --git a/net-mail/mailx/files/multifix.diff b/net-mail/mailx/files/multifix.diff
new file mode 100644
index 000000000000..6ccc25406f1f
--- /dev/null
+++ b/net-mail/mailx/files/multifix.diff
@@ -0,0 +1,13303 @@
+diff -urN mailx-8.1.1.orig/Makefile mailx-8.1.1/Makefile
+--- mailx-8.1.1.orig/Makefile 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/Makefile 2003-03-26 13:03:39.000000000 -0800
+@@ -1,38 +1,45 @@
+-# $OpenBSD: Makefile,v 1.8 1997/09/21 11:49:50 deraadt Exp $
++# $OpenBSD: Makefile,v 1.8 1996/06/08 19:48:09 christos Exp $
++# $NetBSD: Makefile,v 1.8 1996/06/08 19:48:09 christos Exp $
+
+ PROG= mail
++CC=gcc
++
++# use second line starting from hamm release
++#CPPFLAGS=-I/usr/include/bsd -D_BSD_SOURCE -DIOSAFE
++CPPFLAGS=-D_BSD_SOURCE
++
++CFLAGS=-g
+ SRCS= version.c aux.c cmd1.c cmd2.c cmd3.c cmdtab.c collect.c \
+ edit.c fio.c getname.c head.c v7.local.c lex.c list.c main.c names.c \
+ popen.c quit.c send.c strings.c temp.c tty.c vars.c
+-SFILES= mail.help mail.tildehelp
+-EFILES= mail.rc
+-LINKS= ${BINDIR}/mail ${BINDIR}/Mail ${BINDIR}/mail ${BINDIR}/mailx
+-MLINKS= mail.1 Mail.1 mail.1 mailx.1
+-
+-CC=gcc
+
+ OBJS=$(SRCS:%.c=%.o)
+ LIBS=-llockfile
+
+-default: all
++SFILES= mail.help mail.tildehelp
++EFILES= mail.rc
++LINKS= ${BINDIR}/mail ${BINDIR}/Mail ${BINDIR}/mail ${BINDIR}/mailx
++MFILES= mail.1
+
+-all: $(PROG)
++default: all
+
+-$(PROG): $(OBJS)
++ all: $(PROG)
++
++ $(PROG): $(OBJS)
+ $(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(OBJS) $(LIBS)
+-
+-.c.o:
++
++ .c.o:
+ $(CC) $(CPPFLAGS) $(CFLAGS) -c $<
+-
+-.y.c:
++
++ .y.c:
+ bison $<
+ mv -f $*.tab.c $@
+-
+-clean:
++
++ clean:
+ rm -f $(PROG) *.o *~
+-
+-install:
+- install -c -m 755 -o root -g mail -s $(PROG) $(DESTDIR)/bin/
+- install -c -m 644 $(MFILES) $(DESTDIR)/usr/share/man/man1/
++
++ install:
++ install -c -m 755 -o root -g mail -s $(PROG) $(DESTDIR)/usr/bin/
++ install -c -m 644 $(MFILES) $(DESTDIR)/usr/man/man1/
+ cd misc && install -c -m 644 $(EFILES) $(DESTDIR)/etc/
+ cd misc && install -c -m 644 $(SFILES) $(DESTDIR)/usr/lib/
+diff -urN mailx-8.1.1.orig/USD.doc/Makefile mailx-8.1.1/USD.doc/Makefile
+--- mailx-8.1.1.orig/USD.doc/Makefile 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/USD.doc/Makefile 2003-03-26 13:03:39.000000000 -0800
+@@ -1,12 +1,13 @@
+-# $OpenBSD: Makefile,v 1.3 1997/07/13 23:35:48 millert Exp $
+-# @(#)Makefile 8.1 (Berkeley) 6/8/93
++# $OpenBSD: Makefile,v 1.1 1994/06/29 05:09:54 deraadt Exp $
+
+ DIR= usd/07.mail
+ SRCS= mail0.nr mail1.nr mail2.nr mail3.nr mail4.nr mail5.nr mail6.nr \
+ mail7.nr mail8.nr mail9.nr maila.nr
+ MACROS= -me
++TBL=tbl
++manual.ps: ${SRCS}
++ ${TBL} ${SRCS} | groff ${MACROS} -Tps > $@
+
+-paper.ps: ${SRCS}
+- ${TBL} ${SRCS} | ${ROFF} > ${.TARGET}
++clean :
++ -rm manual.ps
+
+-.include <bsd.doc.mk>
+diff -urN mailx-8.1.1.orig/USD.doc/mail0.nr mailx-8.1.1/USD.doc/mail0.nr
+--- mailx-8.1.1.orig/USD.doc/mail0.nr 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/USD.doc/mail0.nr 1996-06-14 01:27:10.000000000 -0700
+@@ -1,4 +1,4 @@
+-.\" $OpenBSD: mail0.nr,v 1.2 1996/06/11 12:54:18 deraadt Exp $
++.\" $OpenBSD$
+ .\"
+ .\" Copyright (c) 1980, 1993
+ .\" The Regents of the University of California. All rights reserved.
+diff -urN mailx-8.1.1.orig/USD.doc/mail1.nr mailx-8.1.1/USD.doc/mail1.nr
+--- mailx-8.1.1.orig/USD.doc/mail1.nr 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/USD.doc/mail1.nr 1996-06-14 01:27:10.000000000 -0700
+@@ -1,4 +1,4 @@
+-.\" $OpenBSD: mail1.nr,v 1.2 1996/06/11 12:54:18 deraadt Exp $
++.\" $OpenBSD$
+ .\"
+ .\" Copyright (c) 1980, 1993
+ .\" The Regents of the University of California. All rights reserved.
+diff -urN mailx-8.1.1.orig/USD.doc/mail2.nr mailx-8.1.1/USD.doc/mail2.nr
+--- mailx-8.1.1.orig/USD.doc/mail2.nr 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/USD.doc/mail2.nr 1996-06-14 01:27:12.000000000 -0700
+@@ -1,4 +1,4 @@
+-.\" $OpenBSD: mail2.nr,v 1.3 1997/07/13 23:35:49 millert Exp $
++.\" $OpenBSD$
+ .\"
+ .\" Copyright (c) 1980, 1993
+ .\" The Regents of the University of California. All rights reserved.
+@@ -31,8 +31,9 @@
+ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ .\" SUCH DAMAGE.
+ .\"
+-.\" @(#)mail2.nr 8.2 (Berkeley) 5/16/94
++.\" @(#)mail2.nr 8.1 (Berkeley) 6/8/93
+ .\"
++.bp
+ .sh 1 "Common usage"
+ .pp
+ The
+diff -urN mailx-8.1.1.orig/USD.doc/mail3.nr mailx-8.1.1/USD.doc/mail3.nr
+--- mailx-8.1.1.orig/USD.doc/mail3.nr 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/USD.doc/mail3.nr 1996-06-14 01:27:12.000000000 -0700
+@@ -1,4 +1,4 @@
+-.\" $OpenBSD: mail3.nr,v 1.2 1996/06/11 12:54:20 deraadt Exp $
++.\" $OpenBSD$
+ .\"
+ .\" Copyright (c) 1980, 1993
+ .\" The Regents of the University of California. All rights reserved.
+diff -urN mailx-8.1.1.orig/USD.doc/mail4.nr mailx-8.1.1/USD.doc/mail4.nr
+--- mailx-8.1.1.orig/USD.doc/mail4.nr 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/USD.doc/mail4.nr 1996-06-14 01:27:13.000000000 -0700
+@@ -1,4 +1,4 @@
+-.\" $OpenBSD: mail4.nr,v 1.3 1997/07/13 23:35:49 millert Exp $
++.\" $OpenBSD$
+ .\"
+ .\" Copyright (c) 1980, 1993
+ .\" The Regents of the University of California. All rights reserved.
+@@ -31,8 +31,9 @@
+ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ .\" SUCH DAMAGE.
+ .\"
+-.\" @(#)mail4.nr 8.2 (Berkeley) 5/16/94
++.\" @(#)mail4.nr 8.1 (Berkeley) 6/8/93
+ .\"
++.bp
+ .sh 1 "More about sending mail"
+ .sh 2 "Tilde escapes"
+ .pp
+diff -urN mailx-8.1.1.orig/USD.doc/mail5.nr mailx-8.1.1/USD.doc/mail5.nr
+--- mailx-8.1.1.orig/USD.doc/mail5.nr 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/USD.doc/mail5.nr 1996-06-14 01:27:16.000000000 -0700
+@@ -1,4 +1,4 @@
+-.\" $OpenBSD: mail5.nr,v 1.3 1997/07/13 23:35:50 millert Exp $
++.\" $OpenBSD$
+ .\"
+ .\" Copyright (c) 1980, 1993
+ .\" The Regents of the University of California. All rights reserved.
+@@ -31,8 +31,9 @@
+ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ .\" SUCH DAMAGE.
+ .\"
+-.\" @(#)mail5.nr 8.2 (Berkeley) 5/16/94
++.\" @(#)mail5.nr 8.1 (Berkeley) 6/8/93
+ .\"
++.bp
+ .sh 1 "Additional features"
+ .pp
+ This section describes some additional commands useful for
+diff -urN mailx-8.1.1.orig/USD.doc/mail6.nr mailx-8.1.1/USD.doc/mail6.nr
+--- mailx-8.1.1.orig/USD.doc/mail6.nr 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/USD.doc/mail6.nr 1996-06-14 01:27:17.000000000 -0700
+@@ -1,4 +1,4 @@
+-.\" $OpenBSD: mail6.nr,v 1.3 1997/07/13 23:35:50 millert Exp $
++.\" $OpenBSD$
+ .\"
+ .\" Copyright (c) 1980, 1993
+ .\" The Regents of the University of California. All rights reserved.
+@@ -31,8 +31,9 @@
+ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ .\" SUCH DAMAGE.
+ .\"
+-.\" @(#)mail6.nr 8.2 (Berkeley) 5/16/94
++.\" @(#)mail6.nr 8.1 (Berkeley) 6/8/93
+ .\"
++.bp
+ .sh 1 "Command line options"
+ .pp
+ This section describes command line options for
+diff -urN mailx-8.1.1.orig/USD.doc/mail7.nr mailx-8.1.1/USD.doc/mail7.nr
+--- mailx-8.1.1.orig/USD.doc/mail7.nr 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/USD.doc/mail7.nr 1996-06-14 01:27:17.000000000 -0700
+@@ -1,4 +1,4 @@
+-.\" $OpenBSD: mail7.nr,v 1.2 1996/06/11 12:54:23 deraadt Exp $
++.\" $OpenBSD$
+ .\"
+ .\" Copyright (c) 1980, 1993
+ .\" The Regents of the University of California. All rights reserved.
+diff -urN mailx-8.1.1.orig/USD.doc/mail8.nr mailx-8.1.1/USD.doc/mail8.nr
+--- mailx-8.1.1.orig/USD.doc/mail8.nr 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/USD.doc/mail8.nr 1996-06-14 01:27:17.000000000 -0700
+@@ -1,4 +1,4 @@
+-.\" $OpenBSD: mail8.nr,v 1.3 1997/07/13 23:35:51 millert Exp $
++.\" $OpenBSD$
+ .\"
+ .\" Copyright (c) 1980, 1993
+ .\" The Regents of the University of California. All rights reserved.
+@@ -31,8 +31,9 @@
+ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ .\" SUCH DAMAGE.
+ .\"
+-.\" @(#)mail8.nr 8.2 (Berkeley) 5/16/94
++.\" @(#)mail8.nr 8.1 (Berkeley) 6/8/93
+ .\"
++.bp
+ .sh 1 "Glossary"
+ .pp
+ This section contains the definitions of a few phrases
+diff -urN mailx-8.1.1.orig/USD.doc/mail9.nr mailx-8.1.1/USD.doc/mail9.nr
+--- mailx-8.1.1.orig/USD.doc/mail9.nr 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/USD.doc/mail9.nr 1996-06-14 01:27:17.000000000 -0700
+@@ -1,4 +1,4 @@
+-.\" $OpenBSD: mail9.nr,v 1.3 1997/07/13 23:35:51 millert Exp $
++.\" $OpenBSD$
+ .\"
+ .\" Copyright (c) 1980, 1993
+ .\" The Regents of the University of California. All rights reserved.
+@@ -31,8 +31,9 @@
+ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ .\" SUCH DAMAGE.
+ .\"
+-.\" @(#)mail9.nr 8.2 (Berkeley) 5/16/94
++.\" @(#)mail9.nr 8.1 (Berkeley) 6/8/93
+ .\"
++.bp
+ .sh 1 "Summary of commands, options, and escapes"
+ .pp
+ This section gives a quick summary of the
+@@ -100,6 +101,7 @@
+ xit Same as \fBexit\fP
+ z Scroll to next/previous screenful of headers
+ .TE
++.bp
+ .(b
+ .pp
+ The following table describes the options. Each option is
+diff -urN mailx-8.1.1.orig/USD.doc/maila.nr mailx-8.1.1/USD.doc/maila.nr
+--- mailx-8.1.1.orig/USD.doc/maila.nr 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/USD.doc/maila.nr 1996-06-14 01:27:17.000000000 -0700
+@@ -1,4 +1,4 @@
+-.\" $OpenBSD: maila.nr,v 1.2 1996/06/11 12:54:25 deraadt Exp $
++.\" $OpenBSD$
+ .\"
+ .\" Copyright (c) 1980, 1993
+ .\" The Regents of the University of California. All rights reserved.
+diff -urN mailx-8.1.1.orig/aux.c mailx-8.1.1/aux.c
+--- mailx-8.1.1.orig/aux.c 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/aux.c 2003-03-26 13:03:39.000000000 -0800
+@@ -1,5 +1,5 @@
+-/* $OpenBSD: aux.c,v 1.20 2001/11/21 15:26:39 millert Exp $ */
+-/* $NetBSD: aux.c,v 1.5 1997/05/13 06:15:52 mikel Exp $ */
++/* $OpenBSD: aux.c,v 1.4 1996/06/08 19:48:10 christos Exp $ */
++/* $NetBSD: aux.c,v 1.4 1996/06/08 19:48:10 christos Exp $ */
+
+ /*
+ * Copyright (c) 1980, 1993
+@@ -36,9 +36,9 @@
+
+ #ifndef lint
+ #if 0
+-static const char sccsid[] = "@(#)aux.c 8.1 (Berkeley) 6/6/93";
++static char sccsid[] = "@(#)aux.c 8.1 (Berkeley) 6/6/93";
+ #else
+-static const char rcsid[] = "$OpenBSD: aux.c,v 1.20 2001/11/21 15:26:39 millert Exp $";
++static char rcsid[] = "$OpenBSD: aux.c,v 1.4 1996/06/08 19:48:10 christos Exp $";
+ #endif
+ #endif /* not lint */
+
+@@ -50,40 +50,74 @@
+ *
+ * Auxiliary functions.
+ */
+-static char *save2str(char *, char *);
++static char *save2str __P((char *, char *));
+
+ /*
+ * Return a pointer to a dynamic copy of the argument.
+ */
+ char *
+-savestr(char *str)
++savestr(str)
++ char *str;
+ {
+ char *new;
+ int size = strlen(str) + 1;
+
+- if ((new = salloc(size)) != NULL)
+- (void)memcpy(new, str, size);
+- return(new);
++ if ((new = salloc(size)) != NOSTR)
++ bcopy(str, new, size);
++ return new;
+ }
+
+ /*
+ * Make a copy of new argument incorporating old one.
+ */
+ static char *
+-save2str(char *str, char *old)
++save2str(str, old)
++ char *str, *old;
+ {
+ char *new;
+ int newsize = strlen(str) + 1;
+ int oldsize = old ? strlen(old) + 1 : 0;
+
+- if ((new = salloc(newsize + oldsize)) != NULL) {
++ if ((new = salloc(newsize + oldsize)) != NOSTR) {
+ if (oldsize) {
+- (void)memcpy(new, old, oldsize);
++ bcopy(old, new, oldsize);
+ new[oldsize - 1] = ' ';
+ }
+- (void)memcpy(new + oldsize, str, newsize);
++ bcopy(str, new + oldsize, newsize);
+ }
+- return(new);
++ return new;
++}
++
++/*
++ * Announce a fatal error and die.
++ */
++#if __STDC__
++#include <stdarg.h>
++#else
++#include <varargs.h>
++#endif
++
++void
++#if __STDC__
++panic(const char *fmt, ...)
++#else
++panic(fmt, va_alist)
++ char *fmt;
++ va_dcl
++#endif
++{
++ va_list ap;
++#if __STDC__
++ va_start(ap, fmt);
++#else
++ va_start(ap);
++#endif
++ (void)fprintf(stderr, "panic: ");
++ vfprintf(stderr, fmt, ap);
++ va_end(ap);
++ (void)fprintf(stderr, "\n");
++ fflush(stderr);
++ abort();
+ }
+
+ /*
+@@ -92,7 +126,8 @@
+ * back to the system mailbox on exit.
+ */
+ void
+-touch(struct message *mp)
++touch(mp)
++ register struct message *mp;
+ {
+
+ mp->m_flag |= MTOUCH;
+@@ -105,53 +140,57 @@
+ * Return true if it is.
+ */
+ int
+-isdir(char *name)
++isdir(name)
++ char name[];
+ {
+ struct stat sbuf;
+
+ if (stat(name, &sbuf) < 0)
+ return(0);
+- return(S_ISDIR(sbuf.st_mode));
++ return((sbuf.st_mode & S_IFMT) == S_IFDIR);
+ }
+
+ /*
+ * Count the number of arguments in the given string raw list.
+ */
+ int
+-argcount(char **argv)
++argcount(argv)
++ char **argv;
+ {
+- char **ap;
++ register char **ap;
+
+- for (ap = argv; *ap++ != NULL;)
++ for (ap = argv; *ap++ != NOSTR;)
+ ;
+- return(ap - argv - 1);
++ return ap - argv - 1;
+ }
+
+ /*
+ * Return the desired header line from the passed message
+- * pointer (or NULL if the desired header field is not available).
++ * pointer (or NOSTR if the desired header field is not available).
+ */
+ char *
+-hfield(char *field, struct message *mp)
++hfield(field, mp)
++ char field[];
++ struct message *mp;
+ {
+- FILE *ibuf;
++ register FILE *ibuf;
+ char linebuf[LINESIZE];
+- int lc;
+- char *hfield;
+- char *colon, *oldhfield = NULL;
++ register int lc;
++ register char *hfield;
++ char *colon, *oldhfield = NOSTR;
+
+ ibuf = setinput(mp);
+ if ((lc = mp->m_lines - 1) < 0)
+- return(NULL);
+- if (readline(ibuf, linebuf, LINESIZE, NULL) < 0)
+- return(NULL);
++ return NOSTR;
++ if (readline(ibuf, linebuf, LINESIZE) < 0)
++ return NOSTR;
+ while (lc > 0) {
+ if ((lc = gethfield(ibuf, linebuf, lc, &colon)) < 0)
+- return(oldhfield);
++ return oldhfield;
+ if ((hfield = ishfield(linebuf, colon, field)) != NULL)
+ oldhfield = save2str(hfield, oldhfield);
+ }
+- return(oldhfield);
++ return oldhfield;
+ }
+
+ /*
+@@ -161,17 +200,21 @@
+ * Must deal with \ continuations & other such fraud.
+ */
+ int
+-gethfield(FILE *f, char *linebuf, int rem, char **colon)
++gethfield(f, linebuf, rem, colon)
++ register FILE *f;
++ char linebuf[];
++ register int rem;
++ char **colon;
+ {
+ char line2[LINESIZE];
+- char *cp, *cp2;
+- int c;
++ register char *cp, *cp2;
++ register int c;
+
+ for (;;) {
+ if (--rem < 0)
+- return(-1);
+- if ((c = readline(f, linebuf, LINESIZE, NULL)) <= 0)
+- return(-1);
++ return -1;
++ if ((c = readline(f, linebuf, LINESIZE)) <= 0)
++ return -1;
+ for (cp = linebuf; isprint(*cp) && *cp != ' ' && *cp != ':';
+ cp++)
+ ;
+@@ -192,7 +235,7 @@
+ ungetc(c = getc(f), f);
+ if (c != ' ' && c != '\t')
+ break;
+- if ((c = readline(f, line2, LINESIZE, NULL)) < 0)
++ if ((c = readline(f, line2, LINESIZE)) < 0)
+ break;
+ rem--;
+ for (cp2 = line2; *cp2 == ' ' || *cp2 == '\t'; cp2++)
+@@ -201,11 +244,11 @@
+ if (cp + c >= linebuf + LINESIZE - 2)
+ break;
+ *cp++ = ' ';
+- (void)memcpy(cp, cp2, c);
++ bcopy(cp2, cp, c);
+ cp += c;
+ }
+ *cp = 0;
+- return(rem);
++ return rem;
+ }
+ /* NOTREACHED */
+ }
+@@ -216,51 +259,43 @@
+ */
+
+ char*
+-ishfield(char *linebuf, char *colon, char *field)
++ishfield(linebuf, colon, field)
++ char linebuf[], field[];
++ char *colon;
+ {
+- char *cp = colon;
++ register char *cp = colon;
+
+ *cp = 0;
+ if (strcasecmp(linebuf, field) != 0) {
+ *cp = ':';
+- return(0);
++ return 0;
+ }
+ *cp = ':';
+ for (cp++; *cp == ' ' || *cp == '\t'; cp++)
+ ;
+- return(cp);
++ return cp;
+ }
+
+ /*
+- * Copy a string, lowercasing it as we go. ``dsize'' should be
+- * the real size (not len) of the dest string (guarantee NUL term).
++ * Copy a string, lowercasing it as we go.
+ */
+-size_t
+-istrcpy(char *dst, const char *src, size_t dsize)
+-{
+- char *d = dst;
+- const char *s = src;
+- size_t n = dsize;
+-
+- /* Copy as many bytes as will fit */
+- if (n != 0 && --n != 0) {
+- do {
+- if (isupper(*s))
+- *d++ = tolower(*s++);
+- else if ((*d++ = *s++) == 0)
+- break;
+- } while (--n != 0);
+- }
+-
+- /* Not enough room in dst, add NUL and traverse rest of src */
+- if (n == 0) {
+- if (dsize != 0)
+- *d = '\0'; /* NUL-terminate dst */
+- while (*s++)
+- ;
++void
++istrcpy(dest, src, size)
++ register char *dest, *src;
++ int size;
++{
++ register char *max;
++
++ max=dest+size-1;
++ while (dest<=max) {
++ if (isupper(*src)) {
++ *dest++ = tolower(*src);
++ } else {
++ *dest++ = *src;
++ }
++ if (*src++ == 0)
++ break;
+ }
+-
+- return(s - src - 1); /* count does not include NUL */
+ }
+
+ /*
+@@ -268,6 +303,7 @@
+ * commands. All but the current file pointer are saved on
+ * the stack.
+ */
++
+ static int ssp; /* Top of file stack */
+ struct sstack {
+ FILE *s_file; /* File we were in. */
+@@ -281,21 +317,22 @@
+ * that they are no longer reading from a tty (in all probability).
+ */
+ int
+-source(void *v)
++source(v)
++ void *v;
+ {
+ char **arglist = v;
+ FILE *fi;
+ char *cp;
+
+- if ((cp = expand(*arglist)) == NULL)
++ if ((cp = expand(*arglist)) == NOSTR)
+ return(1);
+ if ((fi = Fopen(cp, "r")) == NULL) {
+- warn("%s", cp);
++ perror(cp);
+ return(1);
+ }
+ if (ssp >= NOFILE - 1) {
+- puts("Too much \"sourcing\" going on.");
+- (void)Fclose(fi);
++ printf("Too much \"sourcing\" going on.\n");
++ Fclose(fi);
+ return(1);
+ }
+ sstack[ssp].s_file = input;
+@@ -314,17 +351,16 @@
+ * Update the "sourcing" flag as appropriate.
+ */
+ int
+-unstack(void)
++unstack()
+ {
+-
+ if (ssp <= 0) {
+- puts("\"Source\" stack over-pop.");
++ printf("\"Source\" stack over-pop.\n");
+ sourcing = 0;
+ return(1);
+ }
+- (void)Fclose(input);
++ Fclose(input);
+ if (cond != CANY)
+- puts("Unmatched \"if\"");
++ printf("Unmatched \"if\"\n");
+ ssp--;
+ cond = sstack[ssp].s_cond;
+ loading = sstack[ssp].s_loading;
+@@ -339,20 +375,17 @@
+ * This is nifty for the shell.
+ */
+ void
+-alter(char *name)
++alter(name)
++ char *name;
+ {
+ struct stat sb;
+ struct timeval tv[2];
+
+ if (stat(name, &sb))
+ return;
+- (void) gettimeofday(&tv[0], (struct timezone *)0);
+- tv[0].tv_sec++;
+-#ifdef TIMESPEC_TO_TIMEVAL
+- TIMESPEC_TO_TIMEVAL(&tv[1], &sb.st_mtimespec);
+-#else
++ tv[0].tv_sec = time((time_t *)0) + 1;
+ tv[1].tv_sec = sb.st_mtime;
+-#endif
++ tv[0].tv_usec = tv[1].tv_usec = 0;
+ (void)utimes(name, tv);
+ }
+
+@@ -361,9 +394,10 @@
+ * return true if it is all blanks and tabs.
+ */
+ int
+-blankline(char *linebuf)
++blankline(linebuf)
++ char linebuf[];
+ {
+- char *cp;
++ register char *cp;
+
+ for (cp = linebuf; *cp; cp++)
+ if (*cp != ' ' && *cp != '\t')
+@@ -377,14 +411,16 @@
+ * before returning it.
+ */
+ char *
+-nameof(struct message *mp, int reptype)
++nameof(mp, reptype)
++ register struct message *mp;
++ int reptype;
+ {
+- char *cp, *cp2;
++ register char *cp, *cp2;
+
+ cp = skin(name1(mp, reptype));
+ if (reptype != 0 || charcount(cp, '!') < 2)
+ return(cp);
+- cp2 = strrchr(cp, '!');
++ cp2 = rindex(cp, '!');
+ cp2--;
+ while (cp2 > cp && *cp2 != '!')
+ cp2--;
+@@ -398,9 +434,10 @@
+ * Ignore it.
+ */
+ char *
+-skip_comment(char *cp)
++skip_comment(cp)
++ register char *cp;
+ {
+- int nesting = 1;
++ register nesting = 1;
+
+ for (; nesting > 0 && *cp; cp++) {
+ switch (*cp) {
+@@ -416,7 +453,7 @@
+ break;
+ }
+ }
+- return(cp);
++ return cp;
+ }
+
+ /*
+@@ -424,20 +461,20 @@
+ * of "host-phrase."
+ */
+ char *
+-skin(char *name)
++skin(name)
++ char *name;
+ {
+- char *nbuf, *bufend, *cp, *cp2;
+- int c, gotlt, lastsp;
+-
+- if (name == NULL)
+- return(NULL);
+- if (strchr(name, '(') == NULL && strchr(name, '<') == NULL
+- && strchr(name, ' ') == NULL)
++ register int c;
++ register char *cp, *cp2;
++ char *bufend;
++ int gotlt, lastsp;
++ char nbuf[BUFSIZ];
++
++ if (name == NOSTR)
++ return(NOSTR);
++ if (index(name, '(') == NOSTR && index(name, '<') == NOSTR
++ && index(name, ' ') == NOSTR)
+ return(name);
+-
+- /* We assume that length(input) <= length(output) */
+- if ((nbuf = (char *)malloc(strlen(name) + 1)) == NULL)
+- errx(1, "Out of memory");
+ gotlt = 0;
+ lastsp = 0;
+ bufend = nbuf;
+@@ -510,9 +547,9 @@
+ *cp2++ = ' ';
+ }
+ *cp2++ = c;
+- if (c == ',' && *cp == ' ' && !gotlt) {
++ if (c == ',' && !gotlt) {
+ *cp2++ = ' ';
+- while (*++cp == ' ')
++ for (; *cp == ' '; cp++)
+ ;
+ lastsp = 0;
+ bufend = cp2;
+@@ -521,9 +558,7 @@
+ }
+ *cp2 = 0;
+
+- if ((cp = (char *)realloc(nbuf, strlen(nbuf) + 1)) != NULL)
+- nbuf = cp;
+- return(nbuf);
++ return(savestr(nbuf));
+ }
+
+ /*
+@@ -534,21 +569,23 @@
+ * 2 -- get sender's name for Reply
+ */
+ char *
+-name1(struct message *mp, int reptype)
++name1(mp, reptype)
++ register struct message *mp;
++ int reptype;
+ {
+ char namebuf[LINESIZE];
+ char linebuf[LINESIZE];
+- char *cp, *cp2;
+- FILE *ibuf;
++ register char *cp, *cp2;
++ register FILE *ibuf;
+ int first = 1;
+
+- if ((cp = hfield("from", mp)) != NULL)
+- return(cp);
+- if (reptype == 0 && (cp = hfield("sender", mp)) != NULL)
+- return(cp);
++ if ((cp = hfield("from", mp)) != NOSTR)
++ return cp;
++ if (reptype == 0 && (cp = hfield("sender", mp)) != NOSTR)
++ return cp;
+ ibuf = setinput(mp);
+- namebuf[0] = '\0';
+- if (readline(ibuf, linebuf, LINESIZE, NULL) < 0)
++ namebuf[0] = 0;
++ if (readline(ibuf, linebuf, LINESIZE) < 0)
+ return(savestr(namebuf));
+ newname:
+ for (cp = linebuf; *cp && *cp != ' '; cp++)
+@@ -559,27 +596,29 @@
+ *cp && *cp != ' ' && *cp != '\t' && cp2 < namebuf + LINESIZE - 1;)
+ *cp2++ = *cp++;
+ *cp2 = '\0';
+- if (readline(ibuf, linebuf, LINESIZE, NULL) < 0)
++ if (readline(ibuf, linebuf, LINESIZE) < 0)
+ return(savestr(namebuf));
+- if ((cp = strchr(linebuf, 'F')) == NULL)
++ if ((cp = index(linebuf, 'F')) == NULL)
+ return(savestr(namebuf));
+ if (strncmp(cp, "From", 4) != 0)
+ return(savestr(namebuf));
+- while ((cp = strchr(cp, 'r')) != NULL) {
++ while ((cp = index(cp, 'r')) != NULL) {
+ if (strncmp(cp, "remote", 6) == 0) {
+- if ((cp = strchr(cp, 'f')) == NULL)
++ if ((cp = index(cp, 'f')) == NULL)
+ break;
+ if (strncmp(cp, "from", 4) != 0)
+ break;
+- if ((cp = strchr(cp, ' ')) == NULL)
++ if ((cp = index(cp, ' ')) == NULL)
+ break;
+ cp++;
+ if (first) {
+- cp2 = namebuf;
++ strncpy(namebuf, cp, LINESIZE);
+ first = 0;
+- } else
+- cp2 = strrchr(namebuf, '!') + 1;
+- istrcpy(cp2, cp, sizeof(namebuf) - (cp2 - namebuf) - 1);
++ } else {
++ cp2=rindex(namebuf, '!')+1;
++ strncpy(cp2, cp, (namebuf+LINESIZE)-cp2);
++ }
++ namebuf[LINESIZE-2]='\0';
+ strcat(namebuf, "!");
+ goto newname;
+ }
+@@ -592,10 +631,12 @@
+ * Count the occurances of c in str
+ */
+ int
+-charcount(char *str, int c)
++charcount(str, c)
++ char *str;
++ int c;
+ {
+- char *cp;
+- int i;
++ register char *cp;
++ register int i;
+
+ for (i = 0, cp = str; *cp; cp++)
+ if (*cp == c)
+@@ -604,71 +645,79 @@
+ }
+
+ /*
++ * Are any of the characters in the two strings the same?
++ */
++int
++anyof(s1, s2)
++ register char *s1, *s2;
++{
++
++ while (*s1)
++ if (index(s2, *s1++))
++ return 1;
++ return 0;
++}
++
++/*
+ * Convert c to upper case
+ */
+ int
+-raise(int c)
++raise(c)
++ register int c;
+ {
+
+ if (islower(c))
+- return(toupper(c));
+- return(c);
++ return toupper(c);
++ return c;
+ }
+
+ /*
+ * Copy s1 to s2, return pointer to null in s2.
+ */
+ char *
+-copy(char *s1, char *s2)
++copy(s1, s2)
++ register char *s1, *s2;
+ {
+
+ while ((*s2++ = *s1++) != '\0')
+ ;
+- return(s2 - 1);
++ return s2 - 1;
+ }
+
+ /*
+ * See if the given header field is supposed to be ignored.
+ */
+ int
+-isign(char *field, struct ignoretab ignore[2])
++isign(field, ignore)
++ char *field;
++ struct ignoretab ignore[2];
+ {
+- char realfld[LINESIZE];
++ char realfld[BUFSIZ];
+
+ if (ignore == ignoreall)
+- return(1);
++ return 1;
+ /*
+ * Lower-case the string, so that "Status" and "status"
+ * will hash to the same place.
+ */
+- istrcpy(realfld, field, sizeof(realfld));
++ istrcpy(realfld, field, BUFSIZ);
++ realfld[BUFSIZ-1]='\0';
+ if (ignore[1].i_count > 0)
+- return(!member(realfld, ignore + 1));
++ return (!member(realfld, ignore + 1));
+ else
+- return(member(realfld, ignore));
++ return (member(realfld, ignore));
+ }
+
+ int
+-member(char *realfield, struct ignoretab *table)
++member(realfield, table)
++ register char *realfield;
++ struct ignoretab *table;
+ {
+- struct ignore *igp;
++ register struct ignore *igp;
+
+ for (igp = table->i_head[hash(realfield)]; igp != 0; igp = igp->i_link)
+ if (*igp->i_field == *realfield &&
+ equal(igp->i_field, realfield))
+- return(1);
+- return(0);
+-}
+-
+-void
+-clearnew(void)
+-{
+- struct message *mp;
+-
+- for (mp = &message[0]; mp < &message[msgCount]; mp++) {
+- if (mp->m_flag & MNEW) {
+- mp->m_flag &= ~MNEW;
+- mp->m_flag |= MSTATUS;
+- }
+- }
++ return (1);
++ return (0);
+ }
+diff -urN mailx-8.1.1.orig/changelog mailx-8.1.1/changelog
+--- mailx-8.1.1.orig/changelog 1969-12-31 16:00:00.000000000 -0800
++++ mailx-8.1.1/changelog 2003-03-26 13:03:40.000000000 -0800
+@@ -0,0 +1,159 @@
++mailx (1:8.1.1-10.1.3) frozen unstable; urgency=high
++
++ * More security fixes
++ * Don't allow to set interactive in mailrc (or interactively)
++ * Modify the variable-handling code to grok NULL values
++
++ -- Wichert Akkerman <wakkerma@debian.org> Mon, 7 Aug 2000 17:22:57 -0700
++
++mailx (1:8.1.1-10.1.2) frozen unstable; urgency=high
++
++ * Another security problem: refuse to get the interactive variable
++ from the environment by explicitly setting it in the hashtable.
++
++ -- Wichert Akkerman <wakkerma@debian.org> Mon, 7 Aug 2000 12:36:10 -0700
++
++mailx (1:8.1.1-10.1.1) frozen unstable; urgency=high
++
++ * NMU to fix RC bug. Now accepts both /var/mail and /var/spool/mail as
++ allowed places for setgid file manipulation. fixes:#64238
++
++ -- Paul Slootman <paul@debian.org> Thu, 8 Jun 2000 19:51:14 +0200
++
++mailx (1:8.1.1-10.1) stable frozen unstable; urgency=high
++
++ * Security fix for a GID=mail shell.
++
++ -- Daniel Jacobowitz <dan@debian.org> Sun, 4 Jun 2000 22:45:19 -0700
++
++mailx (1:8.1.1-10) frozen unstable; urgency=high
++
++ * correct major security flaw, patch from Alvaro Martinez Echevarria
++ <alvaro@lander.es>, bug#23880, bug#23901
++
++ * other potential buffer overflow, patch from Juan-Mariano de Goyeneche
++ <jmseyas@selva.dit.upm.es>, bug #22937
++
++
++ -- Loic Prylli <Loic.Prylli@graville.fdn.fr> Sun, 28 Jun 1998 20:15:18 -0400
++
++mailx (1:8.1.1-9) frozen unstable; urgency=high
++
++ * recompile without the signal handling workarounds (lo
++ that eliminate critical bugs where message parts can be lost
++ (#20798) and (#20558)
++
++ -- Loic Prylli <lprylli@graville.fdn.fr> Thu, 9 Apr 1998 02:11:26 +0200
++
++mailx (1:8.1.1-8) frozen unstable; urgency=high
++
++ * previous patch broke most file accesses, corrected safe_open (#20634)
++ * try to check every access to Fopen, change "a" into "w" for new files,
++ to suit behaviour of safe_open.
++
++ -- Loic Prylli <lprylli@graville.fdn.fr> Sat, 4 Apr 1998 22:01:19 +0200
++
++mailx (1:8.1.1-7) frozen; urgency=medium
++
++ * security fix for tmp races patch from Martin Schulze (#20059)
++
++ -- Loic Prylli <lprylli@graville.fdn.fr> Mon, 23 Mar 1998 22:52:35 +0100
++
++mailx (1:8.1.1-6) unstable; urgency=low
++
++ * convert to debhelper
++ * changelog now compressed (bug#15431)
++ * removed .orig and .rej from source (bug#18409)
++
++ -- Loic Prylli <lprylli@graville.fdn.fr> Sat, 14 Feb 1998 14:34:22 +0100
++
++mailx (1:8.1.1-5) unstable; urgency=low
++
++ * apply David Brown patch so mailx choose the right window size
++ (#12197)
++ * correct Depends: in control file.
++
++ -- Loic Prylli <lprylli@graville.fdn.fr> Sat, 15 Nov 1997 00:30:38 +0100
++
++mailx (1:8.1.1-4) unstable; urgency=high
++
++ * mailx was sending empty message, ignoring user input
++ add clearerr when EAGAIN occur in "IOSAFE" code (#14263)
++
++ -- Loic Prylli <lprylli@graville.fdn.fr> Tue, 11 Nov 1997 20:22:35 +0100
++
++mailx (1:8.1.1-3.1) unstable; urgency=low
++
++ * Non-maintainer release.
++ * Libc6 compile. (#11705)
++ * Install missing symlink to manpage. (#7274)
++
++ -- Martin Mitchell <martin@debian.org> Wed, 29 Oct 1997 04:34:39 +1100
++
++mailx (1:8.1.1-3) unstable; urgency=low
++
++ * add dpkg --assert-working-epoch in preinst bug#6850
++ * add writing of pid in mailbox locking file
++ * fix:mailx was not removing temporary lock files
++
++ -- Loic Prylli <lprylli@graville.fdn.fr> Sat, 1 Feb 1997 11:44:04 +0100
++
++mailx (1:8.1.1-2) unstable; urgency=low
++
++ * correct bug #2733 (occur when no space left) dans quit.c
++ * detection of From_ lines with tring to match the date bug#2010
++ * corrected garble output bug #2284
++
++ -- Loic Prylli <lprylli@graville.fdn.fr> Sat, 28 Dec 1996 15:02:22 +0100
++
++mailx (1:8.1.1-1) unstable; urgency=medium
++
++ * recreate completely starting from OpenBSD mail version (we loose a lot
++ of extension but we have a working program now)
++ * OpenBSD base version is the last one in december 96
++ * rechange the numbering of version, so epoch 1+8.1 is from 4.4BSD, the
++ last upstream digit is to change each time we update to a new openbsd
++ version.
++ * fix the problem of longjmp inside signals inside stdio calls
++ * reincorporate a patch to be dot file locking+setgid safe
++ * some fix in signal handling
++
++ -- Loic Prylli <lprylli@graville.fdn.fr> Mon, 23 Dec 1996 01:57:44 +0100
++
++Mon Apr 29 17:21:42 1996 Sven Rudolph <sr1@inf.tu-dresden.de>
++
++ * releasing 8.5.5-1
++
++ * added symlink /usr/bin/Mail -> /usr/bin/mailx
++
++Thu Apr 25 23:55:36 1996 Sven Rudolph <sr1@inf.tu-dresden.de>
++
++ * set version number to 8.5.5 because it has to superseed 8.1
++
++ * switched back to mailx-5.5-kw (see mailx-5.5-kw.diff.README)
++
++ * no POP support
++
++mailx 8.1 Debian 5 - 10/19/95 Sven Rudolph <sr1@inf.tu-dresden.de>
++* uses now BSD signal emulation (/usr/include/bsd/signal.h)
++* added virtual package names in Depends: and Provides fields (Bug#1460)
++* added Section: field
++* created symlink for mailx manpage (Bug#1114)
++
++mailx 8.1 Debian 4 - 5/20/95 Carl Streeter <streeter@cae.wisc.edu>
++* Added diffs from Delman Lee <delman@mipg.upenn.edu>:
++
++ Hi! I got mailx-8.1-3 from the Linux Debian distribution, and have
++ added a "hold-pop" option to hold messages on the POP server after
++ retrieving them. (Also fixed a minor bug with mailx thinking that there
++ is mail even if the POP mailbox is empty. Code around stat() below.)
++
++mailx 8.1 Debian 3 - 4/18/95 Carl Streeter <streeter@cae.wisc.edu>
++* Fixed control file to depend on smail|sendmail. Updated to latest
++ guidelines
++
++
++
++Local variables:
++mode: debian-changelog
++End:
+diff -urN mailx-8.1.1.orig/cmd1.c mailx-8.1.1/cmd1.c
+--- mailx-8.1.1.orig/cmd1.c 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/cmd1.c 2003-03-26 13:03:39.000000000 -0800
+@@ -1,5 +1,5 @@
+-/* $OpenBSD: cmd1.c,v 1.22 2001/11/21 20:41:55 millert Exp $ */
+-/* $NetBSD: cmd1.c,v 1.9 1997/07/09 05:29:48 mikel Exp $ */
++/* $OpenBSD: cmd1.c,v 1.5 1996/06/08 19:48:11 christos Exp $ */
++/* $NetBSD: cmd1.c,v 1.5 1996/06/08 19:48:11 christos Exp $ */
+
+ /*-
+ * Copyright (c) 1980, 1993
+@@ -36,9 +36,9 @@
+
+ #ifndef lint
+ #if 0
+-static const char sccsid[] = "@(#)cmd1.c 8.2 (Berkeley) 4/20/95";
++static char sccsid[] = "@(#)cmd1.c 8.1 (Berkeley) 6/6/93";
+ #else
+-static const char rcsid[] = "$OpenBSD: cmd1.c,v 1.22 2001/11/21 20:41:55 millert Exp $";
++static char rcsid[] = "$OpenBSD: cmd1.c,v 1.5 1996/06/08 19:48:11 christos Exp $";
+ #endif
+ #endif /* not lint */
+
+@@ -57,16 +57,15 @@
+ */
+
+ static int screen;
+-static volatile sig_atomic_t gothdrint;
+
+ int
+-headers(void *v)
++headers(v)
++ void *v;
+ {
+ int *msgvec = v;
+- int n, mesg, flag, size;
+- struct message *mp;
+- struct sigaction act, oact;
+- sigset_t oset;
++ register int n, mesg, flag;
++ register struct message *mp;
++ int size;
+
+ size = screensize();
+ n = msgvec[0];
+@@ -83,15 +82,7 @@
+ mesg = mp - &message[0];
+ if (dot != &message[n-1])
+ dot = mp;
+- sigemptyset(&act.sa_mask);
+- act.sa_flags = SA_RESTART;
+- act.sa_handler = hdrint;
+- if (sigaction(SIGINT, NULL, &oact) == 0 &&
+- oact.sa_handler != SIG_IGN) {
+- (void)sigaction(SIGINT, &act, &oact);
+- (void)sigprocmask(SIG_UNBLOCK, &intset, &oset);
+- }
+- for (gothdrint = 0; !gothdrint && mp < &message[msgCount]; mp++) {
++ for (; mp < &message[msgCount]; mp++) {
+ mesg++;
+ if (mp->m_flag & MDELETED)
+ continue;
+@@ -99,16 +90,8 @@
+ break;
+ printhead(mesg);
+ }
+- if (gothdrint) {
+- fflush(stdout);
+- fputs("\nInterrupt\n", stderr);
+- }
+- if (oact.sa_handler != SIG_IGN) {
+- (void)sigprocmask(SIG_SETMASK, &oset, NULL);
+- (void)sigaction(SIGINT, &oact, NULL);
+- }
+ if (flag == 0) {
+- puts("No more mail.");
++ printf("No more mail.\n");
+ return(1);
+ }
+ return(0);
+@@ -118,31 +101,33 @@
+ * Scroll to the next/previous screen
+ */
+ int
+-scroll(void *v)
++scroll(v)
++ void *v;
+ {
+ char *arg = v;
+- int size, maxscreen;
++ register int s, size;
+ int cur[1];
+
+ cur[0] = 0;
+ size = screensize();
+- maxscreen = (msgCount - 1) / size;
++ s = screen;
+ switch (*arg) {
+ case 0:
+ case '+':
+- if (screen >= maxscreen) {
+- puts("On last screenful of messages");
++ s++;
++ if (s * size > msgCount) {
++ printf("On last screenful of messages\n");
+ return(0);
+ }
+- screen++;
++ screen = s;
+ break;
+
+ case '-':
+- if (screen <= 0) {
+- puts("On first screenful of messages");
++ if (--s < 0) {
++ printf("On first screenful of messages\n");
+ return(0);
+ }
+- screen--;
++ screen = s;
+ break;
+
+ default:
+@@ -156,14 +141,14 @@
+ * Compute screen size.
+ */
+ int
+-screensize(void)
++screensize()
+ {
+ int s;
+ char *cp;
+
+- if ((cp = value("screen")) != NULL && (s = atoi(cp)) > 0)
+- return(s);
+- return(screenheight - 4);
++ if ((cp = value("screen")) != NOSTR && (s = atoi(cp)) > 0)
++ return s;
++ return screenheight - 4;
+ }
+
+ /*
+@@ -171,7 +156,8 @@
+ * in the passed message list.
+ */
+ int
+-from(void *v)
++from(v)
++ void *v;
+ {
+ int *msgvec = v;
+ register int *ip;
+@@ -188,7 +174,8 @@
+ * This is a slight improvement to the standard one.
+ */
+ void
+-printhead(int mesg)
++printhead(mesg)
++ int mesg;
+ {
+ struct message *mp;
+ char headline[LINESIZE], wcount[LINESIZE], *subjline, dispc, curind;
+@@ -196,13 +183,10 @@
+ struct headline hl;
+ int subjlen;
+ char *name;
+- char *to, *from;
+- struct name *np;
+- char **ap;
+
+ mp = &message[mesg-1];
+- (void)readline(setinput(mp), headline, LINESIZE, NULL);
+- if ((subjline = hfield("subject", mp)) == NULL)
++ (void) readline(setinput(mp), headline, LINESIZE);
++ if ((subjline = hfield("subject", mp)) == NOSTR)
+ subjline = hfield("subj", mp);
+ /*
+ * Bletch!
+@@ -220,32 +204,15 @@
+ if (mp->m_flag & MBOX)
+ dispc = 'M';
+ parse(headline, &hl, pbuf);
+- (void)snprintf(wcount, sizeof(wcount), "%4d/%-5d", mp->m_lines,
+- mp->m_size);
+- subjlen = screenwidth - 44 - strlen(wcount);
+- from = nameof(mp, 0);
+- to = skin(hfield("to", mp));
+- np = extract(from, GTO);
+- np = delname(np, myname);
+- if (altnames)
+- for (ap = altnames; *ap; ap++)
+- np = delname(np, *ap);
+- if (np)
+- /* not from me */
+- name = value("show-rcpt") != NULL && to ? to : from;
+- else
+- /* from me - show TO */
+- name = value("showto") != NULL && to ? to : from;
+- if (subjline == NULL || subjlen < 0) { /* pretty pathetic */
+- subjline="";
+- subjlen=0;
+- }
+- if (name == to)
+- printf("%c%c%3d TO %-14.14s %16.16s %s %.*s\n",
+- curind, dispc, mesg, name, hl.l_date, wcount,
+- subjlen, subjline);
++ sprintf(wcount, "%3d/%-5ld", mp->m_lines, mp->m_size);
++ subjlen = screenwidth - 50 - strlen(wcount);
++ name = value("show-rcpt") != NOSTR ?
++ skin(hfield("to", mp)) : nameof(mp, 0);
++ if (subjline == NOSTR || subjlen < 0) /* pretty pathetic */
++ printf("%c%c%3d %-20.20s %16.16s %s\n",
++ curind, dispc, mesg, name, hl.l_date, wcount);
+ else
+- printf("%c%c%3d %-17.17s %16.16s %s %.*s\n",
++ printf("%c%c%3d %-20.20s %16.16s %s \"%.*s\"\n",
+ curind, dispc, mesg, name, hl.l_date, wcount,
+ subjlen, subjline);
+ }
+@@ -254,9 +221,10 @@
+ * Print out the value of dot.
+ */
+ int
+-pdot(void *v)
++pdot(v)
++ void *v;
+ {
+- printf("%d\n", (int)(dot - &message[0] + 1));
++ printf("%d\n", dot - &message[0] + 1);
+ return(0);
+ }
+
+@@ -264,163 +232,167 @@
+ * Print out all the possible commands.
+ */
+ int
+-pcmdlist(void *v)
++pcmdlist(v)
++ void *v;
+ {
+ extern const struct cmd cmdtab[];
+- const struct cmd *cp;
+- int cc;
++ register const struct cmd *cp;
++ register int cc;
+
+- puts("Commands are:");
++ printf("Commands are:\n");
+ for (cc = 0, cp = cmdtab; cp->c_name != NULL; cp++) {
+ cc += strlen(cp->c_name) + 2;
+ if (cc > 72) {
+- putchar('\n');
++ printf("\n");
+ cc = strlen(cp->c_name) + 2;
+ }
+- if ((cp+1)->c_name != NULL)
++ if ((cp+1)->c_name != NOSTR)
+ printf("%s, ", cp->c_name);
+ else
+- puts(cp->c_name);
++ printf("%s\n", cp->c_name);
+ }
+ return(0);
+ }
+
+ /*
+- * Pipe message to command
+- */
+-int
+-pipeit(void *ml, void *sl)
+-{
+- int *msgvec = ml;
+- char *cmd = sl;
+-
+- return(type1(msgvec, cmd, 0, 0));
+-}
+-
+-/*
+ * Paginate messages, honor ignored fields.
+ */
+ int
+-more(void *v)
++more(v)
++ void *v;
+ {
+ int *msgvec = v;
+- return(type1(msgvec, NULL, 1, 1));
++ return (type1(msgvec, 1, 1));
+ }
+
+ /*
+ * Paginate messages, even printing ignored fields.
+ */
+ int
+-More(void *v)
++More(v)
++ void *v;
+ {
+ int *msgvec = v;
+
+- return(type1(msgvec, NULL, 0, 1));
++ return (type1(msgvec, 0, 1));
+ }
+
+ /*
+ * Type out messages, honor ignored fields.
+ */
+ int
+-type(void *v)
++type(v)
++ void *v;
+ {
+ int *msgvec = v;
+
+- return(type1(msgvec, NULL, 1, 0));
++ return(type1(msgvec, 1, 0));
+ }
+
+ /*
+ * Type out messages, even printing ignored fields.
+ */
+ int
+-Type(void *v)
++Type(v)
++ void *v;
+ {
+ int *msgvec = v;
+
+- return(type1(msgvec, NULL, 0, 0));
++ return(type1(msgvec, 0, 0));
+ }
+
+ /*
+ * Type out the messages requested.
+ */
++jmp_buf pipestop;
+ int
+-type1(int *msgvec, char *cmd, int doign, int page)
++type1(msgvec, doign, page)
++ int *msgvec;
++ int doign, page;
+ {
+- int nlines, *ip, restoreterm;
++ register *ip;
+ struct message *mp;
+- struct termios tbuf;
+ char *cp;
++ int nlines;
+ FILE *obuf;
++#if __GNUC__
++ /* Avoid longjmp clobbering */
++ (void) &cp;
++ (void) &obuf;
++#endif
+
+ obuf = stdout;
+- restoreterm = 0;
+-
+- /*
+- * start a pipe if needed.
+- */
+- if (cmd) {
+- restoreterm = (tcgetattr(fileno(stdin), &tbuf) == 0);
+- obuf = Popen(cmd, "w");
+- if (obuf == NULL) {
+- warn("%s", cmd);
+- obuf = stdout;
+- }
+- } else if (value("interactive") != NULL &&
+- (page || (cp = value("crt")) != NULL)) {
++ if (setjmp(pipestop))
++ goto close_pipe;
++ if (value("interactive") != NOSTR &&
++ (page || (cp = value("crt")) != NOSTR)) {
+ nlines = 0;
+ if (!page) {
+ for (ip = msgvec; *ip && ip-msgvec < msgCount; ip++)
+ nlines += message[*ip - 1].m_lines;
+ }
+ if (page || nlines > (*cp ? atoi(cp) : realscreenheight)) {
+- restoreterm = (tcgetattr(fileno(stdin), &tbuf) == 0);
+- obuf = Popen(value("PAGER"), "w");
++ cp = value("PAGER");
++ if (cp == NULL || *cp == '\0')
++ cp = _PATH_MORE;
++ obuf = Popen(cp, "w");
+ if (obuf == NULL) {
+- warn("%s", cp);
++ perror(cp);
+ obuf = stdout;
+- }
++ } else
++ signal(SIGPIPE, brokpipe);
+ }
+ }
+-
+- /*
+- * Send messages to the output.
+- */
+ for (ip = msgvec; *ip && ip - msgvec < msgCount; ip++) {
+ mp = &message[*ip - 1];
+ touch(mp);
+ dot = mp;
+- if (cmd == NULL && value("quiet") == NULL)
++ if (value("quiet") == NOSTR)
+ fprintf(obuf, "Message %d:\n", *ip);
+- if (sendmessage(mp, obuf, doign ? ignore : 0, NULL) == -1)
+- break;
++ (void) send(mp, obuf, doign ? ignore : 0, NOSTR);
+ }
+-
++close_pipe:
+ if (obuf != stdout) {
+- (void)Pclose(obuf);
+- if (restoreterm)
+- (void)tcsetattr(fileno(stdin), TCSADRAIN, &tbuf);
++ /*
++ * Ignore SIGPIPE so it can't cause a duplicate close.
++ */
++ signal(SIGPIPE, SIG_IGN);
++ Pclose(obuf);
++ signal(SIGPIPE, SIG_DFL);
+ }
+ return(0);
+ }
+
+ /*
++ * Respond to a broken pipe signal --
++ * probably caused by quitting more.
++ */
++void
++brokpipe(signo)
++ int signo;
++{
++ longjmp(pipestop, 1);
++}
++
++/*
+ * Print the top so many lines of each desired message.
+ * The number of lines is taken from the variable "toplines"
+ * and defaults to 5.
+ */
+ int
+-top(void * v)
++top(v)
++ void *v;
+ {
+ int *msgvec = v;
+- int *ip;
+- struct message *mp;
++ register int *ip;
++ register struct message *mp;
+ int c, topl, lines, lineb;
+ char *valtop, linebuf[LINESIZE];
+ FILE *ibuf;
+
+ topl = 5;
+ valtop = value("toplines");
+- if (valtop != NULL) {
++ if (valtop != NOSTR) {
+ topl = atoi(valtop);
+ if (topl < 0 || topl > 10000)
+ topl = 5;
+@@ -430,14 +402,14 @@
+ mp = &message[*ip - 1];
+ touch(mp);
+ dot = mp;
+- if (value("quiet") == NULL)
++ if (value("quiet") == NOSTR)
+ printf("Message %d:\n", *ip);
+ ibuf = setinput(mp);
+ c = mp->m_lines;
+ if (!lineb)
+- putchar('\n');
++ printf("\n");
+ for (lines = 0; lines < c && lines <= topl; lines++) {
+- if (readline(ibuf, linebuf, sizeof(linebuf), NULL) < 0)
++ if (readline(ibuf, linebuf, LINESIZE) < 0)
+ break;
+ puts(linebuf);
+ lineb = blankline(linebuf);
+@@ -451,10 +423,11 @@
+ * get mboxed.
+ */
+ int
+-stouch(void *v)
++stouch(v)
++ void *v;
+ {
+ int *msgvec = v;
+- int *ip;
++ register int *ip;
+
+ for (ip = msgvec; *ip != 0; ip++) {
+ dot = &message[*ip-1];
+@@ -468,10 +441,11 @@
+ * Make sure all passed messages get mboxed.
+ */
+ int
+-mboxit(void *v)
++mboxit(v)
++ void *v;
+ {
+ int *msgvec = v;
+- int *ip;
++ register int *ip;
+
+ for (ip = msgvec; *ip != 0; ip++) {
+ dot = &message[*ip-1];
+@@ -485,51 +459,18 @@
+ * List the folders the user currently has.
+ */
+ int
+-folders(void *v)
+-{
+- char *files = (char *)v;
+- char dirname[PATHSIZE];
+- char cmd[BUFSIZ];
+-
+- if (getfold(dirname, sizeof(dirname)) < 0)
+- istrcpy(dirname, "$HOME", sizeof(dirname));
+-
+- snprintf(cmd, sizeof(cmd), "cd %s; %s %s", dirname, value("LISTER"),
+- files && *files ? files : "");
+-
+- (void)run_command(value("SHELL"), 0, -1, -1, "-c", cmd, NULL);
+- return(0);
+-}
+-
+-/*
+- * Update the mail file with any new messages that have
+- * come in since we started reading mail.
+- */
+-int
+-inc(void *v)
+-{
+- int nmsg, mdot;
+-
+- nmsg = incfile();
+-
+- if (nmsg == 0) {
+- puts("No new mail.");
+- } else if (nmsg > 0) {
+- mdot = newfileinfo(msgCount - nmsg);
+- dot = &message[mdot - 1];
+- } else {
+- puts("\"inc\" command failed...");
+- }
+-
+- return(0);
+-}
+-
+-/*
+- * User hit ^C while printing the headers.
+- */
+-void
+-hdrint(int s)
++folders(v)
++ void *v;
+ {
++ char dirname[BUFSIZ];
++ char *cmd;
+
+- gothdrint = 1;
++ if (getfold(dirname, BUFSIZ) < 0) {
++ printf("No value set for \"folder\"\n");
++ return 1;
++ }
++ if ((cmd = value("LISTER")) == NOSTR)
++ cmd = "ls";
++ (void) run_command(cmd, 0, -1, -1, dirname, NOSTR, NOSTR);
++ return 0;
+ }
+diff -urN mailx-8.1.1.orig/cmd2.c mailx-8.1.1/cmd2.c
+--- mailx-8.1.1.orig/cmd2.c 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/cmd2.c 2003-03-26 13:03:39.000000000 -0800
+@@ -1,5 +1,5 @@
+-/* $OpenBSD: cmd2.c,v 1.11 2001/11/21 20:41:55 millert Exp $ */
+-/* $NetBSD: cmd2.c,v 1.7 1997/05/17 19:55:10 pk Exp $ */
++/* $OpenBSD: cmd2.c,v 1.5 1996/06/08 19:48:13 christos Exp $ */
++/* $NetBSD: cmd2.c,v 1.5 1996/06/08 19:48:13 christos Exp $ */
+
+ /*
+ * Copyright (c) 1980, 1993
+@@ -36,9 +36,9 @@
+
+ #ifndef lint
+ #if 0
+-static const char sccsid[] = "@(#)cmd2.c 8.1 (Berkeley) 6/6/93";
++static char sccsid[] = "@(#)cmd2.c 8.1 (Berkeley) 6/6/93";
+ #else
+-static const char rcsid[] = "$OpenBSD: cmd2.c,v 1.11 2001/11/21 20:41:55 millert Exp $";
++static char rcsid[] = "$OpenBSD: cmd2.c,v 1.5 1996/06/08 19:48:13 christos Exp $";
+ #endif
+ #endif /* not lint */
+
+@@ -51,7 +51,7 @@
+ *
+ * More user commands.
+ */
+-static int igcomp(const void *, const void *);
++static int igcomp __P((const void *, const void *));
+
+ /*
+ * If any arguments were given, go to the next applicable argument
+@@ -59,24 +59,29 @@
+ * If given as first command with no arguments, print first message.
+ */
+ int
+-next(void *v)
++next(v)
++ void *v;
+ {
+- struct message *mp;
+ int *msgvec = v;
+- int *ip, *ip2, list[2], mdot;
++ register struct message *mp;
++ register int *ip, *ip2;
++ int list[2], mdot;
+
+ if (*msgvec != NULL) {
++
+ /*
+- * If some messages were supplied, find the
++ * If some messages were supplied, find the
+ * first applicable one following dot using
+ * wrap around.
+ */
++
+ mdot = dot - &message[0] + 1;
+
+ /*
+ * Find the first message in the supplied
+ * message list which follows dot.
+ */
++
+ for (ip = msgvec; *ip != NULL; ip++)
+ if (*ip > mdot)
+ break;
+@@ -94,7 +99,7 @@
+ if (*ip2 == NULL)
+ ip2 = msgvec;
+ } while (ip2 != ip);
+- puts("No messages applicable");
++ printf("No messages applicable\n");
+ return(1);
+ }
+
+@@ -102,6 +107,7 @@
+ * If this is the first command, select message 1.
+ * Note that this must exist for us to get here at all.
+ */
++
+ if (!sawcom)
+ goto hitit;
+
+@@ -109,11 +115,12 @@
+ * Just find the next good message after dot, no
+ * wraparound.
+ */
++
+ for (mp = dot+1; mp < &message[msgCount]; mp++)
+ if ((mp->m_flag & (MDELETED|MSAVED)) == 0)
+ break;
+ if (mp >= &message[msgCount]) {
+- puts("At EOF");
++ printf("At EOF\n");
+ return(0);
+ }
+ dot = mp;
+@@ -121,6 +128,7 @@
+ /*
+ * Print dot.
+ */
++
+ list[0] = dot - &message[0] + 1;
+ list[1] = NULL;
+ return(type(list));
+@@ -131,22 +139,24 @@
+ * so we can discard when the user quits.
+ */
+ int
+-save(void *v)
++save(v)
++ void *v;
+ {
+ char *str = v;
+
+- return(save1(str, 1, "save", saveignore));
++ return save1(str, 1, "save", saveignore);
+ }
+
+ /*
+ * Copy a message to a file without affected its saved-ness
+ */
+ int
+-copycmd(void *v)
++copycmd(v)
++ void *v;
+ {
+ char *str = v;
+
+- return(save1(str, 0, "copy", saveignore));
++ return save1(str, 0, "copy", saveignore);
+ }
+
+ /*
+@@ -154,15 +164,20 @@
+ * If mark is true, mark the message "saved."
+ */
+ int
+-save1(char *str, int mark, char *cmd, struct ignoretab *ignore)
++save1(str, mark, cmd, ignore)
++ char str[];
++ int mark;
++ char *cmd;
++ struct ignoretab *ignore;
+ {
+- struct message *mp;
++ register int *ip;
++ register struct message *mp;
+ char *file, *disp;
+- int f, *msgvec, *ip;
++ int f, *msgvec;
+ FILE *obuf;
+
+- msgvec = (int *)salloc((msgCount + 2) * sizeof(*msgvec));
+- if ((file = snarf(str, &f)) == NULL)
++ msgvec = (int *) salloc((msgCount + 2) * sizeof *msgvec);
++ if ((file = snarf(str, &f)) == NOSTR)
+ return(1);
+ if (!f) {
+ *msgvec = first(0, MMNORM);
+@@ -174,7 +189,7 @@
+ }
+ if (f && getmsglist(str, msgvec, 0) < 0)
+ return(1);
+- if ((file = expand(file)) == NULL)
++ if ((file = expand(file)) == NOSTR)
+ return(1);
+ printf("\"%s\" ", file);
+ fflush(stdout);
+@@ -183,15 +198,15 @@
+ else
+ disp = "[New file]";
+ if ((obuf = Fopen(file, "a")) == NULL) {
+- warn(NULL);
++ perror(NOSTR);
+ return(1);
+ }
+ for (ip = msgvec; *ip && ip-msgvec < msgCount; ip++) {
+ mp = &message[*ip - 1];
+ touch(mp);
+- if (sendmessage(mp, obuf, ignore, NULL) < 0) {
+- warn("%s", file);
+- (void)Fclose(obuf);
++ if (send(mp, obuf, ignore, NOSTR) < 0) {
++ perror(file);
++ Fclose(obuf);
+ return(1);
+ }
+ if (mark)
+@@ -199,8 +214,8 @@
+ }
+ fflush(obuf);
+ if (ferror(obuf))
+- warn("%s", file);
+- (void)Fclose(obuf);
++ perror(file);
++ Fclose(obuf);
+ printf("%s\n", disp);
+ return(0);
+ }
+@@ -210,25 +225,29 @@
+ * file name, minus header and trailing blank line.
+ */
+ int
+-swrite(void *v)
++swrite(v)
++ void *v;
+ {
+ char *str = v;
+
+- return(save1(str, 1, "write", ignoreall));
++ return save1(str, 1, "write", ignoreall);
+ }
+
+ /*
+ * Snarf the file from the end of the command line and
+ * return a pointer to it. If there is no file attached,
+- * just return NULL. Put a null in front of the file
++ * just return NOSTR. Put a null in front of the file
+ * name so that the message list processing won't see it,
+ * unless the file name is the only thing on the line, in
+ * which case, return 0 in the reference flag variable.
+ */
++
+ char *
+-snarf(char *linebuf, int *flag)
++snarf(linebuf, flag)
++ char linebuf[];
++ int *flag;
+ {
+- char *cp;
++ register char *cp;
+
+ *flag = 1;
+ cp = strlen(linebuf) + linebuf - 1;
+@@ -236,6 +255,7 @@
+ /*
+ * Strip away trailing blanks.
+ */
++
+ while (cp > linebuf && isspace(*cp))
+ cp--;
+ *++cp = 0;
+@@ -243,11 +263,12 @@
+ /*
+ * Now search for the beginning of the file name.
+ */
++
+ while (cp > linebuf && !isspace(*cp))
+ cp--;
+ if (*cp == '\0') {
+- puts("No file specified.");
+- return(NULL);
++ printf("No file specified.\n");
++ return(NOSTR);
+ }
+ if (isspace(*cp))
+ *cp++ = 0;
+@@ -260,19 +281,20 @@
+ * Delete messages.
+ */
+ int
+-delete(void *v)
++delete(v)
++ void *v;
+ {
+ int *msgvec = v;
+-
+ delm(msgvec);
+- return(0);
++ return 0;
+ }
+
+ /*
+ * Delete messages, then type the new dot.
+ */
+ int
+-deltype(void *v)
++deltype(v)
++ void *v;
+ {
+ int *msgvec = v;
+ int list[2];
+@@ -286,9 +308,9 @@
+ list[1] = NULL;
+ return(type(list));
+ }
+- puts("At EOF");
++ printf("At EOF\n");
+ } else
+- puts("No more messages");
++ printf("No more messages\n");
+ return(0);
+ }
+
+@@ -298,10 +320,12 @@
+ * Internal interface.
+ */
+ int
+-delm(int *msgvec)
++delm(msgvec)
++ int *msgvec;
+ {
+- struct message *mp;
+- int *ip, last;
++ register struct message *mp;
++ register *ip;
++ int last;
+
+ last = NULL;
+ for (ip = msgvec; *ip != NULL; ip++) {
+@@ -327,6 +351,7 @@
+ /*
+ * Following can't happen -- it keeps lint happy
+ */
++
+ return(-1);
+ }
+
+@@ -334,11 +359,12 @@
+ * Undelete the indicated messages.
+ */
+ int
+-undeletecmd(void *v)
++undeletecmd(v)
++ void *v;
+ {
+ int *msgvec = v;
+- int *ip;
+- struct message *mp;
++ register struct message *mp;
++ register *ip;
+
+ for (ip = msgvec; *ip && ip-msgvec < msgCount; ip++) {
+ mp = &message[*ip - 1];
+@@ -346,51 +372,53 @@
+ dot = mp;
+ mp->m_flag &= ~MDELETED;
+ }
+- return(0);
++ return 0;
+ }
+
+ /*
+ * Interactively dump core on "core"
+ */
+ int
+-core(void *v)
++core(v)
++ void *v;
+ {
+- pid_t pid;
+- extern int wait_status;
++ int pid;
++ extern union wait wait_status;
+
+ switch (pid = vfork()) {
+ case -1:
+- warn("vfork");
++ perror("fork");
+ return(1);
+ case 0:
+ abort();
+ _exit(1);
+ }
+- fputs("Okie dokie", stdout);
++ printf("Okie dokie");
+ fflush(stdout);
+ wait_child(pid);
+- if (WIFSIGNALED(wait_status) && WCOREDUMP(wait_status))
+- puts(" -- Core dumped.");
++ if (wait_status.w_coredump)
++ printf(" -- Core dumped.\n");
+ else
+- puts(" -- Can't dump core.");
+- return(0);
++ printf(" -- Can't dump core.\n");
++ return 0;
+ }
+
+ /*
+ * Clobber as many bytes of stack as the user requests.
+ */
+ int
+-clobber(void *v)
++clobber(v)
++ void *v;
+ {
+ char **argv = v;
+- int times;
++ register int times;
+
+ if (argv[0] == 0)
+ times = 1;
+ else
+ times = (atoi(argv[0]) + 511) / 512;
+ clob1(times);
+- return(0);
++ return 0;
+ }
+
+ /*
+@@ -401,7 +429,7 @@
+ int n;
+ {
+ char buf[512];
+- char *cp;
++ register char *cp;
+
+ if (n <= 0)
+ return;
+@@ -415,11 +443,12 @@
+ * If no arguments, print the current list of retained fields.
+ */
+ int
+-retfield(void *v)
++retfield(v)
++ void *v;
+ {
+ char **list = v;
+
+- return(ignore1(list, ignore + 1, "retained"));
++ return ignore1(list, ignore + 1, "retained");
+ }
+
+ /*
+@@ -427,89 +456,96 @@
+ * If no arguments, print the current list of ignored fields.
+ */
+ int
+-igfield(void *v)
++igfield(v)
++ void *v;
+ {
+ char **list = v;
+
+- return(ignore1(list, ignore, "ignored"));
++ return ignore1(list, ignore, "ignored");
+ }
+
+ int
+-saveretfield(void *v)
++saveretfield(v)
++ void *v;
+ {
+ char **list = v;
+
+- return(ignore1(list, saveignore + 1, "retained"));
++ return ignore1(list, saveignore + 1, "retained");
+ }
+
+ int
+-saveigfield(void *v)
++saveigfield(v)
++ void *v;
+ {
+ char **list = v;
+
+- return(ignore1(list, saveignore, "ignored"));
++ return ignore1(list, saveignore, "ignored");
+ }
+
+ int
+-ignore1(char **list, struct ignoretab *tab, char *which)
++ignore1(list, tab, which)
++ char *list[];
++ struct ignoretab *tab;
++ char *which;
+ {
+- char field[LINESIZE];
++ char field[BUFSIZ];
++ register int h;
++ register struct ignore *igp;
+ char **ap;
+- struct ignore *igp;
+- int h;
+
+- if (*list == NULL)
+- return(igshow(tab, which));
++ if (*list == NOSTR)
++ return igshow(tab, which);
+ for (ap = list; *ap != 0; ap++) {
+- istrcpy(field, *ap, sizeof(field));
++ istrcpy(field, *ap, BUFSIZ);
++ field[BUFSIZ-1]='\0';
+ if (member(field, tab))
+ continue;
+ h = hash(field);
+- igp = (struct ignore *)calloc(1, sizeof(struct ignore));
+- if (igp == NULL)
+- errx(1, "Out of memory");
+- igp->i_field = strdup(field);
+- if (igp->i_field == NULL)
+- errx(1, "Out of memory");
++ igp = (struct ignore *) calloc(1, sizeof (struct ignore));
++ igp->i_field = calloc((unsigned) strlen(field) + 1,
++ sizeof (char));
++ strcpy(igp->i_field, field);
+ igp->i_link = tab->i_head[h];
+ tab->i_head[h] = igp;
+ tab->i_count++;
+ }
+- return(0);
++ return 0;
+ }
+
+ /*
+ * Print out all currently retained fields.
+ */
+ int
+-igshow(struct ignoretab *tab, char *which)
++igshow(tab, which)
++ struct ignoretab *tab;
++ char *which;
+ {
+- int h;
++ register int h;
+ struct ignore *igp;
+ char **ap, **ring;
+
+ if (tab->i_count == 0) {
+ printf("No fields currently being %s.\n", which);
+- return(0);
++ return 0;
+ }
+- ring = (char **)salloc((tab->i_count + 1) * sizeof(char *));
++ ring = (char **) salloc((tab->i_count + 1) * sizeof (char *));
+ ap = ring;
+ for (h = 0; h < HSHSIZE; h++)
+ for (igp = tab->i_head[h]; igp != 0; igp = igp->i_link)
+ *ap++ = igp->i_field;
+ *ap = 0;
+- qsort(ring, tab->i_count, sizeof(char *), igcomp);
++ qsort(ring, tab->i_count, sizeof (char *), igcomp);
+ for (ap = ring; *ap != 0; ap++)
+- puts(*ap);
+- return(0);
++ printf("%s\n", *ap);
++ return 0;
+ }
+
+ /*
+ * Compare two names for sorting ignored field list.
+ */
+ static int
+-igcomp(const void *l, const void *r)
++igcomp(l, r)
++ const void *l, *r;
+ {
+-
+- return(strcmp(*(char **)l, *(char **)r));
++ return (strcmp(*(char **)l, *(char **)r));
+ }
+diff -urN mailx-8.1.1.orig/cmd3.c mailx-8.1.1/cmd3.c
+--- mailx-8.1.1.orig/cmd3.c 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/cmd3.c 2003-03-26 13:03:39.000000000 -0800
+@@ -1,5 +1,5 @@
+-/* $OpenBSD: cmd3.c,v 1.19 2002/08/12 00:42:56 aaron Exp $ */
+-/* $NetBSD: cmd3.c,v 1.8 1997/07/09 05:29:49 mikel Exp $ */
++/* $OpenBSD: cmd3.c,v 1.5 1996/06/08 19:48:14 christos Exp $ */
++/* $NetBSD: cmd3.c,v 1.5 1996/06/08 19:48:14 christos Exp $ */
+
+ /*
+ * Copyright (c) 1980, 1993
+@@ -36,9 +36,9 @@
+
+ #ifndef lint
+ #if 0
+-static const char sccsid[] = "@(#)cmd3.c 8.2 (Berkeley) 4/20/95";
++static char sccsid[] = "@(#)cmd3.c 8.1 (Berkeley) 6/6/93";
+ #else
+-static const char rcsid[] = "$OpenBSD: cmd3.c,v 1.19 2002/08/12 00:42:56 aaron Exp $";
++static char rcsid[] = "$OpenBSD: cmd3.c,v 1.5 1996/06/08 19:48:14 christos Exp $";
+ #endif
+ #endif /* not lint */
+
+@@ -50,31 +50,31 @@
+ *
+ * Still more user commands.
+ */
+-static int diction(const void *, const void *);
++static int diction __P((const void *, const void *));
+
+ /*
+ * Process a shell escape by saving signals, ignoring signals,
+ * and forking a sh -c
+ */
+ int
+-shell(void *v)
++shell(v)
++ void *v;
+ {
+ char *str = v;
++ sig_t sigint = signal(SIGINT, SIG_IGN);
+ char *shell;
+ char cmd[BUFSIZ];
+- struct sigaction oact;
+- sigset_t oset;
+
+- (void)ignoresig(SIGINT, &oact, &oset);
+- (void)istrcpy(cmd, str, sizeof(cmd));
+- if (bangexp(cmd, sizeof(cmd)) < 0)
+- return(1);
+- shell = value("SHELL");
+- (void)run_command(shell, 0, 0, -1, "-c", cmd, NULL);
+- (void)sigprocmask(SIG_SETMASK, &oset, NULL);
+- (void)sigaction(SIGINT, &oact, NULL);
+- puts("!");
+- return(0);
++ (void) strncpy(cmd, str, BUFSIZ);
++ cmd[BUFSIZ-1]='\0';
++ if (bangexp(cmd, BUFSIZ) < 0)
++ return 1;
++ if ((shell = value("SHELL")) == NOSTR)
++ shell = _PATH_CSHELL;
++ (void) run_command(shell, 0, -1, -1, "-c", cmd, NOSTR);
++ (void) signal(SIGINT, sigint);
++ printf("!\n");
++ return 0;
+ }
+
+ /*
+@@ -82,32 +82,36 @@
+ */
+ /*ARGSUSED*/
+ int
+-dosh(void *v)
++dosh(v)
++ void *v;
+ {
++ sig_t sigint = signal(SIGINT, SIG_IGN);
+ char *shell;
+- struct sigaction oact;
+- sigset_t oset;
+
+- shell = value("SHELL");
+- (void)ignoresig(SIGINT, &oact, &oset);
+- (void)run_command(shell, 0, 0, -1, NULL, NULL, NULL);
+- (void)sigprocmask(SIG_SETMASK, &oset, NULL);
+- (void)sigaction(SIGINT, &oact, NULL);
++ if ((shell = value("SHELL")) == NOSTR)
++ shell = _PATH_CSHELL;
++ (void) run_command(shell, 0, -1, -1, NOSTR, NOSTR, NOSTR);
++ (void) signal(SIGINT, sigint);
+ putchar('\n');
+- return(0);
++ return 0;
+ }
+
+ /*
+ * Expand the shell escape by expanding unescaped !'s into the
+ * last issued command where possible.
+ */
++
++char lastbang[128];
++
+ int
+-bangexp(char *str, size_t strsize)
++bangexp(str, size)
++ char *str;
++ int size;
+ {
+ char bangbuf[BUFSIZ];
+- static char lastbang[BUFSIZ];
+- char *cp, *cp2;
+- int n, changed = 0;
++ register char *cp, *cp2;
++ register int n;
++ int changed = 0;
+
+ cp = str;
+ cp2 = bangbuf;
+@@ -116,11 +120,11 @@
+ if (*cp == '!') {
+ if (n < strlen(lastbang)) {
+ overf:
+- puts("Command buffer overflow");
++ printf("Command buffer overflow\n");
+ return(-1);
+ }
+ changed++;
+- istrcpy(cp2, lastbang, sizeof(bangbuf) - (cp2 - bangbuf));
++ strcpy(cp2, lastbang);
+ cp2 += strlen(lastbang);
+ n -= strlen(lastbang);
+ cp++;
+@@ -139,22 +143,34 @@
+ }
+ *cp2 = 0;
+ if (changed) {
+- (void)printf("!%s\n", bangbuf);
+- (void)fflush(stdout);
++ printf("!%s\n", bangbuf);
++ fflush(stdout);
+ }
+- (void)istrcpy(str, bangbuf, strsize);
+- (void)istrcpy(lastbang, bangbuf, sizeof(lastbang));
++ strncpy(str, bangbuf, size);
++ str[size-1]='\0';
++ strncpy(lastbang, bangbuf, 128);
++ lastbang[127] = 0;
+ return(0);
+ }
+
+ /*
+ * Print out a nice help message from some file or another.
+ */
++
+ int
+-help(void *v)
++help(v)
++ void *v;
+ {
++ register c;
++ register FILE *f;
+
+- (void)run_command(value("PAGER"), 0, -1, -1, _PATH_HELP, NULL);
++ if ((f = Fopen(_PATH_HELP, "r")) == NULL) {
++ perror(_PATH_HELP);
++ return(1);
++ }
++ while ((c = getc(f)) != EOF)
++ putchar(c);
++ Fclose(f);
+ return(0);
+ }
+
+@@ -162,35 +178,33 @@
+ * Change user's working directory.
+ */
+ int
+-schdir(void *v)
++schdir(v)
++ void *v;
+ {
+ char **arglist = v;
+ char *cp;
+
+- if (*arglist == NULL) {
+- if (homedir == NULL)
+- return(1);
++ if (*arglist == NOSTR)
+ cp = homedir;
+- } else {
+- if ((cp = expand(*arglist)) == NULL)
++ else
++ if ((cp = expand(*arglist)) == NOSTR)
+ return(1);
+- }
+ if (chdir(cp) < 0) {
+- warn("%s", cp);
++ perror(cp);
+ return(1);
+ }
+- return(0);
++ return 0;
+ }
+
+ int
+-respond(void *v)
++respond(v)
++ void *v;
+ {
+ int *msgvec = v;
+-
+- if (value("Replyall") == NULL)
+- return(_respond(msgvec));
++ if (value("Replyall") == NOSTR)
++ return (_respond(msgvec));
+ else
+- return(_Respond(msgvec));
++ return (_Respond(msgvec));
+ }
+
+ /*
+@@ -208,20 +222,20 @@
+ struct header head;
+
+ if (msgvec[1] != 0) {
+- puts("Sorry, can't reply to multiple messages at once");
++ printf("Sorry, can't reply to multiple messages at once\n");
+ return(1);
+ }
+ mp = &message[msgvec[0] - 1];
+ touch(mp);
+ dot = mp;
+- if ((rcv = skin(hfield("from", mp))) == NULL)
++ if ((rcv = skin(hfield("from", mp))) == NOSTR)
+ rcv = skin(nameof(mp, 1));
+- if ((replyto = skin(hfield("reply-to", mp))) != NULL)
++ if ((replyto = skin(hfield("reply-to", mp))) != NOSTR)
+ np = extract(replyto, GTO);
+- else if ((cp = skin(hfield("to", mp))) != NULL)
++ else if ((cp = skin(hfield("to", mp))) != NOSTR)
+ np = extract(cp, GTO);
+ else
+- np = NULL;
++ np = NIL;
+ np = elide(np);
+ /*
+ * Delete my name from the reply list,
+@@ -231,18 +245,18 @@
+ if (altnames)
+ for (ap = altnames; *ap; ap++)
+ np = delname(np, *ap);
+- if (np != NULL && replyto == NULL)
++ if (np != NIL && replyto == NOSTR)
+ np = cat(np, extract(rcv, GTO));
+- else if (np == NULL) {
+- if (replyto != NULL)
+- puts("Empty reply-to field -- replying to author");
++ else if (np == NIL) {
++ if (replyto != NOSTR)
++ printf("Empty reply-to field -- replying to author\n");
+ np = extract(rcv, GTO);
+ }
+ head.h_to = np;
+- if ((head.h_subject = hfield("subject", mp)) == NULL)
++ if ((head.h_subject = hfield("subject", mp)) == NOSTR)
+ head.h_subject = hfield("subj", mp);
+ head.h_subject = reedit(head.h_subject);
+- if (replyto == NULL && (cp = skin(hfield("cc", mp))) != NULL) {
++ if (replyto == NOSTR && (cp = skin(hfield("cc", mp))) != NOSTR) {
+ np = elide(extract(cp, GCC));
+ np = delname(np, myname);
+ if (altnames != 0)
+@@ -250,9 +264,9 @@
+ np = delname(np, *ap);
+ head.h_cc = np;
+ } else
+- head.h_cc = NULL;
+- head.h_bcc = NULL;
+- head.h_smopts = NULL;
++ head.h_cc = NIL;
++ head.h_bcc = NIL;
++ head.h_smopts = NIL;
+ mail1(&head, 1);
+ return(0);
+ }
+@@ -262,40 +276,21 @@
+ * it does not already.
+ */
+ char *
+-reedit(char *subj)
++reedit(subj)
++ register char *subj;
+ {
+ char *newsubj;
+- size_t len;
+
+- if (subj == NULL)
+- return(NULL);
++ if (subj == NOSTR)
++ return NOSTR;
+ if ((subj[0] == 'r' || subj[0] == 'R') &&
+ (subj[1] == 'e' || subj[1] == 'E') &&
+ subj[2] == ':')
+- return(subj);
+- len = strlen(subj) + 5;
+- newsubj = salloc(len);
+- istrcpy(newsubj, "Re: ", len);
+- strcat(newsubj, subj);
+- return(newsubj);
+-}
+-
+-/*
+- * Mark new the named messages, so that they will be left in the system
+- * mailbox as unread.
+- */
+-int
+-marknew(void *v)
+-{
+- int *msgvec = v;
+- int *ip;
+-
+- for (ip = msgvec; *ip != NULL; ip++) {
+- dot = &message[*ip-1];
+- dot->m_flag &= ~(MBOX|MREAD|MTOUCH);
+- dot->m_flag |= MNEW|MSTATUS;
+- }
+- return(0);
++ return subj;
++ newsubj = salloc(strlen(subj) + 5);
++ strcpy(newsubj, "Re: ");
++ strcpy(newsubj + 4, subj);
++ return newsubj;
+ }
+
+ /*
+@@ -303,14 +298,15 @@
+ * back to the system mailbox.
+ */
+ int
+-preserve(void *v)
++preserve(v)
++ void *v;
+ {
+ int *msgvec = v;
+- int *ip, mesg;
+- struct message *mp;
++ register struct message *mp;
++ register int *ip, mesg;
+
+ if (edit) {
+- puts("Cannot \"preserve\" in edit mode");
++ printf("Cannot \"preserve\" in edit mode\n");
+ return(1);
+ }
+ for (ip = msgvec; *ip != NULL; ip++) {
+@@ -327,10 +323,11 @@
+ * Mark all given messages as unread.
+ */
+ int
+-unread(void *v)
++unread(v)
++ void *v;
+ {
+- int *msgvec = v;
+- int *ip;
++ int *msgvec = v;
++ register int *ip;
+
+ for (ip = msgvec; *ip != NULL; ip++) {
+ dot = &message[*ip-1];
+@@ -344,16 +341,17 @@
+ * Print the size of each message.
+ */
+ int
+-messize(void *v)
++messize(v)
++ void *v;
+ {
+ int *msgvec = v;
+- struct message *mp;
+- int *ip, mesg;
++ register struct message *mp;
++ register int *ip, mesg;
+
+ for (ip = msgvec; *ip != NULL; ip++) {
+ mesg = *ip;
+ mp = &message[mesg-1];
+- printf("%d: %d/%d\n", mesg, mp->m_lines, mp->m_size);
++ printf("%d: %d/%ld\n", mesg, mp->m_lines, mp->m_size);
+ }
+ return(0);
+ }
+@@ -363,9 +361,9 @@
+ * by returning an error.
+ */
+ int
+-rexit(void *v)
++rexit(v)
++ void *v;
+ {
+-
+ if (sourcing)
+ return(1);
+ exit(0);
+@@ -377,30 +375,31 @@
+ * of csh.
+ */
+ int
+-set(void *v)
++set(v)
++ void *v;
+ {
+ char **arglist = v;
+- struct var *vp;
+- char *cp, *cp2;
++ register struct var *vp;
++ register char *cp, *cp2;
+ char varbuf[BUFSIZ], **ap, **p;
+ int errs, h, s;
+
+- if (*arglist == NULL) {
++ if (*arglist == NOSTR) {
+ for (h = 0, s = 1; h < HSHSIZE; h++)
+- for (vp = variables[h]; vp != NULL; vp = vp->v_link)
++ for (vp = variables[h]; vp != NOVAR; vp = vp->v_link)
+ s++;
+- ap = (char **)salloc(s * sizeof(*ap));
++ ap = (char **) salloc(s * sizeof *ap);
+ for (h = 0, p = ap; h < HSHSIZE; h++)
+- for (vp = variables[h]; vp != NULL; vp = vp->v_link)
++ for (vp = variables[h]; vp != NOVAR; vp = vp->v_link)
+ *p++ = vp->v_name;
+- *p = NULL;
++ *p = NOSTR;
+ sort(ap);
+- for (p = ap; *p != NULL; p++)
++ for (p = ap; *p != NOSTR; p++)
+ printf("%s\t%s\n", *p, value(*p));
+ return(0);
+ }
+ errs = 0;
+- for (ap = arglist; *ap != NULL; ap++) {
++ for (ap = arglist; *ap != NOSTR; ap++) {
+ cp = *ap;
+ cp2 = varbuf;
+ while (*cp != '=' && *cp != '\0')
+@@ -411,7 +410,7 @@
+ else
+ cp++;
+ if (equal(varbuf, "")) {
+- puts("Non-null variable name required");
++ printf("Non-null variable name required\n");
+ errs++;
+ continue;
+ }
+@@ -424,16 +423,17 @@
+ * Unset a bunch of variable values.
+ */
+ int
+-unset(void *v)
++unset(v)
++ void *v;
+ {
+ char **arglist = v;
+- struct var *vp, *vp2;
++ register struct var *vp, *vp2;
+ int errs, h;
+ char **ap;
+
+ errs = 0;
+- for (ap = arglist; *ap != NULL; ap++) {
+- if ((vp2 = lookup(*ap)) == NULL) {
++ for (ap = arglist; *ap != NOSTR; ap++) {
++ if ((vp2 = lookup(*ap)) == NOVAR) {
+ if (!sourcing) {
+ printf("\"%s\": undefined variable\n", *ap);
+ errs++;
+@@ -445,7 +445,7 @@
+ variables[h] = variables[h]->v_link;
+ vfree(vp2->v_name);
+ vfree(vp2->v_value);
+- (void)free(vp2);
++ free((char *)vp2);
+ continue;
+ }
+ for (vp = variables[h]; vp->v_link != vp2; vp = vp->v_link)
+@@ -453,7 +453,7 @@
+ vp->v_link = vp2->v_link;
+ vfree(vp2->v_name);
+ vfree(vp2->v_value);
+- (void)free(vp2);
++ free((char *) vp2);
+ }
+ return(errs);
+ }
+@@ -462,39 +462,40 @@
+ * Put add users to a group.
+ */
+ int
+-group(void *v)
++group(v)
++ void *v;
+ {
+ char **argv = v;
+- struct grouphead *gh;
+- struct group *gp;
++ register struct grouphead *gh;
++ register struct group *gp;
++ register int h;
++ int s;
+ char **ap, *gname, **p;
+- int h, s;
+
+- if (*argv == NULL) {
++ if (*argv == NOSTR) {
+ for (h = 0, s = 1; h < HSHSIZE; h++)
+- for (gh = groups[h]; gh != NULL; gh = gh->g_link)
++ for (gh = groups[h]; gh != NOGRP; gh = gh->g_link)
+ s++;
+- ap = (char **)salloc(s * sizeof(*ap));
++ ap = (char **) salloc(s * sizeof *ap);
+ for (h = 0, p = ap; h < HSHSIZE; h++)
+- for (gh = groups[h]; gh != NULL; gh = gh->g_link)
++ for (gh = groups[h]; gh != NOGRP; gh = gh->g_link)
+ *p++ = gh->g_name;
+- *p = NULL;
++ *p = NOSTR;
+ sort(ap);
+- for (p = ap; *p != NULL; p++)
++ for (p = ap; *p != NOSTR; p++)
+ printgroup(*p);
+ return(0);
+ }
+- if (argv[1] == NULL) {
++ if (argv[1] == NOSTR) {
+ printgroup(*argv);
+ return(0);
+ }
+ gname = *argv;
+ h = hash(gname);
+- if ((gh = findgroup(gname)) == NULL) {
+- if ((gh = (struct grouphead *)calloc(1, sizeof(*gh))) == NULL)
+- errx(1, "Out of memory");
++ if ((gh = findgroup(gname)) == NOGRP) {
++ gh = (struct grouphead *) calloc(sizeof *gh, 1);
+ gh->g_name = vcopy(gname);
+- gh->g_list = NULL;
++ gh->g_list = NOGE;
+ gh->g_link = groups[h];
+ groups[h] = gh;
+ }
+@@ -505,9 +506,8 @@
+ * later anyway.
+ */
+
+- for (ap = argv+1; *ap != NULL; ap++) {
+- if ((gp = (struct group *)calloc(1, sizeof(*gp))) == NULL)
+- errx(1, "Out of memory");
++ for (ap = argv+1; *ap != NOSTR; ap++) {
++ gp = (struct group *) calloc(sizeof *gp, 1);
+ gp->ge_name = vcopy(*ap);
+ gp->ge_link = gh->g_list;
+ gh->g_list = gp;
+@@ -520,11 +520,12 @@
+ * order.
+ */
+ void
+-sort(char **list)
++sort(list)
++ char **list;
+ {
+- char **ap;
++ register char **ap;
+
+- for (ap = list; *ap != NULL; ap++)
++ for (ap = list; *ap != NOSTR; ap++)
+ ;
+ if (ap-list < 2)
+ return;
+@@ -536,21 +537,22 @@
+ * qsort.
+ */
+ static int
+-diction(const void *a, const void *b)
++diction(a, b)
++ const void *a, *b;
+ {
+-
+ return(strcmp(*(char **)a, *(char **)b));
+ }
+
+ /*
+ * The do nothing command for comments.
+ */
++
+ /*ARGSUSED*/
+ int
+-null(void *v)
++null(v)
++ void *v;
+ {
+-
+- return(0);
++ return 0;
+ }
+
+ /*
+@@ -558,51 +560,53 @@
+ * the current file.
+ */
+ int
+-file(void *v)
++file(v)
++ void *v;
+ {
+ char **argv = v;
+
+- if (argv[0] == NULL) {
+- newfileinfo(0);
+- clearnew();
+- return(0);
++ if (argv[0] == NOSTR) {
++ newfileinfo();
++ return 0;
+ }
+ if (setfile(*argv) < 0)
+- return(1);
++ return 1;
+ announce();
+- return(0);
++ return 0;
+ }
+
+ /*
+ * Expand file names like echo
+ */
+ int
+-echo(void *v)
++echo(v)
++ void *v;
+ {
+ char **argv = v;
+- char **ap, *cp;
++ register char **ap;
++ register char *cp;
+
+- for (ap = argv; *ap != NULL; ap++) {
++ for (ap = argv; *ap != NOSTR; ap++) {
+ cp = *ap;
+- if ((cp = expand(cp)) != NULL) {
++ if ((cp = expand(cp)) != NOSTR) {
+ if (ap != argv)
+ putchar(' ');
+- fputs(cp, stdout);
++ printf("%s", cp);
+ }
+ }
+ putchar('\n');
+- return(0);
++ return 0;
+ }
+
+ int
+-Respond(void *v)
++Respond(v)
++ void *v;
+ {
+ int *msgvec = v;
+-
+- if (value("Replyall") == NULL)
+- return(_Respond(msgvec));
++ if (value("Replyall") == NOSTR)
++ return (_Respond(msgvec));
+ else
+- return(_respond(msgvec));
++ return (_respond(msgvec));
+ }
+
+ /*
+@@ -611,33 +615,34 @@
+ * reply.
+ */
+ int
+-_Respond(int *msgvec)
++_Respond(msgvec)
++ int msgvec[];
+ {
+ struct header head;
+ struct message *mp;
+- int *ap;
+- char *cp;
++ register int *ap;
++ register char *cp;
+
+- head.h_to = NULL;
++ head.h_to = NIL;
+ for (ap = msgvec; *ap != 0; ap++) {
+ mp = &message[*ap - 1];
+ touch(mp);
+ dot = mp;
+- if ((cp = skin(hfield("from", mp))) == NULL)
++ if ((cp = skin(hfield("from", mp))) == NOSTR)
+ cp = skin(nameof(mp, 2));
+ head.h_to = cat(head.h_to, extract(cp, GTO));
+ }
+- if (head.h_to == NULL)
+- return(0);
++ if (head.h_to == NIL)
++ return 0;
+ mp = &message[msgvec[0] - 1];
+- if ((head.h_subject = hfield("subject", mp)) == NULL)
++ if ((head.h_subject = hfield("subject", mp)) == NOSTR)
+ head.h_subject = hfield("subj", mp);
+ head.h_subject = reedit(head.h_subject);
+- head.h_cc = NULL;
+- head.h_bcc = NULL;
+- head.h_smopts = NULL;
++ head.h_cc = NIL;
++ head.h_bcc = NIL;
++ head.h_smopts = NIL;
+ mail1(&head, 1);
+- return(0);
++ return 0;
+ }
+
+ /*
+@@ -645,13 +650,14 @@
+ * .mailrc and do some things if sending, others if receiving.
+ */
+ int
+-ifcmd(void *v)
++ifcmd(v)
++ void *v;
+ {
+ char **argv = v;
+- char *cp;
++ register char *cp;
+
+ if (cond != CANY) {
+- puts("Illegal nested \"if\"");
++ printf("Illegal nested \"if\"\n");
+ return(1);
+ }
+ cond = CANY;
+@@ -677,12 +683,13 @@
+ * flip over the conditional flag.
+ */
+ int
+-elsecmd(void *v)
++elsecmd(v)
++ void *v;
+ {
+
+ switch (cond) {
+ case CANY:
+- puts("\"Else\" without matching \"if\"");
++ printf("\"Else\" without matching \"if\"\n");
+ return(1);
+
+ case CSEND:
+@@ -694,7 +701,7 @@
+ break;
+
+ default:
+- puts("mail's idea of conditions is screwed up");
++ printf("Mail's idea of conditions is screwed up\n");
+ cond = CANY;
+ break;
+ }
+@@ -705,11 +712,12 @@
+ * End of if statement. Just set cond back to anything.
+ */
+ int
+-endifcmd(void *v)
++endifcmd(v)
++ void *v;
+ {
+
+ if (cond == CANY) {
+- puts("\"Endif\" without matching \"if\"");
++ printf("\"Endif\" without matching \"if\"\n");
+ return(1);
+ }
+ cond = CANY;
+@@ -720,11 +728,12 @@
+ * Set the list of alternate names.
+ */
+ int
+-alternates(void *v)
++alternates(v)
++ void *v;
+ {
+ char **namelist = v;
+- char **ap, **ap2;
+- int c;
++ register int c;
++ register char **ap, **ap2, *cp;
+
+ c = argcount(namelist) + 1;
+ if (c == 1) {
+@@ -732,16 +741,16 @@
+ return(0);
+ for (ap = altnames; *ap; ap++)
+ printf("%s ", *ap);
+- putchar('\n');
++ printf("\n");
+ return(0);
+ }
+ if (altnames != 0)
+- (void)free(altnames);
+- if ((altnames = (char **)calloc(c, sizeof(char *))) == NULL)
+- errx(1, "Out of memory");
++ free((char *) altnames);
++ altnames = (char **) calloc((unsigned) c, sizeof (char *));
+ for (ap = namelist, ap2 = altnames; *ap; ap++, ap2++) {
+- if ((*ap2 = strdup(*ap)) == NULL)
+- errx(1, "Out of memory");
++ cp = (char *) calloc((unsigned) strlen(*ap) + 1, sizeof (char));
++ strcpy(cp, *ap);
++ *ap2 = cp;
+ }
+ *ap2 = 0;
+ return(0);
+diff -urN mailx-8.1.1.orig/cmdtab.c mailx-8.1.1/cmdtab.c
+--- mailx-8.1.1.orig/cmdtab.c 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/cmdtab.c 1996-06-14 01:26:57.000000000 -0700
+@@ -1,5 +1,5 @@
+-/* $OpenBSD: cmdtab.c,v 1.6 2001/11/21 15:26:39 millert Exp $ */
+-/* $NetBSD: cmdtab.c,v 1.7 1996/12/28 07:10:59 tls Exp $ */
++/* $OpenBSD: cmdtab.c,v 1.6 1996/06/08 19:48:15 christos Exp $ */
++/* $NetBSD: cmdtab.c,v 1.6 1996/06/08 19:48:15 christos Exp $ */
+
+ /*
+ * Copyright (c) 1980, 1993
+@@ -36,9 +36,9 @@
+
+ #ifndef lint
+ #if 0
+-static const char sccsid[] = "@(#)cmdtab.c 8.2 (Berkeley) 4/20/95";
++static char sccsid[] = "@(#)cmdtab.c 8.1 (Berkeley) 6/6/93";
+ #else
+-static const char rcsid[] = "$OpenBSD: cmdtab.c,v 1.6 2001/11/21 15:26:39 millert Exp $";
++static char rcsid[] = "$OpenBSD: cmdtab.c,v 1.6 1996/06/08 19:48:15 christos Exp $";
+ #endif
+ #endif /* not lint */
+
+@@ -50,83 +50,75 @@
+ *
+ * Define all of the command names and bindings.
+ */
++
+ const struct cmd cmdtab[] = {
+- /* msgmask msgflag */
+- /* command function argtype result & mask */
+- /* ------- -------- ------- ------- -------- */
+- { "next", { next }, NDMLIST, 0, MMNDEL },
+- { "alias", { group }, M|RAWLIST, 0, 1000 },
+- { "print", { type }, MSGLIST, 0, MMNDEL },
+- { "type", { type }, MSGLIST, 0, MMNDEL },
+- { "Type", { Type }, MSGLIST, 0, MMNDEL },
+- { "Print", { Type }, MSGLIST, 0, MMNDEL },
+- { "visual", { visual }, I|MSGLIST, 0, MMNORM },
+- { "top", { top }, MSGLIST, 0, MMNDEL },
+- { "touch", { stouch }, W|MSGLIST, 0, MMNDEL },
+- { "preserve", { preserve }, W|MSGLIST, 0, MMNDEL },
+- { "delete", { delete }, W|P|MSGLIST, 0, MMNDEL },
+- { "dp", { deltype }, W|MSGLIST, 0, MMNDEL },
+- { "dt", { deltype }, W|MSGLIST, 0, MMNDEL },
+- { "undelete", { undeletecmd }, P|MSGLIST, MDELETED,MMNDEL },
+- { "unset", { unset }, M|RAWLIST, 1, 1000 },
+- { "mail", { sendmail }, R|M|I|STRLIST, 0, 0 },
+- { "mbox", { mboxit }, W|MSGLIST, 0, 0 },
+- { "pipe", { pipeit }, MSGLIST|STRLIST,0, MMNDEL },
+- { "|", { pipeit }, MSGLIST|STRLIST,0, MMNDEL },
+- { "more", { more }, MSGLIST, 0, MMNDEL },
+- { "page", { more }, MSGLIST, 0, MMNDEL },
+- { "More", { More }, MSGLIST, 0, MMNDEL },
+- { "Page", { More }, MSGLIST, 0, MMNDEL },
+- { "unread", { unread }, MSGLIST, 0, MMNDEL },
+- { "!", { shell }, I|STRLIST, 0, 0 },
+- { "copy", { copycmd }, M|STRLIST, 0, 0 },
+- { "chdir", { schdir }, M|RAWLIST, 0, 1 },
+- { "cd", { schdir }, M|RAWLIST, 0, 1 },
+- { "save", { save }, STRLIST, 0, 0 },
+- { "source", { source }, M|RAWLIST, 1, 1 },
+- { "set", { set }, M|RAWLIST, 0, 1000 },
+- { "shell", { dosh }, I|NOLIST, 0, 0 },
+- { "version", { pversion }, M|NOLIST, 0, 0 },
+- { "group", { group }, M|RAWLIST, 0, 1000 },
+- { "write", { swrite }, STRLIST, 0, 0 },
+- { "from", { from }, MSGLIST, 0, MMNORM },
+- { "file", { file }, T|M|RAWLIST, 0, 1 },
+- { "folder", { file }, T|M|RAWLIST, 0, 1 },
+- { "folders", { folders }, T|M|STRLIST, 0, 0 },
+- { "?", { help }, M|NOLIST, 0, 0 },
+- { "z", { scroll }, M|STRLIST, 0, 0 },
+- { "headers", { headers }, MSGLIST, 0, MMNDEL },
+- { "help", { help }, M|NOLIST, 0, 0 },
+- { "=", { pdot }, NOLIST, 0, 0 },
+- { "Reply", { Respond }, R|I|MSGLIST, 0, MMNDEL },
+- { "Respond", { Respond }, R|I|MSGLIST, 0, MMNDEL },
+- { "reply", { respond }, R|I|MSGLIST, 0, MMNDEL },
+- { "respond", { respond }, R|I|MSGLIST, 0, MMNDEL },
+- { "edit", { editor }, I|MSGLIST, 0, MMNORM },
+- { "echo", { echo }, M|RAWLIST, 0, 1000 },
+- { "quit", { quitcmd }, NOLIST, 0, 0 },
+- { "list", { pcmdlist }, M|NOLIST, 0, 0 },
+- { "xit", { rexit }, M|NOLIST, 0, 0 },
+- { "exit", { rexit }, M|NOLIST, 0, 0 },
+- { "size", { messize }, MSGLIST, 0, MMNDEL },
+- { "hold", { preserve }, W|MSGLIST, 0, MMNDEL },
+- { "if", { ifcmd }, F|M|RAWLIST, 1, 1 },
+- { "else", { elsecmd }, F|M|RAWLIST, 0, 0 },
+- { "endif", { endifcmd }, F|M|RAWLIST, 0, 0 },
+- { "alternates", { alternates }, M|RAWLIST, 0, 1000 },
+- { "ignore", { igfield }, M|RAWLIST, 0, 1000 },
+- { "discard", { igfield }, M|RAWLIST, 0, 1000 },
+- { "retain", { retfield }, M|RAWLIST, 0, 1000 },
+- { "saveignore", { saveigfield }, M|RAWLIST, 0, 1000 },
+- { "savediscard",{ saveigfield }, M|RAWLIST, 0, 1000 },
+- { "saveretain", { saveretfield }, M|RAWLIST, 0, 1000 },
+-#if 0
+- { "Header", { Header }, STRLIST, 0, 1000 },
+-#endif
+- { "core", { core }, M|NOLIST, 0, 0 },
+- { "#", { null }, M|NOLIST, 0, 0 },
+- { "clobber", { clobber }, M|RAWLIST, 0, 1 },
+- { "inc", { inc }, T|NOLIST, 0, 0 },
+- { "new", { marknew }, MSGLIST, 0, MMNDEL },
+- { 0, { 0 }, 0, 0, 0 }
++ { "next", next, NDMLIST, 0, MMNDEL },
++ { "alias", group, M|RAWLIST, 0, 1000 },
++ { "print", type, MSGLIST, 0, MMNDEL },
++ { "type", type, MSGLIST, 0, MMNDEL },
++ { "Type", Type, MSGLIST, 0, MMNDEL },
++ { "Print", Type, MSGLIST, 0, MMNDEL },
++ { "visual", visual, I|MSGLIST, 0, MMNORM },
++ { "top", top, MSGLIST, 0, MMNDEL },
++ { "touch", stouch, W|MSGLIST, 0, MMNDEL },
++ { "preserve", preserve, W|MSGLIST, 0, MMNDEL },
++ { "delete", delete, W|P|MSGLIST, 0, MMNDEL },
++ { "dp", deltype, W|MSGLIST, 0, MMNDEL },
++ { "dt", deltype, W|MSGLIST, 0, MMNDEL },
++ { "undelete", undeletecmd, P|MSGLIST, MDELETED,MMNDEL },
++ { "unset", unset, M|RAWLIST, 1, 1000 },
++ { "mail", sendmail, R|M|I|STRLIST, 0, 0 },
++ { "mbox", mboxit, W|MSGLIST, 0, 0 },
++ { "more", more, MSGLIST, 0, MMNDEL },
++ { "page", more, MSGLIST, 0, MMNDEL },
++ { "More", More, MSGLIST, 0, MMNDEL },
++ { "Page", More, MSGLIST, 0, MMNDEL },
++ { "unread", unread, MSGLIST, 0, MMNDEL },
++ { "!", shell, I|STRLIST, 0, 0 },
++ { "copy", copycmd, M|STRLIST, 0, 0 },
++ { "chdir", schdir, M|RAWLIST, 0, 1 },
++ { "cd", schdir, M|RAWLIST, 0, 1 },
++ { "save", save, STRLIST, 0, 0 },
++ { "source", source, M|RAWLIST, 1, 1 },
++ { "set", set, M|RAWLIST, 0, 1000 },
++ { "shell", dosh, I|NOLIST, 0, 0 },
++ { "version", pversion, M|NOLIST, 0, 0 },
++ { "group", group, M|RAWLIST, 0, 1000 },
++ { "write", swrite, STRLIST, 0, 0 },
++ { "from", from, MSGLIST, 0, MMNORM },
++ { "file", file, T|M|RAWLIST, 0, 1 },
++ { "folder", file, T|M|RAWLIST, 0, 1 },
++ { "folders", folders, T|M|NOLIST, 0, 0 },
++ { "?", help, M|NOLIST, 0, 0 },
++ { "z", scroll, M|STRLIST, 0, 0 },
++ { "headers", headers, MSGLIST, 0, MMNDEL },
++ { "help", help, M|NOLIST, 0, 0 },
++ { "=", pdot, NOLIST, 0, 0 },
++ { "Reply", Respond, R|I|MSGLIST, 0, MMNDEL },
++ { "Respond", Respond, R|I|MSGLIST, 0, MMNDEL },
++ { "reply", respond, R|I|MSGLIST, 0, MMNDEL },
++ { "respond", respond, R|I|MSGLIST, 0, MMNDEL },
++ { "edit", editor, I|MSGLIST, 0, MMNORM },
++ { "echo", echo, M|RAWLIST, 0, 1000 },
++ { "quit", quitcmd, NOLIST, 0, 0 },
++ { "list", pcmdlist, M|NOLIST, 0, 0 },
++ { "xit", rexit, M|NOLIST, 0, 0 },
++ { "exit", rexit, M|NOLIST, 0, 0 },
++ { "size", messize, MSGLIST, 0, MMNDEL },
++ { "hold", preserve, W|MSGLIST, 0, MMNDEL },
++ { "if", ifcmd, F|M|RAWLIST, 1, 1 },
++ { "else", elsecmd, F|M|RAWLIST, 0, 0 },
++ { "endif", endifcmd, F|M|RAWLIST, 0, 0 },
++ { "alternates", alternates, M|RAWLIST, 0, 1000 },
++ { "ignore", igfield, M|RAWLIST, 0, 1000 },
++ { "discard", igfield, M|RAWLIST, 0, 1000 },
++ { "retain", retfield, M|RAWLIST, 0, 1000 },
++ { "saveignore", saveigfield, M|RAWLIST, 0, 1000 },
++ { "savediscard",saveigfield, M|RAWLIST, 0, 1000 },
++ { "saveretain", saveretfield, M|RAWLIST, 0, 1000 },
++/* { "Header", Header, STRLIST, 0, 1000 }, */
++ { "core", core, M|NOLIST, 0, 0 },
++ { "#", null, M|NOLIST, 0, 0 },
++ { "clobber", clobber, M|RAWLIST, 0, 1 },
++ { 0, 0, 0, 0, 0 }
+ };
+diff -urN mailx-8.1.1.orig/collect.c mailx-8.1.1/collect.c
+--- mailx-8.1.1.orig/collect.c 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/collect.c 2003-03-26 13:03:39.000000000 -0800
+@@ -1,5 +1,5 @@
+-/* $OpenBSD: collect.c,v 1.24 2002/04/08 20:27:17 millert Exp $ */
+-/* $NetBSD: collect.c,v 1.9 1997/07/09 05:25:45 mikel Exp $ */
++/* $OpenBSD: collect.c,v 1.6 1996/06/08 19:48:16 christos Exp $ */
++/* $NetBSD: collect.c,v 1.6 1996/06/08 19:48:16 christos Exp $ */
+
+ /*
+ * Copyright (c) 1980, 1993
+@@ -36,9 +36,9 @@
+
+ #ifndef lint
+ #if 0
+-static const char sccsid[] = "@(#)collect.c 8.2 (Berkeley) 4/19/94";
++static char sccsid[] = "@(#)collect.c 8.2 (Berkeley) 4/19/94";
+ #else
+-static const char rcsid[] = "$OpenBSD: collect.c,v 1.24 2002/04/08 20:27:17 millert Exp $";
++static char rcsid[] = "$OpenBSD: collect.c,v 1.6 1996/06/08 19:48:16 christos Exp $";
+ #endif
+ #endif /* not lint */
+
+@@ -52,6 +52,11 @@
+ #include "rcv.h"
+ #include "extern.h"
+
++#ifdef IOSAFE
++/* to interact betzeen interrupt handlers and IO routines in fio.c */
++int got_interrupt;
++
++#endif
+ /*
+ * Read a message from standard output and return a read file to it
+ * or NULL on error.
+@@ -62,37 +67,66 @@
+ * receipt of an interrupt signal, the partial message can be salted
+ * away on dead.letter.
+ */
++
++static sig_t saveint; /* Previous SIGINT value */
++static sig_t savehup; /* Previous SIGHUP value */
++static sig_t savetstp; /* Previous SIGTSTP value */
++static sig_t savettou; /* Previous SIGTTOU value */
++static sig_t savettin; /* Previous SIGTTIN value */
+ static FILE *collf; /* File for saving away */
+ static int hadintr; /* Have seen one SIGINT so far */
+
++static jmp_buf colljmp; /* To get back to work */
++static int colljmp_p; /* whether to long jump */
++static jmp_buf collabort; /* To end collection with error */
++
+ FILE *
+-collect(struct header *hp, int printheaders)
++collect(hp, printheaders)
++ struct header *hp;
++ int printheaders;
+ {
+ FILE *fbuf;
+- int lc, cc, fd, c, t, lastlong, rc, sig;
+- int escape, eofcount, longline;
++ int lc, cc, escape, eofcount;
++ register int c, t;
++ char linebuf[LINESIZE], *cp;
++ extern char *tempMail;
+ char getsub;
+- char linebuf[LINESIZE], tempname[PATHSIZE], *cp;
++ sigset_t oset, nset;
++#if __GNUC__
++ /* Avoid longjmp clobbering */
++ (void) &escape;
++ (void) &eofcount;
++ (void) &getsub;
++#endif
+
+ collf = NULL;
+- eofcount = 0;
+- hadintr = 0;
+- lastlong = 0;
+- longline = 0;
+- if ((cp = value("escape")) != NULL)
+- escape = *cp;
+- else
+- escape = ESCAPE;
+- noreset++;
++ /*
++ * Start catching signals from here, but we're still die on interrupts
++ * until we're in the main loop.
++ */
++ sigemptyset(&nset);
++ sigaddset(&nset, SIGINT);
++ sigaddset(&nset, SIGHUP);
++ sigprocmask(SIG_BLOCK, &nset, &oset);
++ if ((saveint = signal(SIGINT, SIG_IGN)) != SIG_IGN)
++ signal(SIGINT, collint);
++ if ((savehup = signal(SIGHUP, SIG_IGN)) != SIG_IGN)
++ signal(SIGHUP, collhup);
++ savetstp = signal(SIGTSTP, collstop);
++ savettou = signal(SIGTTOU, collstop);
++ savettin = signal(SIGTTIN, collstop);
++ if (setjmp(collabort) || setjmp(colljmp)) {
++ rm(tempMail);
++ goto err;
++ }
++ sigprocmask(SIG_SETMASK, &oset, NULL);
+
+- (void)snprintf(tempname, sizeof(tempname),
+- "%s/mail.RsXXXXXXXXXX", tmpdir);
+- if ((fd = mkstemp(tempname)) == -1 ||
+- (collf = Fdopen(fd, "w+")) == NULL) {
+- warn("%s", tempname);
++ noreset++;
++ if ((collf = Fopen(tempMail, "w+")) == NULL) {
++ perror(tempMail);
+ goto err;
+ }
+- (void)rm(tempname);
++ unlink(tempMail);
+
+ /*
+ * If we are going to prompt for a subject,
+@@ -101,69 +135,68 @@
+ */
+ t = GTO|GSUBJECT|GCC|GNL;
+ getsub = 0;
+- if (hp->h_subject == NULL && value("interactive") != NULL &&
+- (value("ask") != NULL || value("asksub") != NULL))
++ if (hp->h_subject == NOSTR && value("interactive") != NOSTR &&
++ (value("ask") != NOSTR || value("asksub") != NOSTR))
+ t &= ~GNL, getsub++;
+ if (printheaders) {
+ puthead(hp, stdout, t);
+ fflush(stdout);
+ }
+- if (getsub && gethfromtty(hp, GSUBJECT) == -1)
+- goto err;
++ if ((cp = value("escape")) != NOSTR)
++ escape = *cp;
++ else
++ escape = ESCAPE;
++ eofcount = 0;
++ hadintr = 0;
++#ifdef IOSAFE
++ got_interrupt = 0;
++#endif
+
+- if (0) {
++ if (!setjmp(colljmp)) {
++ if (getsub)
++ grabh(hp, GSUBJECT);
++ } else {
++ /*
++ * Come here for printing the after-signal message.
++ * Duplicate messages won't be printed because
++ * the write is aborted if we get a SIGTTOU.
++ */
+ cont:
+- /* Come here for printing the after-suspend message. */
+- if (isatty(0)) {
+- puts("(continue)");
++ if (hadintr) {
++ fflush(stdout);
++ fprintf(stderr,
++ "\n(Interrupt -- one more to kill letter)\n");
++ } else {
++ printf("(continue)\n");
+ fflush(stdout);
+ }
+ }
+ for (;;) {
+- c = readline(stdin, linebuf, LINESIZE, &sig);
+-
+- /* Act on any signal caught during readline() ignoring 'c' */
+- switch (sig) {
+- case 0:
+- break;
+- case SIGINT:
+- if (collabort())
+- goto err;
+- continue;
+- case SIGHUP:
+- rewind(collf);
+- savedeadletter(collf);
+- /*
+- * Let's pretend nobody else wants to clean up,
+- * a true statement at this time.
+- */
+- exit(1);
+- default:
+- /* Stopped due to job control */
+- (void)kill(0, sig);
+- goto cont;
+- }
+-
+- /* No signal, check for error */
++ colljmp_p = 1;
++ c = readline(stdin, linebuf, LINESIZE);
++#ifdef IOSAFE
++ if (got_interrupt) {
++ got_interrupt = 0;
++ longjmp(colljmp,1);
++ }
++#endif
++ colljmp_p = 0;
+ if (c < 0) {
+- if (value("interactive") != NULL &&
+- value("ignoreeof") != NULL && ++eofcount < 25) {
+- puts("Use \".\" to terminate letter");
++ if (value("interactive") != NOSTR &&
++ value("ignoreeof") != NOSTR && ++eofcount < 25) {
++ printf("Use \".\" to terminate letter\n");
+ continue;
+ }
+ break;
+ }
+- lastlong = longline;
+- longline = (c == LINESIZE - 1);
+ eofcount = 0;
+ hadintr = 0;
+ if (linebuf[0] == '.' && linebuf[1] == '\0' &&
+- value("interactive") != NULL && !lastlong &&
+- (value("dot") != NULL || value("ignoreeof") != NULL))
++ value("interactive") != NOSTR &&
++ (value("dot") != NOSTR || value("ignoreeof") != NOSTR))
+ break;
+- if (linebuf[0] != escape || value("interactive") == NULL ||
+- lastlong) {
+- if (putline(collf, linebuf, !longline) < 0)
++ if (linebuf[0] != escape || value("interactive") == NOSTR) {
++ if (putline(collf, linebuf) < 0)
+ goto err;
+ continue;
+ }
+@@ -175,12 +208,12 @@
+ * Otherwise, it's an error.
+ */
+ if (c == escape) {
+- if (putline(collf, &linebuf[1], !longline) < 0)
++ if (putline(collf, &linebuf[1]) < 0)
+ goto err;
+ else
+ break;
+ }
+- puts("Unknown tilde escape.");
++ printf("Unknown tilde escape.\n");
+ break;
+ case 'C':
+ /*
+@@ -213,9 +246,8 @@
+ * Act like an interrupt happened.
+ */
+ hadintr++;
+- collabort();
+- fputs("Interrupt\n", stderr);
+- goto err;
++ collint(SIGINT);
++ exit(1);
+ case 'h':
+ /*
+ * Grab a bunch of headers.
+@@ -250,8 +282,8 @@
+ hp->h_bcc = cat(hp->h_bcc, extract(&linebuf[2], GBCC));
+ break;
+ case 'd':
+- linebuf[2] = '\0';
+- strcat(linebuf, getdeadletter());
++ strncpy(linebuf + 2, getdeadletter(), LINESIZE - 2);
++ linebuf[LINESIZE-1]='\0';
+ /* fall into . . . */
+ case 'r':
+ case '<':
+@@ -264,35 +296,33 @@
+ while (isspace(*cp))
+ cp++;
+ if (*cp == '\0') {
+- puts("Interpolate what file?");
++ printf("Interpolate what file?\n");
+ break;
+ }
+ cp = expand(cp);
+- if (cp == NULL)
++ if (cp == NOSTR)
+ break;
+ if (isdir(cp)) {
+ printf("%s: Directory\n", cp);
+ break;
+ }
+ if ((fbuf = Fopen(cp, "r")) == NULL) {
+- warn("%s", cp);
++ perror(cp);
+ break;
+ }
+ printf("\"%s\" ", cp);
+ fflush(stdout);
+ lc = 0;
+ cc = 0;
+- while ((rc = readline(fbuf, linebuf, LINESIZE, NULL)) >= 0) {
+- if (rc != LINESIZE - 1)
+- lc++;
+- if ((t = putline(collf, linebuf,
+- rc != LINESIZE-1)) < 0) {
+- (void)Fclose(fbuf);
++ while (readline(fbuf, linebuf, LINESIZE) >= 0) {
++ lc++;
++ if ((t = putline(collf, linebuf)) < 0) {
++ Fclose(fbuf);
+ goto err;
+ }
+ cc += t;
+ }
+- (void)Fclose(fbuf);
++ Fclose(fbuf);
+ printf("%d/%d\n", lc, cc);
+ break;
+ case 'w':
+@@ -303,10 +333,10 @@
+ while (*cp == ' ' || *cp == '\t')
+ cp++;
+ if (*cp == '\0') {
+- fputs("Write what file!?\n", stderr);
++ fprintf(stderr, "Write what file!?\n");
+ break;
+ }
+- if ((cp = expand(cp)) == NULL)
++ if ((cp = expand(cp)) == NOSTR)
+ break;
+ rewind(collf);
+ exwrite(cp, collf, 1);
+@@ -321,17 +351,17 @@
+ * standard list processing garbage.
+ * If ~f is given, we don't shift over.
+ */
+- if (forward(linebuf + 2, collf, tempname, c) < 0)
++ if (forward(linebuf + 2, collf, c) < 0)
+ goto err;
+ goto cont;
+ case '?':
+ if ((fbuf = Fopen(_PATH_TILDE, "r")) == NULL) {
+- warn(_PATH_TILDE);
++ perror(_PATH_TILDE);
+ break;
+ }
+ while ((t = getc(fbuf)) != EOF)
+- (void)putchar(t);
+- (void)Fclose(fbuf);
++ (void) putchar(t);
++ Fclose(fbuf);
+ break;
+ case 'p':
+ /*
+@@ -339,10 +369,10 @@
+ * message without altering anything.
+ */
+ rewind(collf);
+- puts("-------\nMessage contains:");
++ printf("-------\nMessage contains:\n");
+ puthead(hp, stdout, GTO|GSUBJECT|GCC|GBCC|GNL);
+ while ((t = getc(collf)) != EOF)
+- (void)putchar(t);
++ (void) putchar(t);
+ goto cont;
+ case '|':
+ /*
+@@ -364,58 +394,62 @@
+ goto cont;
+ }
+ }
+-
+- if (value("interactive") != NULL) {
+- if (value("askcc") != NULL || value("askbcc") != NULL) {
+- if (value("askcc") != NULL) {
+- if (gethfromtty(hp, GCC) == -1)
+- goto err;
+- }
+- if (value("askbcc") != NULL) {
+- if (gethfromtty(hp, GBCC) == -1)
+- goto err;
+- }
+- } else {
+- puts("EOT");
+- (void)fflush(stdout);
+- }
+- }
+ goto out;
+ err:
+ if (collf != NULL) {
+- (void)Fclose(collf);
++ Fclose(collf);
+ collf = NULL;
+ }
+ out:
+ if (collf != NULL)
+ rewind(collf);
+ noreset--;
+- return(collf);
++ sigemptyset(&nset);
++ sigaddset(&nset, SIGINT);
++ sigaddset(&nset, SIGHUP);
++#ifndef OLDBUG
++ sigprocmask(SIG_BLOCK, &nset, NULL);
++#else
++ sigprocmask(SIG_BLOCK, &nset, &oset);
++#endif
++ signal(SIGINT, saveint);
++ signal(SIGHUP, savehup);
++ signal(SIGTSTP, savetstp);
++ signal(SIGTTOU, savettou);
++ signal(SIGTTIN, savettin);
++ sigprocmask(SIG_SETMASK, &oset, NULL);
++ return collf;
+ }
+
+ /*
+ * Write a file, ex-like if f set.
+ */
+ int
+-exwrite(char *name, FILE *fp, int f)
++exwrite(name, fp, f)
++ char name[];
++ FILE *fp;
++ int f;
+ {
+- FILE *of;
+- int c;
+- ssize_t cc, lc;
++ register FILE *of;
++ register int c;
++ long cc;
++ int lc;
+ struct stat junk;
+
+ if (f) {
+ printf("\"%s\" ", name);
+ fflush(stdout);
+ }
+- if (stat(name, &junk) >= 0 && S_ISREG(junk.st_mode)) {
++ if (stat(name, &junk) >= 0 && (junk.st_mode & S_IFMT) == S_IFREG) {
+ if (!f)
+ fprintf(stderr, "%s: ", name);
+- fputs("File exists\n", stderr);
++ fprintf(stderr, "File exists\n");
+ return(-1);
+ }
++ /* FIXME: Fopen with "w" will currently prevent writing to an existig file
++ (/dev/null), for now I am not sure this would even marginally useful to allow */
+ if ((of = Fopen(name, "w")) == NULL) {
+- warn(NULL);
++ perror(NOSTR);
+ return(-1);
+ }
+ lc = 0;
+@@ -424,15 +458,15 @@
+ cc++;
+ if (c == '\n')
+ lc++;
+- (void)putc(c, of);
++ (void) putc(c, of);
+ if (ferror(of)) {
+- warn("%s", name);
+- (void)Fclose(of);
++ perror(name);
++ Fclose(of);
+ return(-1);
+ }
+ }
+- (void)Fclose(of);
+- printf("%d/%d\n", lc, cc);
++ Fclose(of);
++ printf("%d/%ld\n", lc, cc);
+ fflush(stdout);
+ return(0);
+ }
+@@ -442,21 +476,19 @@
+ * On return, make the edit file the new temp file.
+ */
+ void
+-mesedit(FILE *fp, int c)
++mesedit(fp, c)
++ FILE *fp;
++ int c;
+ {
+- FILE *nf;
+- struct sigaction oact;
+- sigset_t oset;
++ sig_t sigint = signal(SIGINT, SIG_IGN);
++ FILE *nf = run_editor(fp, (off_t)-1, c, 0);
+
+- (void)ignoresig(SIGINT, &oact, &oset);
+- nf = run_editor(fp, (off_t)-1, c, 0);
+ if (nf != NULL) {
+ fseek(nf, 0L, 2);
+ collf = nf;
+- (void)Fclose(fp);
++ Fclose(fp);
+ }
+- (void)sigprocmask(SIG_SETMASK, &oset, NULL);
+- (void)sigaction(SIGINT, &oact, NULL);
++ (void) signal(SIGINT, sigint);
+ }
+
+ /*
+@@ -466,47 +498,44 @@
+ * Sh -c must return 0 to accept the new message.
+ */
+ void
+-mespipe(FILE *fp, char *cmd)
++mespipe(fp, cmd)
++ FILE *fp;
++ char cmd[];
+ {
+ FILE *nf;
+- int fd;
+- char *shell, tempname[PATHSIZE];
+- struct sigaction oact;
+- sigset_t oset;
+-
+- (void)ignoresig(SIGINT, &oact, &oset);
+- (void)snprintf(tempname, sizeof(tempname),
+- "%s/mail.ReXXXXXXXXXX", tmpdir);
+- if ((fd = mkstemp(tempname)) == -1 ||
+- (nf = Fdopen(fd, "w+")) == NULL) {
+- warn("%s", tempname);
++ sig_t sigint = signal(SIGINT, SIG_IGN);
++ extern char *tempEdit;
++ char *shell;
++
++ if ((nf = Fopen(tempEdit, "w+")) == NULL) {
++ perror(tempEdit);
+ goto out;
+ }
+- (void)rm(tempname);
++ (void) unlink(tempEdit);
+ /*
+ * stdin = current message.
+ * stdout = new message.
+ */
+- shell = value("SHELL");
++ if ((shell = value("SHELL")) == NOSTR)
++ shell = _PATH_CSHELL;
+ if (run_command(shell,
+- 0, fileno(fp), fileno(nf), "-c", cmd, NULL) < 0) {
+- (void)Fclose(nf);
++ 0, fileno(fp), fileno(nf), "-c", cmd, NOSTR) < 0) {
++ (void) Fclose(nf);
+ goto out;
+ }
+ if (fsize(nf) == 0) {
+ fprintf(stderr, "No bytes from \"%s\" !?\n", cmd);
+- (void)Fclose(nf);
++ (void) Fclose(nf);
+ goto out;
+ }
+ /*
+ * Take new files.
+ */
+- (void)fseek(nf, 0L, 2);
++ (void) fseek(nf, 0L, 2);
+ collf = nf;
+- (void)Fclose(fp);
++ (void) Fclose(fp);
+ out:
+- (void)sigprocmask(SIG_SETMASK, &oset, NULL);
+- (void)sigaction(SIGINT, &oact, NULL);
++ (void) signal(SIGINT, sigint);
+ }
+
+ /*
+@@ -518,80 +547,132 @@
+ * should shift over and 'f' if not.
+ */
+ int
+-forward(char *ms, FILE *fp, char *fn, int f)
++forward(ms, fp, f)
++ char ms[];
++ FILE *fp;
++ int f;
+ {
+- int *msgvec;
++ register int *msgvec;
++ extern char *tempMail;
+ struct ignoretab *ig;
+ char *tabst;
+
+- msgvec = (int *)salloc((msgCount+1) * sizeof(*msgvec));
+- if (msgvec == NULL)
++ msgvec = (int *) salloc((msgCount+1) * sizeof *msgvec);
++ if (msgvec == (int *) NOSTR)
+ return(0);
+ if (getmsglist(ms, msgvec, 0) < 0)
+ return(0);
+ if (*msgvec == 0) {
+ *msgvec = first(0, MMNORM);
+ if (*msgvec == NULL) {
+- puts("No appropriate messages");
++ printf("No appropriate messages\n");
+ return(0);
+ }
+ msgvec[1] = NULL;
+ }
+ if (f == 'f' || f == 'F')
+- tabst = NULL;
+- else if ((tabst = value("indentprefix")) == NULL)
++ tabst = NOSTR;
++ else if ((tabst = value("indentprefix")) == NOSTR)
+ tabst = "\t";
+ ig = isupper(f) ? NULL : ignore;
+- fputs("Interpolating:", stdout);
++ printf("Interpolating:");
+ for (; *msgvec != 0; msgvec++) {
+ struct message *mp = message + *msgvec - 1;
+
+ touch(mp);
+ printf(" %d", *msgvec);
+- if (sendmessage(mp, fp, ig, tabst) < 0) {
+- warn("%s", fn);
++ if (send(mp, fp, ig, tabst) < 0) {
++ perror(tempMail);
+ return(-1);
+ }
+ }
+- putchar('\n');
++ printf("\n");
+ return(0);
+ }
+
+ /*
+- * User aborted during message composition.
+- * Save the partial message in ~/dead.letter.
++ * Print (continue) when continued after ^Z.
+ */
+-int
+-collabort(void)
++/*ARGSUSED*/
++void
++collstop(s)
++ int s;
++{
++ sig_t old_action = signal(s, SIG_DFL);
++ sigset_t nset;
++
++ sigemptyset(&nset);
++ sigaddset(&nset, s);
++ sigprocmask(SIG_UNBLOCK, &nset, NULL);
++ kill(0, s);
++ sigprocmask(SIG_BLOCK, &nset, NULL);
++ signal(s, old_action);
++ if (colljmp_p) {
++ colljmp_p = 0;
++ hadintr = 0;
++#ifdef IOSAFE
++ got_interrupt = s;
++#else
++ longjmp(colljmp, 1);
++#endif
++
++ }
++}
++
++
++/*
++ * On interrupt, come here to save the partial message in ~/dead.letter.
++ * Then jump out of the collection loop.
++ */
++/*ARGSUSED*/
++void
++collint(s)
++ int s;
+ {
+ /*
+ * the control flow is subtle, because we can be called from ~q.
+ */
+- if (hadintr == 0 && isatty(0)) {
+- if (value("ignore") != NULL) {
++ if (!hadintr) {
++ if (value("ignore") != NOSTR) {
+ puts("@");
+ fflush(stdout);
+ clearerr(stdin);
+- } else {
+- fflush(stdout);
+- fputs("\n(Interrupt -- one more to kill letter)\n",
+- stderr);
+- hadintr++;
++ return;
+ }
+- return(0);
++ hadintr = 1;
++#ifdef IOSAFE
++ got_interrupt = s;
++ return;
++#else
++ longjmp(colljmp, 1);
++#endif
+ }
+- fflush(stdout);
+ rewind(collf);
+- if (value("nosave") == NULL)
++ if (value("nosave") == NOSTR)
+ savedeadletter(collf);
+- return(1);
++ longjmp(collabort, 1);
+ }
+
++/*ARGSUSED*/
+ void
+-savedeadletter(FILE *fp)
++collhup(s)
++ int s;
+ {
+- FILE *dbuf;
+- int c;
++ rewind(collf);
++ savedeadletter(collf);
++ /*
++ * Let's pretend nobody else wants to clean up,
++ * a true statement at this time.
++ */
++ exit(1);
++}
++
++void
++savedeadletter(fp)
++ register FILE *fp;
++{
++ register FILE *dbuf;
++ register int c;
+ char *cp;
+
+ if (fsize(fp) == 0)
+@@ -599,23 +680,11 @@
+ cp = getdeadletter();
+ c = umask(077);
+ dbuf = Fopen(cp, "a");
+- (void)umask(c);
++ (void) umask(c);
+ if (dbuf == NULL)
+ return;
+ while ((c = getc(fp)) != EOF)
+- (void)putc(c, dbuf);
+- (void)Fclose(dbuf);
++ (void) putc(c, dbuf);
++ Fclose(dbuf);
+ rewind(fp);
+ }
+-
+-int
+-gethfromtty(struct header *hp, int gflags)
+-{
+-
+- hadintr = 0;
+- while (grabh(hp, gflags) != 0) {
+- if (collabort())
+- return(-1);
+- }
+- return(0);
+-}
+diff -urN mailx-8.1.1.orig/debian/README.debian mailx-8.1.1/debian/README.debian
+--- mailx-8.1.1.orig/debian/README.debian 1969-12-31 16:00:00.000000000 -0800
++++ mailx-8.1.1/debian/README.debian 2003-03-26 13:03:40.000000000 -0800
+@@ -0,0 +1,159 @@
++mailx for DEBIAN
++----------------------
++
++The history of this package is quite complicated. The changelog
++includes a summary with the different maintainers.
++
++At the beginning of debian, I think this package was based on a BSD 5.5 mail version
++from FreeBSD.
++
++There has been a lot on work on the package shipped with Debian
++0.93R6, which was based a BSD 8.1 mail version from BSD4.4Lite. The
++extensions includes support for dotfile locking, setgid support, POP
++support, signal handling hacks.
++
++here is a README originally found:
++ + README for Berkely mailx version 8.1 with POP extension
++ +
++ + This is "mailx", a simple program for sending and receiving email.
++ +
++ + This is based on mailx version 8.1 (as distributed with BSD 4.4lite).
++ +
++ + It has been extended to support the post-office protocol (POP). Run
++ + "mail -p" and it will retrive your email from a POP server rather than
++ + from your local mail queue. See the manual page for more details.
++ +
++ + The POP support was written by Jonathan I. Kamens for version mailx 5.5
++ + (as distributed with BSD 4.3.)
++ +
++ + The POP support was integrated into version 8.1 by Salvatore Valente
++ + for no particular reason. (It would have been simpler for me to
++ + simply use Jonathan's 5.5 source tree. There are no major differences
++ + between the two versions.)
++ +
++ + Have a nice day.
++ + -Salvatore Valente. <svalente@athena.mit.edu>
++ + 5/12/94
++ +
++ +
++ + PORTING
++ +
++ + Before attempting to compile this for _any_ system, you should do two
++ + things:
++ +
++ + Edit CFLAGS in Makefile.
++ + Edit pathnames.h.
++ +
++ + These sources are _extremely_ BSDish. I have successfully built this
++ + for Linux, BSD 4.3, NetBSD, Ultrix, Aix, and SunOS. I have never
++ + successfully gotten it to build for Solaris or any System 5ish system.
++ + If you want to try, here are some issues you will face:
++ +
++ + It uses BSD signal() semantics. Use sigaction().
++ + It uses BSD longjmp() semantics. Use siglongjmp().
++ + It uses BSD sgtty. Use termios.
++ + It uses BSD signal mask functions. Use posix sigmask functions.
++ +
++ + There will probably be other hurdles too. Good luck.
++
++
++With Debian1.1 a switch was done to a version base on a BSD5.5 mail
++program, because of signal handling problems (which I think were due
++to bad compilation options). So no more POP support. Some patches
++from Ken Whang <Kenneth.C.Whang-1@umn.edu> included, the corresponding
++README was:
++ + mailx-5.5-kw 5/30/95
++ +
++ +
++ + WHAT'S IN THIS PATCH
++ +
++ + There are a bunch of little features, common in System V and SunOS
++ + versions of mailx, that are missing from the NetBSD-based version
++ + distributed with Linux. This patch attempts to fill in some of what's
++ + missing.
++ +
++ + Changes from debian mailx-5.5 include:
++ +
++ + 5/4/95:
++ +
++ + -- interpret prompt variable
++ + -- interpret ~a and ~A tilde escapes
++ + -- updated tildehelp list
++ + -- changed mail.rc to ignore nothing (just my personal preference)
++ + -- accept From lines with times of the form hh:mm (formerly took only hh:mm:ss)
++ +
++ + 5/7/95:
++ +
++ + -- Save (S) command saves to mailbox named after author
++ + -- take startup commands from file named by environment variable MAILRC
++ +
++ + 5/30/95:
++ +
++ + -- -H switch for header summary only
++ +
++ + Still to be done:
++ +
++ + -- pipe ~p output through PAGER (see type1 in cmd1.c for an example)
++ + -- save (s) by default to MBOX (instead of "No file specified.")
++ + -- ~q should save to dead.letter, ~x is not known
++ + -- update man page
++ + -- allnet and showto ("showto" shows recipient instead of sender if sender
++ + is current user)
++ +
++ + Possibly difficult:
++ +
++ + -- interpret editheaders variable as in SunOS version
++ +
++ + Bugs:
++ +
++ + -- ~a,~A tilde escapes leave an extra trailing blank on each line
++ + -- to conform to original style, I should really be using char *cp
++ + instead of new variables sig and prompt to be looking up variables
++ + -- -H switch implementation is kind of gross. grep for "hdronly" in
++ + source files; much room for improvement!
++ +
++ +
++ + HOW TO INSTALL
++ +
++ + Apply Sal Valente's debian patch first, so:
++ +
++ + tar xvfz mailx-5.5.tar.gz
++ + cd mailx-5.5
++ + zcat ../mailx-5.5.debian.diff.gz | patch -p1
++ + zcat ../mailx-5.5-kw.diff.gz | patch -p1
++ + make
++ +
++ + Or you may wish to just uncompress the diff file and pick and choose
++ + the changes that you like.
++ +
++ +
++ + AUTHOR
++ +
++ + Ken Whang <Kenneth.C.Whang-1@umn.edu>
++
++This version has no provision for the debian mail policy (permission
++on /var/mail+dotfile locking), so Loic Prylli
++<lprylli@graville.fdn.fr> finally recreate a package based on the OpenBSD
++mail with the minimum number of patches to make it suited for debian
++(see changelog). There is no more POP support, nor the added
++functionality from Ken Whang, but all these patches are archived, so
++mail <lprylli@graville.fdn.fr> if you want them to be incorporated.
++
++
++Loic Prylli <lprylli@graville.fdn.fr>, Mon, 23 Dec 1996 00:13:13 +0100
++
++
++Sat Apr 4 14:05:38 CEST 1998:
++After a security patch to fix tmp races, a number of things broke.
++Here is what I have tried to fix them:
++The rationale is to have all file openings go through safe_open:
++File opened in mode "w", "w+", are created with O_EXCL mode,
++ (should coincide with temporary files or new files)
++Files with "a" "a+" et "r+" mode do not require the O_EXCL files. "a+" et "r+" do not creat the file.
++
++
++Still to do: check creat calls
++
++
++
++
+diff -urN mailx-8.1.1.orig/debian/changelog mailx-8.1.1/debian/changelog
+--- mailx-8.1.1.orig/debian/changelog 1969-12-31 16:00:00.000000000 -0800
++++ mailx-8.1.1/debian/changelog 2003-03-26 13:03:40.000000000 -0800
+@@ -0,0 +1,184 @@
++mailx (1:8.1.1-11) stable; urgency=medium
++
++ * New maintainer.
++ * Upload to stable to fix problems introduced in the last security upgrade:
++ + Use the liblockfile library for mailbox locking (closes: #90446).
++ Patch backported from current sid version of mailx.
++ + Remove bashism from postinst (closes: #89642).
++ * Add Build-Depends field.
++
++ -- Robert Luberda <robert@debian.org> Fri, 30 Mar 2001 21:12:03 +0200
++
++mailx (1:8.1.1-10.1.5) stable; urgency=high
++
++ * Another non-maintainer upload
++ * If suidregister kept mail set mail setgid explain to the admin
++ that that is not a very good idea and offer to change it
++
++ -- Wichert Akkerman <wakkerma@debian.org> Tue, 13 Mar 2001 15:59:55 +0100
++
++mailx (1:8.1.1-10.1.4) stable; urgency=high
++
++ * Another non-maintainer upload
++ * No longer install mailx setgid, the source is just too unsafe
++
++ -- Wichert Akkerman <wakkerma@debian.org> Sat, 10 Mar 2001 00:13:22 +0100
++
++mailx (1:8.1.1-10.1.3) frozen unstable; urgency=high
++
++ * Fix the security fix: only accept a couple environment variables
++ instead of blindly using them all
++
++ -- Wichert Akkerman <wakkerma@debian.org> Tue, 8 Aug 2000 11:42:02 -0700
++
++mailx (1:8.1.1-10.1.2) frozen unstable; urgency=high
++
++ * Another security problem: refuse to get the interactive variable
++ from the environment by explicitly setting it in the hashtable.
++
++ -- Wichert Akkerman <wakkerma@debian.org> Mon, 7 Aug 2000 12:36:10 -0700
++
++mailx (1:8.1.1-10.1.1) frozen unstable; urgency=high
++
++ * NMU to fix RC bug. Now accepts both /var/mail and /var/spool/mail as
++ allowed places for setgid file manipulation. fixes:#64238
++
++ -- Paul Slootman <paul@debian.org> Thu, 8 Jun 2000 19:51:14 +0200
++
++mailx (1:8.1.1-10.1) stable frozen unstable; urgency=high
++
++ * Security fix for a GID=mail shell.
++
++ -- Daniel Jacobowitz <dan@debian.org> Sun, 4 Jun 2000 22:45:19 -0700
++
++mailx (1:8.1.1-10) frozen unstable; urgency=high
++
++ * correct major security flaw, patch from Alvaro Martinez Echevarria
++ <alvaro@lander.es>, bug#23880, bug#23901
++
++ * other potential buffer overflow, patch from Juan-Mariano de Goyeneche
++ <jmseyas@selva.dit.upm.es>, bug #22937
++
++
++ -- Loic Prylli <Loic.Prylli@graville.fdn.fr> Sun, 28 Jun 1998 20:15:18 -0400
++
++mailx (1:8.1.1-9) frozen unstable; urgency=high
++
++ * recompile without the signal handling workarounds (lo
++ that eliminate critical bugs where message parts can be lost
++ (#20798) and (#20558)
++
++ -- Loic Prylli <lprylli@graville.fdn.fr> Thu, 9 Apr 1998 02:11:26 +0200
++
++mailx (1:8.1.1-8) frozen unstable; urgency=high
++
++ * previous patch broke most file accesses, corrected safe_open (#20634)
++ * try to check every access to Fopen, change "a" into "w" for new files,
++ to suit behaviour of safe_open.
++
++ -- Loic Prylli <lprylli@graville.fdn.fr> Sat, 4 Apr 1998 22:01:19 +0200
++
++mailx (1:8.1.1-7) frozen; urgency=medium
++
++ * security fix for tmp races patch from Martin Schulze (#20059)
++
++ -- Loic Prylli <lprylli@graville.fdn.fr> Mon, 23 Mar 1998 22:52:35 +0100
++
++mailx (1:8.1.1-6) unstable; urgency=low
++
++ * convert to debhelper
++ * changelog now compressed (bug#15431)
++ * removed .orig and .rej from source (bug#18409)
++
++ -- Loic Prylli <lprylli@graville.fdn.fr> Sat, 14 Feb 1998 14:34:22 +0100
++
++mailx (1:8.1.1-5) unstable; urgency=low
++
++ * apply David Brown patch so mailx choose the right window size
++ (#12197)
++ * correct Depends: in control file.
++
++ -- Loic Prylli <lprylli@graville.fdn.fr> Sat, 15 Nov 1997 00:30:38 +0100
++
++mailx (1:8.1.1-4) unstable; urgency=high
++
++ * mailx was sending empty message, ignoring user input
++ add clearerr when EAGAIN occur in "IOSAFE" code (#14263)
++
++ -- Loic Prylli <lprylli@graville.fdn.fr> Tue, 11 Nov 1997 20:22:35 +0100
++
++mailx (1:8.1.1-3.1) unstable; urgency=low
++
++ * Non-maintainer release.
++ * Libc6 compile. (#11705)
++ * Install missing symlink to manpage. (#7274)
++
++ -- Martin Mitchell <martin@debian.org> Wed, 29 Oct 1997 04:34:39 +1100
++
++mailx (1:8.1.1-3) unstable; urgency=low
++
++ * add dpkg --assert-working-epoch in preinst bug#6850
++ * add writing of pid in mailbox locking file
++ * fix:mailx was not removing temporary lock files
++
++ -- Loic Prylli <lprylli@graville.fdn.fr> Sat, 1 Feb 1997 11:44:04 +0100
++
++mailx (1:8.1.1-2) unstable; urgency=low
++
++ * correct bug #2733 (occur when no space left) dans quit.c
++ * detection of From_ lines with tring to match the date bug#2010
++ * corrected garble output bug #2284
++
++ -- Loic Prylli <lprylli@graville.fdn.fr> Sat, 28 Dec 1996 15:02:22 +0100
++
++mailx (1:8.1.1-1) unstable; urgency=medium
++
++ * recreate completely starting from OpenBSD mail version (we loose a lot
++ of extension but we have a working program now)
++ * OpenBSD base version is the last one in december 96
++ * rechange the numbering of version, so epoch 1+8.1 is from 4.4BSD, the
++ last upstream digit is to change each time we update to a new openbsd
++ version.
++ * fix the problem of longjmp inside signals inside stdio calls
++ * reincorporate a patch to be dot file locking+setgid safe
++ * some fix in signal handling
++
++ -- Loic Prylli <lprylli@graville.fdn.fr> Mon, 23 Dec 1996 01:57:44 +0100
++
++Mon Apr 29 17:21:42 1996 Sven Rudolph <sr1@inf.tu-dresden.de>
++
++ * releasing 8.5.5-1
++
++ * added symlink /usr/bin/Mail -> /usr/bin/mailx
++
++Thu Apr 25 23:55:36 1996 Sven Rudolph <sr1@inf.tu-dresden.de>
++
++ * set version number to 8.5.5 because it has to superseed 8.1
++
++ * switched back to mailx-5.5-kw (see mailx-5.5-kw.diff.README)
++
++ * no POP support
++
++mailx 8.1 Debian 5 - 10/19/95 Sven Rudolph <sr1@inf.tu-dresden.de>
++* uses now BSD signal emulation (/usr/include/bsd/signal.h)
++* added virtual package names in Depends: and Provides fields (Bug#1460)
++* added Section: field
++* created symlink for mailx manpage (Bug#1114)
++
++mailx 8.1 Debian 4 - 5/20/95 Carl Streeter <streeter@cae.wisc.edu>
++* Added diffs from Delman Lee <delman@mipg.upenn.edu>:
++
++ Hi! I got mailx-8.1-3 from the Linux Debian distribution, and have
++ added a "hold-pop" option to hold messages on the POP server after
++ retrieving them. (Also fixed a minor bug with mailx thinking that there
++ is mail even if the POP mailbox is empty. Code around stat() below.)
++
++mailx 8.1 Debian 3 - 4/18/95 Carl Streeter <streeter@cae.wisc.edu>
++* Fixed control file to depend on smail|sendmail. Updated to latest
++ guidelines
++
++
++
++Local variables:
++mode: debian-changelog
++End:
+diff -urN mailx-8.1.1.orig/debian/conffiles mailx-8.1.1/debian/conffiles
+--- mailx-8.1.1.orig/debian/conffiles 1969-12-31 16:00:00.000000000 -0800
++++ mailx-8.1.1/debian/conffiles 2003-03-26 13:03:40.000000000 -0800
+@@ -0,0 +1 @@
++/etc/mail.rc
+diff -urN mailx-8.1.1.orig/debian/control mailx-8.1.1/debian/control
+--- mailx-8.1.1.orig/debian/control 1969-12-31 16:00:00.000000000 -0800
++++ mailx-8.1.1/debian/control 2003-03-26 13:03:41.000000000 -0800
+@@ -0,0 +1,14 @@
++Source: mailx
++Section: mail
++Priority: important
++Maintainer: Robert Luberda <robert@debian.org>
++Standards-Version: 2.1.1.0
++Build-Depends: debhelper (>= 2), groff, liblockfile-dev
++
++Package: mailx
++Architecture: any
++Depends: ${shlibs:Depends}, smail | mail-transport-agent
++Provides: mail-reader
++Description: A simple mail user agent.
++ mailx is the traditional command-line-mode mail user agent.
++ Even if you don't use it it may be required by other programmes.
+diff -urN mailx-8.1.1.orig/debian/copyright mailx-8.1.1/debian/copyright
+--- mailx-8.1.1.orig/debian/copyright 1969-12-31 16:00:00.000000000 -0800
++++ mailx-8.1.1/debian/copyright 2003-03-26 13:03:41.000000000 -0800
+@@ -0,0 +1,45 @@
++This package was debianized by Loic Prylli lprylli@graville.fdn.fr on
++Mon, 23 Dec 1996 00:13:13 +0100.
++
++It is now based on OpenBSD in directory src/usr.bin/mail on a lot of major ftp sites
++See the debian.README (and changelog) for the complicated history of the debian package
++
++The changes from upstream involve:
++ - because of debian mailbox locking, some code needed to make mail setgid safe
++ - the original code do longjmp in the middle of IO when signals occur,
++ this breaks the Linux libc, so I rewrite some IO loops.
++
++
++Copyright:
++
++ Copyright (c) 1980, 1993
++ The Regents of the University of California. All rights reserved.
++
++ Redistribution and use in source and binary forms, with or without
++ modification, are permitted provided that the following conditions
++ are met:
++ 1. Redistributions of source code must retain the above copyright
++ notice, this list of conditions and the following disclaimer.
++ 2. Redistributions in binary form must reproduce the above copyright
++ notice, this list of conditions and the following disclaimer in the
++ documentation and/or other materials provided with the distribution.
++ 3. All advertising materials mentioning features or use of this software
++ must display the following acknowledgement:
++ This product includes software developed by the University of
++ California, Berkeley and its contributors.
++ 4. Neither the name of the University nor the names of its contributors
++ may be used to endorse or promote products derived from this software
++ without specific prior written permission.
++
++ THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
++ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
++ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ SUCH DAMAGE.
++
+diff -urN mailx-8.1.1.orig/debian/dirs mailx-8.1.1/debian/dirs
+--- mailx-8.1.1.orig/debian/dirs 1969-12-31 16:00:00.000000000 -0800
++++ mailx-8.1.1/debian/dirs 2003-03-26 13:03:41.000000000 -0800
+@@ -0,0 +1,4 @@
++usr/bin
++usr/man/man1
++usr/lib
++etc
+diff -urN mailx-8.1.1.orig/debian/postinst mailx-8.1.1/debian/postinst
+--- mailx-8.1.1.orig/debian/postinst 1969-12-31 16:00:00.000000000 -0800
++++ mailx-8.1.1/debian/postinst 2003-03-26 13:03:41.000000000 -0800
+@@ -0,0 +1,43 @@
++#! /bin/sh
++
++set -e
++
++#DEBHELPER#
++
++[ "$1" = "configure" ] || exit 0
++
++# We only need to ask about removing the setgid bit if the previous version
++# of this package did not ask. This prevents us from asking the same question
++# on every upgrade
++dpkg --compare-versions "$2" ge "1:8.1.1-10.1.5" && exit 0
++
++if [ -g /usr/bin/mail ] ; then
++ echo "Your /usr/bin/mail application is currently setgid mail."
++ echo "This is needed to properly lock your mailbox if you use mail"
++ echo "to read your email. However, mail is not written to be a secure"
++ echo "probably so local users might be able to use it to gain access"
++ echo "to email from other users."
++ echo
++ echo "It is therefore recommended to make mail non-setgid and use"
++ echo "another program like elm or mutt to read email."
++ echo
++ while : ; do
++ echo -n "Should I make this change [Y/n]? "
++ read a
++ if test -z "$a" -o "$a" = "Y" -o "$a" = "y" ; then
++ # Please note we don't check for suidregster presence,
++ # since mail can only still be setgid of suidregister
++ # did that.
++ suidregister -s mailx /usr/bin/mail root root 0755
++ break
++ elif test "$a" = "N" -o "$a" = "n" ; then
++ break
++ fi
++ echo
++ echo "Illegal answer!"
++ echo
++ done
++fi
++
++exit 0
++
+diff -urN mailx-8.1.1.orig/debian/preinst mailx-8.1.1/debian/preinst
+--- mailx-8.1.1.orig/debian/preinst 1969-12-31 16:00:00.000000000 -0800
++++ mailx-8.1.1/debian/preinst 2003-03-26 13:03:41.000000000 -0800
+@@ -0,0 +1,8 @@
++#!/bin/sh
++
++set -e
++
++dpkg --assert-working-epoch 2>/dev/null || {
++ echo -e "\nYou must upgrade dpkg before installing this package.\n"
++ false
++}
+diff -urN mailx-8.1.1.orig/debian/rules mailx-8.1.1/debian/rules
+--- mailx-8.1.1.orig/debian/rules 1969-12-31 16:00:00.000000000 -0800
++++ mailx-8.1.1/debian/rules 2003-03-26 13:03:41.000000000 -0800
+@@ -0,0 +1,83 @@
++#!/usr/bin/make -f
++# Sample debian.rules file - for GNU Hello (1.3).
++# Copyright 1994,1995 by Ian Jackson.
++# I hereby give you perpetual unlimited permission to copy,
++# modify and relicense this file, provided that you do not remove
++# my name from the file itself. (I assert my moral right of
++# paternity under the Copyright, Designs and Patents Act 1988.)
++# This file may have to be extensively modified
++#
++
++package=mailx
++
++CFLAGS=-O2
++CC=gcc
++
++build:
++ dh_testdir
++ make CFLAGS="$(CFLAGS)" CC="$(CC)"
++ cd USD.doc && make
++ touch build
++
++clean:
++ dh_testdir
++ dh_testroot
++ -rm -f build
++ -make clean
++ -rm USD.doc/manual.ps
++ dh_clean
++
++binary-indep: build
++# There are no architecture-independent files to be uploaded
++# generated by this package. If there were any they would be
++# made here.
++
++binary-arch: build
++ dh_testdir
++ dh_testroot
++ dh_clean -k
++ dh_installdirs
++ make install DESTDIR=`pwd`/debian/tmp
++ cd debian/tmp/usr/bin && ln -fs mail mailx
++ cd debian/tmp/usr/bin && ln -fs mail Mail
++# if no debstd, uncomment following lines (taken from Martin Mitchell)
++# install -d debian/tmp/usr/doc/mailx debian/tmp/DEBIAN
++# gzip -9v debian/tmp/usr/man/man1/*
++# cd debian/tmp/usr/man/man1 && ln -fs mail.1.gz mailx.1.gz
++# cd debian/tmp/usr/man/man1 && ln -fs mail.1.gz Mail.1.gz
++# cp debian/changelog debian/README.debian USD.doc/manual.ps debian/tmp/usr/doc/mailx
++# gzip -9v debian/tmp/usr/doc/mailx/*
++# cp debian/copyright debian/tmp/usr/doc/mailx
++# cp debian/{control,conffiles,preinst} debian/tmp/DEBIAN
++# dpkg-shlibdeps debian/tmp/usr/bin/mail
++# Must have debmake installed for this to work. Otherwise please copy
++# /usr/bin/debstd into the debian directory and change debstd to debian/debstd
++ cd debian/tmp/usr/man/man1 && ln -fs mail.1 mailx.1
++ cd debian/tmp/usr/man/man1 && ln -fs mail.1 Mail.1
++ dh_installdocs USD.doc/manual.ps
++# dh_installexamples
++# dh_installmenu
++# dh_installcron
++# dh_installmanpages
++ dh_installchangelogs
++ dh_strip
++ dh_compress
++ dh_fixperms
++ dh_suidregister /usr/bin/mail
++ dh_installdeb
++ dh_shlibdeps
++ dh_gencontrol
++# dh_makeshlibs
++ dh_md5sums
++ dh_builddeb
++
++# Below here is fairly generic really
++
++binary: binary-indep binary-arch
++
++
++.PHONY: binary binary-arch binary-indep clean
++
++# Local Variables:
++# mode: makefile
++# End variables
+diff -urN mailx-8.1.1.orig/def.h mailx-8.1.1/def.h
+--- mailx-8.1.1.orig/def.h 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/def.h 1996-06-14 01:26:58.000000000 -0700
+@@ -1,6 +1,5 @@
+-/* $OpenBSD: def.h,v 1.10 2002/02/16 21:27:48 millert Exp $ */
+-/* $NetBSD: def.h,v 1.9 1996/12/28 07:11:00 tls Exp $ */
+-
++/* $OpenBSD: def.h,v 1.8 1996/06/08 19:48:18 christos Exp $ */
++/* $NetBSD: def.h,v 1.8 1996/06/08 19:48:18 christos Exp $ */
+ /*
+ * Copyright (c) 1980, 1993
+ * The Regents of the University of California. All rights reserved.
+@@ -33,8 +32,8 @@
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+- * @(#)def.h 8.4 (Berkeley) 4/20/95
+- * $OpenBSD: def.h,v 1.10 2002/02/16 21:27:48 millert Exp $
++ * @(#)def.h 8.2 (Berkeley) 3/21/94
++ * $NetBSD: def.h,v 1.8 1996/06/08 19:48:18 christos Exp $
+ */
+
+ /*
+@@ -43,21 +42,17 @@
+ * Author: Kurt Shoens (UCB) March 25, 1978
+ */
+
+-#ifndef MAIL_DEF_H
+-#define MAIL_DEF_H
+-
+ #include <sys/param.h>
+ #include <sys/stat.h>
+ #include <sys/time.h>
+
+-#include <ctype.h>
+-#include <err.h>
+ #include <signal.h>
+-#include <stdio.h>
+-#include <stdlib.h>
+-#include <string.h>
+ #include <termios.h>
+ #include <unistd.h>
++#include <stdlib.h>
++#include <stdio.h>
++#include <ctype.h>
++#include <string.h>
+ #include "pathnames.h"
+
+ #define APPEND /* New mail goes to end of mailbox */
+@@ -69,21 +64,23 @@
+ #define LINESIZE BUFSIZ /* max readable line width */
+ #define STRINGSIZE ((unsigned) 128)/* Dynamic allocation units */
+ #define MAXARGC 1024 /* Maximum list of raw strings */
++#define NOSTR ((char *) 0) /* Null string pointer */
+ #define MAXEXP 25 /* Maximum expansion of aliases */
+
+ #define equal(a, b) (strcmp(a,b)==0)/* A nice function to string compare */
+
+ struct message {
+ short m_flag; /* flags, see below */
+- int m_offset; /* offset in block of message */
+- int m_block; /* block number of this message */
+- int m_size; /* Bytes in the message */
+- int m_lines; /* Lines in the message */
++ short m_block; /* block number of this message */
++ short m_offset; /* offset in block of message */
++ long m_size; /* Bytes in the message */
++ short m_lines; /* Lines in the message */
+ };
+
+ /*
+ * flag bits.
+ */
++
+ #define MUSED (1<<0) /* entry is used, but this bit isn't */
+ #define MDELETED (1<<1) /* entry has been deleted */
+ #define MSAVED (1<<2) /* entry has been saved */
+@@ -110,42 +107,39 @@
+ */
+ struct cmd {
+ char *c_name; /* Name of command */
+- union {
+- int (*c_func0)();
+- int (*c_func1)(void *);
+- int (*c_func2)(void *, void *);
+- } cfunc; /* Implementor of the command */
+-#define c_func cfunc.c_func1
+-#define c_func2 cfunc.c_func2
++ int (*c_func) __P((void *));/* Implementor of the command */
+ short c_argtype; /* Type of arglist (see below) */
+ short c_msgflag; /* Required flags of messages */
+ short c_msgmask; /* Relevant flags of messages */
+ };
+
+ /* Yechh, can't initialize unions */
++
+ #define c_minargs c_msgflag /* Minimum argcount for RAWLIST */
+ #define c_maxargs c_msgmask /* Max argcount for RAWLIST */
+
+ /*
+ * Argument types.
+ */
+-#define MSGLIST 0x0001 /* Message list type */
+-#define STRLIST 0x0002 /* A pure string */
+-#define RAWLIST 0x0004 /* Shell string list */
+-#define NOLIST 0x0008 /* Just plain 0 */
+-#define NDMLIST 0x0010 /* Message list, no defaults */
+-
+-#define P 0x0020 /* Autoprint dot after command */
+-#define I 0x0040 /* Interactive command bit */
+-#define M 0x0080 /* Legal from send mode bit */
+-#define W 0x0100 /* Illegal when read only bit */
+-#define F 0x0200 /* Is a conditional command */
+-#define T 0x0400 /* Is a transparent command */
+-#define R 0x0800 /* Cannot be called from collect */
++
++#define MSGLIST 0 /* Message list type */
++#define STRLIST 1 /* A pure string */
++#define RAWLIST 2 /* Shell string list */
++#define NOLIST 3 /* Just plain 0 */
++#define NDMLIST 4 /* Message list, no defaults */
++
++#define P 040 /* Autoprint dot after command */
++#define I 0100 /* Interactive command bit */
++#define M 0200 /* Legal from send mode bit */
++#define W 0400 /* Illegal when read only bit */
++#define F 01000 /* Is a conditional command */
++#define T 02000 /* Is a transparent command */
++#define R 04000 /* Cannot be called from collect */
+
+ /*
+ * Oft-used mask values
+ */
++
+ #define MMNORM (MDELETED|MSAVED)/* Look at both save and delete bits */
+ #define MMNDEL MDELETED /* Look only at deleted bit */
+
+@@ -153,6 +147,7 @@
+ * Structure used to return a break down of a head
+ * line (hats off to Bill Joy!)
+ */
++
+ struct headline {
+ char *l_from; /* The name of the sender */
+ char *l_tty; /* His tty string (if any) */
+@@ -174,6 +169,7 @@
+ * Structure used to pass about the current
+ * state of the user-typed message header.
+ */
++
+ struct header {
+ struct name *h_to; /* Dynamic "To:" string */
+ char *h_subject; /* Subject string */
+@@ -187,6 +183,7 @@
+ * the recipients of mail and aliases and all that
+ * kind of stuff.
+ */
++
+ struct name {
+ struct name *n_flink; /* Forward link in list. */
+ struct name *n_blink; /* Backward list link */
+@@ -217,6 +214,12 @@
+ struct group *g_list; /* Users in group. */
+ };
+
++#define NIL ((struct name *) 0) /* The nil pointer for namelists */
++#define NONE ((struct cmd *) 0) /* The nil pointer to command tab */
++#define NOVAR ((struct var *) 0) /* The nil pointer to variables */
++#define NOGRP ((struct grouphead *) 0)/* The nil grouphead pointer */
++#define NOGE ((struct group *) 0) /* The nil group pointer */
++
+ /*
+ * Structure of the hash table of ignored header fields
+ */
+@@ -232,6 +235,7 @@
+ * Token values returned by the scanner used for argument lists.
+ * Also, sizes of scanner-related things.
+ */
++
+ #define TEOL 0 /* End of the command line */
+ #define TNUMBER 1 /* A message number */
+ #define TDASH 2 /* A simple dash */
+@@ -249,21 +253,27 @@
+ #define STRINGLEN 1024 /* Maximum length of string token */
+
+ /*
+- * Constants for conditional commands.
+- * These describe whether we should be executing stuff or not.
++ * Constants for conditional commands. These describe whether
++ * we should be executing stuff or not.
+ */
++
+ #define CANY 0 /* Execute in send or receive mode */
+ #define CRCV 1 /* Execute in receive mode only */
+ #define CSEND 2 /* Execute in send mode only */
+
+ /*
++ * Kludges to handle the change from setexit / reset to setjmp / longjmp
++ */
++
++#define setexit() setjmp(srbuf)
++#define reset(x) longjmp(srbuf, x)
++
++/*
+ * Truncate a file to the last character written. This is
+ * useful just before closing an old file that was opened
+ * for read/write.
+ */
+-#define trunc(stream) do { \
++#define trunc(stream) { \
+ (void)fflush(stream); \
+ (void)ftruncate(fileno(stream), (off_t)ftell(stream)); \
+-} while(0)
+-
+-#endif /* MAIL_DEF_H */
++}
+diff -urN mailx-8.1.1.orig/dotlock.c mailx-8.1.1/dotlock.c
+--- mailx-8.1.1.orig/dotlock.c 1969-12-31 16:00:00.000000000 -0800
++++ mailx-8.1.1/dotlock.c 2003-03-26 13:03:39.000000000 -0800
+@@ -0,0 +1,236 @@
++/* $OpenBSD: dotlock.c,v 1.1 1996/06/08 19:48:19 christos Exp $ */
++/* $NetBSD: dotlock.c,v 1.1 1996/06/08 19:48:19 christos Exp $ */
++
++/*
++ * Copyright (c) 1996 Christos Zoulas. All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * 3. All advertising materials mentioning features or use of this software
++ * must display the following acknowledgement:
++ * This product includes software developed by Christos Zoulas.
++ * 4. The name of the author may not be used to endorse or promote products
++ * derived from this software without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++#ifndef lint
++static char rcsid[] = "$OpenBSD: dotlock.c,v 1.1 1996/06/08 19:48:19 christos Exp $";
++#endif
++
++#include <sys/types.h>
++#include <sys/param.h>
++#include <sys/stat.h>
++#include <sys/time.h>
++
++#include <stdio.h>
++#include <string.h>
++#include <fcntl.h>
++#include <stdlib.h>
++#include <unistd.h>
++#include <errno.h>
++#include <signal.h>
++
++#include "extern.h"
++#include "rcv.h"
++
++#ifndef O_SYNC
++#define O_SYNC 0
++#endif
++
++/*
++ * Set the gid if the path is in the normal mail spool
++ */
++static int perhaps_setgid (name, gid)
++char *name;
++gid_t gid;
++{
++ char safelist[] = _PATH_MAILDIR;
++ char *safepath, *p = safelist;
++ int len;
++
++ while ((safepath = strtok(p, ":"))) {
++ p = 0;
++ len = strlen(safepath);
++ if (strncmp (name, safepath, len) == 0 && name[len] == '/')
++ return (setgid (gid));
++ }
++ return 0;
++}
++
++
++static int create_exclusive __P((const char *));
++/*
++ * Create a unique file. O_EXCL does not really work over NFS so we follow
++ * the following trick: [Inspired by S.R. van den Berg]
++ *
++ * - make a mostly unique filename and try to create it.
++ * - link the unique filename to our target
++ * - get the link count of the target
++ * - unlink the mostly unique filename
++ * - if the link count was 2, then we are ok; else we've failed.
++ */
++static int
++create_exclusive(fname)
++ const char *fname;
++{
++ char path[MAXPATHLEN], hostname[MAXHOSTNAMELEN];
++ char apid[40]; /* sufficient for storign 128 bits pids */
++ const char *ptr;
++ struct timeval tv;
++ pid_t pid;
++ size_t ntries, cookie;
++ int fd, serrno, cc;
++ struct stat st;
++
++ (void) gettimeofday(&tv, NULL);
++ (void) gethostname(hostname, MAXHOSTNAMELEN);
++ pid = getpid();
++
++ cookie = pid ^ tv.tv_usec;
++
++ /*
++ * We generate a semi-unique filename, from hostname.(pid ^ usec)
++ */
++ if ((ptr = strrchr(fname, '/')) == NULL)
++ ptr = fname;
++ else
++ ptr++;
++
++ (void) snprintf(path, sizeof(path), "%.*s.%s.%x",
++ ptr - fname, fname, hostname, cookie);
++
++
++ /*
++ * We try to create the unique filename.
++ */
++ for (ntries = 0; ntries < 5; ntries++) {
++ perhaps_setgid(path, effectivegid);
++ fd = open(path, O_WRONLY|O_CREAT|O_TRUNC|O_EXCL|O_SYNC, 0);
++ setgid(realgid);
++ if (fd != -1) {
++ sprintf(apid,"%d",getpid());
++ write(fd, apid, strlen(apid));
++ (void) close(fd);
++ break;
++ }
++ else if (errno == EEXIST)
++ continue;
++ else
++ return -1;
++ }
++ /*
++ * We link the path to the name
++ */
++ perhaps_setgid(fname, effectivegid);
++ cc = link(path, fname);
++ setgid(realgid);
++
++ if (cc == -1)
++ goto bad;
++
++ /*
++ * Note that we stat our own exclusively created name, not the
++ * destination, since the destination can be affected by others.
++ */
++ if (stat(path, &st) == -1)
++ goto bad;
++
++ perhaps_setgid(fname, effectivegid);
++ (void) unlink(path);
++ setgid(realgid);
++
++ /*
++ * If the number of links was two (one for the unique file and one
++ * for the lock), we've won the race
++ */
++ if (st.st_nlink != 2) {
++ errno = EEXIST;
++ return -1;
++ }
++ return 0;
++
++bad:
++ serrno = errno;
++ (void) unlink(path);
++ errno = serrno;
++ return -1;
++}
++
++int
++dot_lock(fname, pollinterval, fp, msg)
++ const char *fname; /* Pathname to lock */
++ int pollinterval; /* Interval to check for lock, -1 return */
++ FILE *fp; /* File to print message */
++ const char *msg; /* Message to print */
++{
++ char path[MAXPATHLEN];
++ sigset_t nset, oset;
++ int i;
++
++ sigemptyset(&nset);
++ sigaddset(&nset, SIGHUP);
++ sigaddset(&nset, SIGINT);
++ sigaddset(&nset, SIGQUIT);
++ sigaddset(&nset, SIGTERM);
++ sigaddset(&nset, SIGTTIN);
++ sigaddset(&nset, SIGTTOU);
++ sigaddset(&nset, SIGTSTP);
++ sigaddset(&nset, SIGCHLD);
++
++ (void) snprintf(path, sizeof(path), "%s.lock", fname);
++
++ for (i=0;i<15;i++) {
++ (void) sigprocmask(SIG_BLOCK, &nset, &oset);
++ if (create_exclusive(path) != -1) {
++ (void) sigprocmask(SIG_SETMASK, &oset, NULL);
++ return 0;
++ }
++ else
++ (void) sigprocmask(SIG_SETMASK, &oset, NULL);
++
++ if (errno != EEXIST)
++ return -1;
++
++ if (fp && msg)
++ (void) fputs(msg, fp);
++
++ if (pollinterval) {
++ if (pollinterval == -1) {
++ errno = EEXIST;
++ return -1;
++ }
++ sleep(pollinterval);
++ }
++ }
++ fprintf(stderr,"%s seems a stale lock? Need to be removed by hand?\n",path);
++ return -1;
++}
++
++void
++dot_unlock(fname)
++ const char *fname;
++{
++ char path[MAXPATHLEN];
++
++ (void) snprintf(path, sizeof(path), "%s.lock", fname);
++ perhaps_setgid(path, effectivegid);
++ (void) unlink(path);
++ setgid(realgid);
++}
+diff -urN mailx-8.1.1.orig/edit.c mailx-8.1.1/edit.c
+--- mailx-8.1.1.orig/edit.c 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/edit.c 2003-03-26 13:03:40.000000000 -0800
+@@ -1,4 +1,4 @@
+-/* $OpenBSD: edit.c,v 1.11 2001/11/21 15:26:39 millert Exp $ */
++/* $OpenBSD: edit.c,v 1.5 1996/06/08 19:48:20 christos Exp $ */
+ /* $NetBSD: edit.c,v 1.5 1996/06/08 19:48:20 christos Exp $ */
+
+ /*
+@@ -36,9 +36,9 @@
+
+ #ifndef lint
+ #if 0
+-static const char sccsid[] = "@(#)edit.c 8.1 (Berkeley) 6/6/93";
++static char sccsid[] = "@(#)edit.c 8.1 (Berkeley) 6/6/93";
+ #else
+-static const char rcsid[] = "$OpenBSD: edit.c,v 1.11 2001/11/21 15:26:39 millert Exp $";
++static char rcsid[] = "$OpenBSD: edit.c,v 1.5 1996/06/08 19:48:20 christos Exp $";
+ #endif
+ #endif /* not lint */
+
+@@ -56,22 +56,24 @@
+ * Edit a message list.
+ */
+ int
+-editor(void *v)
++editor(v)
++ void *v;
+ {
+ int *msgvec = v;
+
+- return(edit1(msgvec, 'e'));
++ return edit1(msgvec, 'e');
+ }
+
+ /*
+ * Invoke the visual editor on a message list.
+ */
+ int
+-visual(void *v)
++visual(v)
++ void *v;
+ {
+ int *msgvec = v;
+
+- return(edit1(msgvec, 'v'));
++ return edit1(msgvec, 'v');
+ }
+
+ /*
+@@ -80,25 +82,28 @@
+ * We get the editor from the stuff above.
+ */
+ int
+-edit1(int *msgvec, int type)
++edit1(msgvec, type)
++ int *msgvec;
++ int type;
+ {
+- int c, i;
++ register int c;
++ int i;
+ FILE *fp;
+- struct sigaction oact;
+- sigset_t oset;
+- struct message *mp;
++ register struct message *mp;
+ off_t size;
+
+ /*
+ * Deal with each message to be edited . . .
+ */
+ for (i = 0; msgvec[i] && i < msgCount; i++) {
++ sig_t sigint;
++
+ if (i > 0) {
+ char buf[100];
+ char *p;
+
+ printf("Edit message %d [ynq]? ", msgvec[i]);
+- if (fgets(buf, sizeof(buf), stdin) == 0)
++ if (fgets(buf, sizeof buf, stdin) == 0)
+ break;
+ for (p = buf; *p == ' ' || *p == '\t'; p++)
+ ;
+@@ -109,10 +114,10 @@
+ }
+ dot = mp = &message[msgvec[i] - 1];
+ touch(mp);
+- (void)ignoresig(SIGINT, &oact, &oset);
++ sigint = signal(SIGINT, SIG_IGN);
+ fp = run_editor(setinput(mp), mp->m_size, type, readonly);
+ if (fp != NULL) {
+- (void)fseek(otf, 0L, 2);
++ (void) fseek(otf, 0L, 2);
+ size = ftell(otf);
+ mp->m_block = blockof(size);
+ mp->m_offset = offsetof(size);
+@@ -127,13 +132,12 @@
+ break;
+ }
+ if (ferror(otf))
+- warn("/tmp");
+- (void)Fclose(fp);
++ perror("/tmp");
++ (void) Fclose(fp);
+ }
+- (void)sigprocmask(SIG_SETMASK, &oset, NULL);
+- (void)sigaction(SIGINT, &oact, NULL);
++ (void) signal(SIGINT, sigint);
+ }
+- return(0);
++ return 0;
+ }
+
+ /*
+@@ -143,55 +147,56 @@
+ * "Type" is 'e' for _PATH_EX, 'v' for _PATH_VI.
+ */
+ FILE *
+-run_editor(FILE *fp, off_t size, int type, int readonly)
++run_editor(fp, size, type, readonly)
++ register FILE *fp;
++ off_t size;
++ int type, readonly;
+ {
+- FILE *nf = NULL;
+- int t;
++ register FILE *nf = NULL;
++ register int t;
+ time_t modtime;
+- char *edit, tempname[PATHSIZE];
++ char *edit;
+ struct stat statb;
++ extern char *tempEdit;
+
+- (void)snprintf(tempname, sizeof(tempname),
+- "%s/mail.ReXXXXXXXXXX", tmpdir);
+- if ((t = mkstemp(tempname)) == -1 ||
+- (nf = Fdopen(t, "w")) == NULL) {
+- warn("%s", tempname);
++ if ((t = open(tempEdit, O_CREAT|O_WRONLY|O_EXCL, readonly ? 0400 : 0600)) < 0) {
++ perror(tempEdit);
+ goto out;
+ }
+- if (readonly && fchmod(t, 0400) == -1) {
+- warn("%s", tempname);
+- (void)rm(tempname);
++ if ((nf = Fdopen(t, "w")) == NULL) {
++ perror(tempEdit);
++ (void) unlink(tempEdit);
+ goto out;
+ }
+ if (size >= 0)
+ while (--size >= 0 && (t = getc(fp)) != EOF)
+- (void)putc(t, nf);
++ (void) putc(t, nf);
+ else
+ while ((t = getc(fp)) != EOF)
+- (void)putc(t, nf);
+- (void)fflush(nf);
++ (void) putc(t, nf);
++ (void) fflush(nf);
+ if (fstat(fileno(nf), &statb) < 0)
+ modtime = 0;
+ else
+ modtime = statb.st_mtime;
+ if (ferror(nf)) {
+- (void)Fclose(nf);
+- warn("%s", tempname);
+- (void)rm(tempname);
++ (void) Fclose(nf);
++ perror(tempEdit);
++ (void) unlink(tempEdit);
+ nf = NULL;
+ goto out;
+ }
+ if (Fclose(nf) < 0) {
+- warn("%s", tempname);
+- (void)rm(tempname);
++ perror(tempEdit);
++ (void) unlink(tempEdit);
+ nf = NULL;
+ goto out;
+ }
+ nf = NULL;
+- if ((edit = value(type == 'e' ? "EDITOR" : "VISUAL")) == NULL)
++ if ((edit = value(type == 'e' ? "EDITOR" : "VISUAL")) == NOSTR)
+ edit = type == 'e' ? _PATH_EX : _PATH_VI;
+- if (run_command(edit, 0, 0, -1, tempname, NULL, NULL) < 0) {
+- (void)rm(tempname);
++ if (run_command(edit, 0, -1, -1, tempEdit, NOSTR, NOSTR) < 0) {
++ (void) unlink(tempEdit);
+ goto out;
+ }
+ /*
+@@ -199,26 +204,26 @@
+ * temporary and return.
+ */
+ if (readonly) {
+- (void)rm(tempname);
++ (void) unlink(tempEdit);
+ goto out;
+ }
+- if (stat(tempname, &statb) < 0) {
+- warn("%s", tempname);
++ if (stat(tempEdit, &statb) < 0) {
++ perror(tempEdit);
+ goto out;
+ }
+ if (modtime == statb.st_mtime) {
+- (void)rm(tempname);
++ (void) unlink(tempEdit);
+ goto out;
+ }
+ /*
+ * Now switch to new file.
+ */
+- if ((nf = Fopen(tempname, "a+")) == NULL) {
+- warn("%s", tempname);
+- (void)rm(tempname);
++ if ((nf = Fopen(tempEdit, "a+")) == NULL) {
++ perror(tempEdit);
++ (void) unlink(tempEdit);
+ goto out;
+ }
+- (void)rm(tempname);
++ (void) unlink(tempEdit);
+ out:
+- return(nf);
++ return nf;
+ }
+diff -urN mailx-8.1.1.orig/extern.h mailx-8.1.1/extern.h
+--- mailx-8.1.1.orig/extern.h 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/extern.h 2003-03-26 13:03:40.000000000 -0800
+@@ -1,5 +1,5 @@
+-/* $OpenBSD: extern.h,v 1.20 2001/11/28 01:26:35 millert Exp $ */
+-/* $NetBSD: extern.h,v 1.7 1997/07/09 05:22:00 mikel Exp $ */
++/* $OpenBSD: extern.h,v 1.4 1996/06/08 19:48:21 christos Exp $ */
++/* $NetBSD: extern.h,v 1.4 1996/06/08 19:48:21 christos Exp $ */
+
+ /*-
+ * Copyright (c) 1992, 1993
+@@ -33,242 +33,233 @@
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+- * @(#)extern.h 8.2 (Berkeley) 4/20/95
+- * $OpenBSD: extern.h,v 1.20 2001/11/28 01:26:35 millert Exp $
++ * @(#)extern.h 8.1 (Berkeley) 6/6/93
++ * $NetBSD: extern.h,v 1.4 1996/06/08 19:48:21 christos Exp $
+ */
+
+ struct name;
+-struct name *cat(struct name *, struct name *);
+-struct name *delname(struct name *, char *);
+-struct name *elide(struct name *);
+-struct name *extract(char *, int);
++struct name *cat __P((struct name *, struct name *));
++struct name *delname __P((struct name *, char []));
++struct name *elide __P((struct name *));
++struct name *extract __P((char [], int));
+ struct grouphead;
+-struct name *gexpand(struct name *, struct grouphead *, int, int);
+-struct name *nalloc(char *, int);
++struct name *gexpand __P((struct name *, struct grouphead *, int, int));
++struct name *nalloc __P((char [], int));
+ struct header;
+-struct name *outof(struct name *, FILE *, struct header *);
+-struct name *put(struct name *, struct name *);
+-struct name *tailof(struct name *);
+-struct name *usermap(struct name *);
+-FILE *Fdopen(int, char *);
+-FILE *Fopen(char *, char *);
+-FILE *Popen(char *, char *);
+-FILE *collect(struct header *, int);
+-char *copy(char *, char *);
+-char *copyin(char *, char **);
+-char *detract(struct name *, int);
+-char *expand(char *);
+-char *getdeadletter(void);
+-char *getname(uid_t);
++struct name *outof __P((struct name *, FILE *, struct header *));
++struct name *put __P((struct name *, struct name *));
++struct name *tailof __P((struct name *));
++struct name *usermap __P((struct name *));
++FILE *safe_fopen __P((char *, char *));
++FILE *Fdopen __P((int, char *));
++FILE *Fopen __P((char *, char *));
++FILE *Popen __P((char *, char *));
++FILE *collect __P((struct header *, int));
++char *copy __P((char *, char *));
++char *copyin __P((char *, char **));
++char *detract __P((struct name *, int));
++char *expand __P((char *));
++char *getdeadletter __P((void));
++char *getname __P((int));
+ struct message;
+-char *hfield(char *, struct message *);
+-FILE *infix(struct header *, FILE *);
+-char *ishfield(char *, char *, char *);
+-char *name1(struct message *, int);
+-char *nameof(struct message *, int);
+-char *nextword(char *, char *);
+-char *readtty(char *, char *);
+-char *reedit(char *);
+-FILE *run_editor(FILE *, off_t, int, int);
+-char *salloc(int);
+-char *savestr(char *);
+-FILE *setinput(struct message *);
+-char *skin(char *);
+-char *skip_comment(char *);
+-char *snarf(char *, int *);
+-char *username(void);
+-char *value(char *);
+-char *vcopy(char *);
+-char *yankword(char *, char *);
+-int Fclose(FILE *);
+-int More(void *);
+-int Pclose(FILE *);
+-int Respond(void *);
+-int Type(void *);
+-int _Respond(int *);
+-int _respond(int *);
+-void alter(char *);
+-int alternates(void *);
+-void announce(void);
+-int append(struct message *, FILE *);
+-int argcount(char **);
+-void assign(char *, char *);
+-int bangexp(char *, size_t);
+-int blankline(char *);
+-int charcount(char *, int);
+-int check(int, int);
+-void clearnew(void);
+-void clob1(int);
+-int clobber(void *);
+-void close_all_files(void);
+-int cmatch(char *, char *);
+-int collabort(void);
+-void commands(void);
+-int copycmd(void *);
+-int core(void *);
+-int count(struct name *);
+-int delete(void *);
+-int delm(int *);
+-int deltype(void *);
+-void demail(void);
+-void dointr(void);
+-int dosh(void *);
+-int dot_lock(const char *, int, FILE *, const char *);
+-void dot_unlock(const char *);
+-int echo(void *);
+-int edit1(int *, int);
+-int editor(void *);
+-int edstop(void);
+-int elsecmd(void *);
+-int endifcmd(void *);
+-int evalcol(int);
+-int execute(char *, int);
+-int exwrite(char *, FILE *, int);
+-void fail(char *, char *);
+-int file(void *);
++char *hfield __P((char [], struct message *));
++FILE *infix __P((struct header *, FILE *));
++char *ishfield __P((char [], char[], char *));
++char *name1 __P((struct message *, int));
++char *nameof __P((struct message *, int));
++char *nextword __P((char *, char *));
++char *readtty __P((char [], char []));
++char *reedit __P((char *));
++FILE *run_editor __P((FILE *, off_t, int, int));
++char *salloc __P((int));
++char *savestr __P((char *));
++FILE *setinput __P((struct message *));
++char *skin __P((char *));
++char *skip_comment __P((char *));
++char *snarf __P((char [], int *));
++char *username __P((void));
++char *value __P((char []));
++char *vcopy __P((char []));
++char *yankword __P((char *, char [], int));
++int Fclose __P((FILE *));
++int More __P((void *));
++int Pclose __P((FILE *));
++int Respond __P((void *));
++int Type __P((void *));
++int _Respond __P((int []));
++int _respond __P((int *));
++void alter __P((char *));
++int alternates __P((void *));
++void announce __P((void));
++int anyof __P((char *, char *));
++int append __P((struct message *, FILE *));
++int argcount __P((char **));
++void assign __P((char [], char []));
++int bangexp __P((char *, int));
++int blankline __P((char []));
++void brokpipe __P((int));
++int charcount __P((char *, int));
++int check __P((int, int));
++void clob1 __P((int));
++int clobber __P((void *));
++void close_all_files __P((void));
++int cmatch __P((char *, char *));
++void collhup __P((int));
++void collint __P((int));
++void collstop __P((int));
++void commands __P((void));
++int copycmd __P((void *));
++int core __P((void *));
++int count __P((struct name *));
++int delete __P((void *));
++int delm __P((int []));
++int deltype __P((void *));
++void demail __P((void));
++int dosh __P((void *));
++int spool_lock __P((const char *));
++int spool_unlock __P((const char *));
++int echo __P((void *));
++int edit1 __P((int *, int));
++int editor __P((void *));
++void edstop __P((void));
++int elsecmd __P((void *));
++int endifcmd __P((void *));
++int evalcol __P((int));
++int execute __P((char [], int));
++int exwrite __P((char [], FILE *, int));
++void fail __P((char [], char []));
++int file __P((void *));
+ struct grouphead *
+- findgroup(char *);
+-void findmail(char *, char *, int);
+-void fioint(int);
+-int first(int, int);
+-void fixhead(struct header *, struct name *);
+-void fmt(char *, struct name *, FILE *, int);
+-int folders(void *);
+-int forward(char *, FILE *, char *, int);
+-void free_child(pid_t);
+-int from(void *);
+-off_t fsize(FILE *);
+-int getfold(char *, int);
+-int gethfield(FILE *, char *, int, char **);
+-int gethfromtty(struct header *, int);
+-int getmsglist(char *, int *, int);
+-int getrawlist(char *, char **, int);
+-uid_t getuserid(char *);
+-int grabh(struct header *, int);
+-int group(void *);
+-int hash(char *);
+-void hdrint(int);
+-int headers(void *);
+-int help(void *);
+-void holdsigs(void);
+-int ifcmd(void *);
+-int igfield(void *);
++ findgroup __P((char []));
++void findmail __P((char *, char *, int));
++int first __P((int, int));
++void fixhead __P((struct header *, struct name *));
++void fmt __P((char *, struct name *, FILE *, int));
++int folders __P((void *));
++int forward __P((char [], FILE *, int));
++void free_child __P((int));
++int from __P((void *));
++off_t fsize __P((FILE *));
++int getfold __P((char *, int));
++int gethfield __P((FILE *, char [], int, char **));
++int getmsglist __P((char *, int *, int));
++int getrawlist __P((char [], char **, int));
++int getuserid __P((char []));
++int grabh __P((struct header *, int));
++int group __P((void *));
++void hangup __P((int));
++int hash __P((char *));
++void hdrstop __P((int));
++int headers __P((void *));
++int help __P((void *));
++void holdsigs __P((void));
++int ifcmd __P((void *));
++int igfield __P((void *));
+ struct ignoretab;
+-int ignore1(char **, struct ignoretab *, char *);
+-int ignoresig(int, struct sigaction *, sigset_t *);
+-int igshow(struct ignoretab *, char *);
+-void intr(int);
+-int inc(void *);
+-int incfile(void);
+-int isdate(char *);
+-int isdir(char *);
+-int isfileaddr(char *);
+-int ishead(char *);
+-int isign(char *, struct ignoretab *);
+-int isprefix(char *, char *);
+-size_t istrlcpy(char *, const char *, size_t);
++int ignore1 __P((char *[], struct ignoretab *, char *));
++int igshow __P((struct ignoretab *, char *));
++void intr __P((int));
++int isdate __P((char []));
++int isdir __P((char []));
++int isfileaddr __P((char *));
++int ishead __P((char []));
++int isign __P((char *, struct ignoretab []));
++int isprefix __P((char *, char *));
++void istrcpy __P((char *, char *, int));
+ const struct cmd *
+- lex(char *);
+-void load(char *);
++ lex __P((char []));
++void load __P((char *));
+ struct var *
+- lookup(char *);
+-int mail (struct name *, struct name *, struct name *, struct name *,
+- char *);
+-void mail1(struct header *, int);
+-void makemessage(FILE *, int);
+-void mark(int);
+-int markall(char *, int);
+-int marknew(void *);
+-int matchsender(char *, int);
+-int matchsubj(char *, int);
+-int mboxit(void *);
+-int member(char *, struct ignoretab *);
+-void mesedit(FILE *, int);
+-void mespipe(FILE *, char *);
+-int messize(void *);
+-int metamess(int, int);
+-int more(void *);
+-int newfileinfo(int);
+-int next(void *);
+-int null(void *);
++ lookup __P((char []));
++int mail __P((struct name *,
++ struct name *, struct name *, struct name *, char *));
++void mail1 __P((struct header *, int));
++void makemessage __P((FILE *));
++void mark __P((int));
++int markall __P((char [], int));
++int matchsender __P((char *, int));
++int matchsubj __P((char *, int));
++int mboxit __P((void *));
++int member __P((char *, struct ignoretab *));
++void mesedit __P((FILE *, int));
++void mespipe __P((FILE *, char []));
++int messize __P((void *));
++int metamess __P((int, int));
++int more __P((void *));
++int newfileinfo __P((void));
++int next __P((void *));
++int null __P((void *));
++void panic __P((const char *, ...))
++ __attribute__((__format__(__printf__,1,2),__noreturn__));
+ struct headline;
+-void parse(char *, struct headline *, char *);
+-int pcmdlist(void *);
+-int pdot(void *);
+-int pipeit(void *, void *);
+-void prepare_child(sigset_t *, int, int);
+-int preserve(void *);
+-void prettyprint(struct name *);
+-void printgroup(char *);
+-void printhead(int);
+-int puthead(struct header *, FILE *, int);
+-int putline(FILE *, char *, int);
+-int pversion(void *);
+-int quit(void);
+-int quitcmd(void *);
+-int raise(int);
+-int readline(FILE *, char *, int, int *);
+-void register_file(FILE *, int, pid_t);
+-void regret(int);
+-void relsesigs(void);
+-int respond(void *);
+-int retfield(void *);
+-int rexit(void *);
+-int rm(char *);
+-int run_command(char *cmd, sigset_t *nset, int infd, int outfd, ...);
+-int save(void *);
+-int save1(char *, int, char *, struct ignoretab *);
+-void savedeadletter(FILE *);
+-int saveigfield(void *);
+-int savemail(char *, FILE *);
+-int saveretfield(void *);
+-int scan(char **);
+-void scaninit(void);
+-int schdir(void *);
+-int screensize(void);
+-int scroll(void *);
+-void sendint(int);
+-int sendmessage(struct message *, FILE *, struct ignoretab *, char *);
+-int sendmail(void *);
+-int set(void *);
+-int setfile(char *);
+-void setmsize(int);
+-void setptr(FILE *, off_t);
+-void setscreensize(void);
+-int shell(void *);
+-void sigchild(int);
+-void sort(char **);
+-int source(void *);
+-int spool_lock(void);
+-int spool_unlock(void);
+-void spreserve(void);
+-void sreset(void);
+-pid_t start_command(char *cmd, sigset_t *nset, int infd, int outfd, ...);
+-pid_t start_commandv(char *, sigset_t *, int, int, __gnuc_va_list);
+-int statusput(struct message *, FILE *, char *);
+-void stop(int);
+-int stouch(void *);
+-int swrite(void *);
+-void tinit(void);
+-int top(void *);
+-void touch(struct message *);
+-void ttyint(int);
+-void ttystop(int);
+-int type(void *);
+-int type1(int *, char *, int, int);
+-int undeletecmd(void *);
+-void unmark(int);
+-char **unpack(struct name *, struct name *);
+-int unread(void *);
+-void unregister_file(FILE *);
+-int unset(void *);
+-int unstack(void);
+-void vfree(char *);
+-int visual(void *);
+-int wait_child(pid_t);
+-int wait_command(int);
+-int writeback(FILE *);
+-
+-extern char *__progname;
+-extern char *tmpdir;
+-extern const struct cmd *com; /* command we are running */
++void parse __P((char [], struct headline *, char []));
++int pcmdlist __P((void *));
++int pdot __P((void *));
++void prepare_child __P((sigset_t *, int, int));
++int preserve __P((void *));
++void prettyprint __P((struct name *));
++void printgroup __P((char []));
++void printhead __P((int));
++int puthead __P((struct header *, FILE *, int));
++int putline __P((FILE *, char *));
++int pversion __P((void *));
++void quit __P((void));
++int quitcmd __P((void *));
++int raise __P((int));
++int readline __P((FILE *, char *, int));
++void register_file __P((FILE *, int, int));
++void regret __P((int));
++void relsesigs __P((void));
++int respond __P((void *));
++int retfield __P((void *));
++int rexit __P((void *));
++int rm __P((char *));
++int run_command __P((char *, sigset_t *, int, int, char *, char *, char *));
++int save __P((void *));
++int save1 __P((char [], int, char *, struct ignoretab *));
++void savedeadletter __P((FILE *));
++int saveigfield __P((void *));
++int savemail __P((char [], FILE *));
++int saveretfield __P((void *));
++int scan __P((char **));
++void scaninit __P((void));
++int schdir __P((void *));
++int screensize __P((void));
++int scroll __P((void *));
++int send __P((struct message *, FILE *, struct ignoretab *, char *));
++int sendmail __P((void *));
++int set __P((void *));
++int setfile __P((char *));
++void setmsize __P((int));
++void setptr __P((FILE *));
++void setscreensize __P((void));
++int shell __P((void *));
++void sigchild __P((int));
++void sort __P((char **));
++int source __P((void *));
++void spreserve __P((void));
++void sreset __P((void));
++int start_command __P((char *, sigset_t *, int, int, char *, char *, char *));
++void statusput __P((struct message *, FILE *, char *));
++void stop __P((int));
++int stouch __P((void *));
++int swrite __P((void *));
++void tinit __P((void));
++int top __P((void *));
++void touch __P((struct message *));
++void ttyint __P((int));
++void ttystop __P((int));
++int type __P((void *));
++int type1 __P((int *, int, int));
++int undeletecmd __P((void *));
++void unmark __P((int));
++char **unpack __P((struct name *));
++int unread __P((void *));
++void unregister_file __P((FILE *));
++int unset __P((void *));
++int unstack __P((void));
++void vfree __P((char *));
++int visual __P((void *));
++int wait_child __P((int));
++int wait_command __P((int));
++int writeback __P((FILE *));
+diff -urN mailx-8.1.1.orig/fio.c mailx-8.1.1/fio.c
+--- mailx-8.1.1.orig/fio.c 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/fio.c 2003-03-26 13:03:40.000000000 -0800
+@@ -1,5 +1,5 @@
+-/* $OpenBSD: fio.c,v 1.22 2002/03/14 06:51:42 mpech Exp $ */
+-/* $NetBSD: fio.c,v 1.8 1997/07/07 22:57:55 phil Exp $ */
++/* $OpenBSD: fio.c,v 1.5 1996/06/08 19:48:22 christos Exp $ */
++/* $NetBSD: fio.c,v 1.5 1996/06/08 19:48:22 christos Exp $ */
+
+ /*
+ * Copyright (c) 1980, 1993
+@@ -36,9 +36,9 @@
+
+ #ifndef lint
+ #if 0
+-static const char sccsid[] = "@(#)fio.c 8.2 (Berkeley) 4/20/95";
++static char sccsid[] = "@(#)fio.c 8.1 (Berkeley) 6/6/93";
+ #else
+-static const char rcsid[] = "$OpenBSD: fio.c,v 1.22 2002/03/14 06:51:42 mpech Exp $";
++static char rcsid[] = "$OpenBSD: fio.c,v 1.5 1996/06/08 19:48:22 christos Exp $";
+ #endif
+ #endif /* not lint */
+
+@@ -57,88 +57,62 @@
+ * File I/O.
+ */
+
+-static volatile sig_atomic_t fiosignal;
+-
+-/*
+- * Wrapper for read() to catch EINTR.
+- */
+-ssize_t
+-myread(int fd, char *buf, int len)
+-{
+- ssize_t nread;
+-
+- while ((nread = read(fd, buf, len)) == -1 && errno == EINTR)
+- ;
+- return(nread);
+-}
+-
+ /*
+ * Set up the input pointers while copying the mail file into /tmp.
+ */
+ void
+-setptr(FILE *ibuf, off_t offset)
++setptr(ibuf)
++ register FILE *ibuf;
+ {
+- int c, count;
+- char *cp, *cp2;
++ extern char *tmpdir;
++ register int c, count;
++ register char *cp, *cp2;
+ struct message this;
+ FILE *mestmp;
+- int maybe, inhead, omsgCount;
+- char linebuf[LINESIZE], pathbuf[PATHSIZE];
++ off_t offset;
++ int maybe, inhead;
++ char linebuf[LINESIZE];
+
+ /* Get temporary file. */
+- (void)snprintf(pathbuf, sizeof(pathbuf), "%s/mail.XXXXXXXXXX", tmpdir);
+- if ((c = mkstemp(pathbuf)) == -1 || (mestmp = Fdopen(c, "r+")) == NULL)
+- err(1, "can't open %s", pathbuf);
+- (void)rm(pathbuf);
+-
+- if (offset == 0) {
+- msgCount = 0;
+- } else {
+- /* Seek into the file to get to the new messages */
+- (void)fseek(ibuf, offset, 0);
+- /*
+- * We need to make "offset" a pointer to the end of
+- * the temp file that has the copy of the mail file.
+- * If any messages have been edited, this will be
+- * different from the offset into the mail file.
+- */
+- (void)fseek(otf, 0L, SEEK_END);
+- offset = ftell(otf);
++ (void)snprintf(linebuf,LINESIZE,"%s/mail.XXXXXX", tmpdir);
++ if ((c = mkstemp(linebuf)) == -1 ||
++ (mestmp = Fdopen(c, "r+")) == NULL) {
++ (void)fprintf(stderr, "mail: can't open %s\n", linebuf);
++ exit(1);
+ }
+- omsgCount = msgCount;
++ (void)unlink(linebuf);
++
++ msgCount = 0;
+ maybe = 1;
+ inhead = 0;
++ offset = 0;
+ this.m_flag = MUSED|MNEW;
+ this.m_size = 0;
+ this.m_lines = 0;
+ this.m_block = 0;
+ this.m_offset = 0;
+ for (;;) {
+- if (fgets(linebuf, sizeof(linebuf), ibuf) == NULL) {
+- if (append(&this, mestmp))
+- err(1, "temporary file");
+- makemessage(mestmp, omsgCount);
++ if (fgets(linebuf, LINESIZE, ibuf) == NULL) {
++ if (append(&this, mestmp)) {
++ perror("temporary file");
++ exit(1);
++ }
++ makemessage(mestmp);
+ return;
+ }
+ count = strlen(linebuf);
+- /*
+- * Transforms lines ending in <CR><LF> to just <LF>.
+- * This allows mail to be able to read Eudora mailboxes
+- * that reside on a DOS partition.
+- */
+- if (count >= 2 && linebuf[count-1] == '\n' &&
+- linebuf[count - 2] == '\r')
+- linebuf[count - 2] = linebuf[--count];
+-
+- (void)fwrite(linebuf, sizeof(*linebuf), count, otf);
+- if (ferror(otf))
+- err(1, "/tmp");
+- if (count)
+- linebuf[count - 1] = '\0';
++ (void) fwrite(linebuf, sizeof *linebuf, count, otf);
++ if (ferror(otf)) {
++ perror("/tmp");
++ exit(1);
++ }
++ linebuf[count - 1] = 0;
+ if (maybe && linebuf[0] == 'F' && ishead(linebuf)) {
+ msgCount++;
+- if (append(&this, mestmp))
+- err(1, "temporary file");
++ if (append(&this, mestmp)) {
++ perror("temporary file");
++ exit(1);
++ }
+ this.m_flag = MUSED|MNEW;
+ this.m_size = 0;
+ this.m_lines = 0;
+@@ -176,88 +150,83 @@
+ /*
+ * Drop the passed line onto the passed output buffer.
+ * If a write error occurs, return -1, else the count of
+- * characters written, including the newline if requested.
++ * characters written, including the newline.
+ */
+ int
+-putline(FILE *obuf, char *linebuf, int outlf)
++putline(obuf, linebuf)
++ FILE *obuf;
++ char *linebuf;
+ {
+- int c;
++ register int c;
+
+ c = strlen(linebuf);
+- (void)fwrite(linebuf, sizeof(*linebuf), c, obuf);
+- if (outlf) {
+- (void)putc('\n', obuf);
+- c++;
+- }
++ (void) fwrite(linebuf, sizeof *linebuf, c, obuf);
++ (void) putc('\n', obuf);
+ if (ferror(obuf))
+- return(-1);
+- return(c);
++ return (-1);
++ return (c + 1);
+ }
+
+ /*
+ * Read up a line from the specified input into the line
+ * buffer. Return the number of characters read. Do not
+- * include the newline (or carriage return) at the end.
++ * include the newline at the end.
+ */
+ int
+-readline(FILE *ibuf, char *linebuf, int linesize, int *signo)
++readline(ibuf, linebuf, linesize)
++ FILE *ibuf;
++ char *linebuf;
++ int linesize;
+ {
+- struct sigaction act;
+- struct sigaction savetstp;
+- struct sigaction savettou;
+- struct sigaction savettin;
+- struct sigaction saveint;
+- struct sigaction savehup;
+- sigset_t oset;
+- int n;
+-
+- /*
+- * Setup signal handlers if the caller asked us to catch signals.
+- * Note that we do not restart system calls since we need the
+- * read to be interuptible.
+- */
+- if (signo) {
+- fiosignal = 0;
+- sigemptyset(&act.sa_mask);
+- act.sa_flags = 0;
+- act.sa_handler = fioint;
+- if (sigaction(SIGINT, NULL, &saveint) == 0 &&
+- saveint.sa_handler != SIG_IGN) {
+- (void)sigaction(SIGINT, &act, &saveint);
+- (void)sigprocmask(SIG_UNBLOCK, &intset, &oset);
+- }
+- if (sigaction(SIGHUP, NULL, &savehup) == 0 &&
+- savehup.sa_handler != SIG_IGN)
+- (void)sigaction(SIGHUP, &act, &savehup);
+- (void)sigaction(SIGTSTP, &act, &savetstp);
+- (void)sigaction(SIGTTOU, &act, &savettou);
+- (void)sigaction(SIGTTIN, &act, &savettin);
+- }
+-
++ register int n,oldfl;
++ char *res;
+ clearerr(ibuf);
+- if (fgets(linebuf, linesize, ibuf) == NULL) {
+- if (ferror(ibuf))
+- clearerr(ibuf);
+- n = -1;
+- } else {
+- n = strlen(linebuf);
+- if (n > 0 && linebuf[n - 1] == '\n')
+- linebuf[--n] = '\0';
+- if (n > 0 && linebuf[n - 1] == '\r')
+- linebuf[--n] = '\0';
+- }
+-
+- if (signo) {
+- (void)sigprocmask(SIG_SETMASK, &oset, NULL);
+- (void)sigaction(SIGINT, &saveint, NULL);
+- (void)sigaction(SIGHUP, &savehup, NULL);
+- (void)sigaction(SIGTSTP, &savetstp, NULL);
+- (void)sigaction(SIGTTOU, &savettou, NULL);
+- (void)sigaction(SIGTTIN, &savettin, NULL);
+- *signo = fiosignal;
+- }
+-
+- return(n);
++#ifdef IOSAFE
++ /* we want to be able to get interrupts while waiting user-input
++ we cannot to safely inside a stdio call, so we first ensure there
++ is now data in the stdio buffer by doing the stdio call with the descriptor
++ in non-blocking state and then do a select.
++ Hope it is safe (the libc should not break on a EAGAIN)
++ lprylli@graville.fdn.fr*/
++ n = 0; /* number of caracters already read */
++ while (n < linesize - 1) {
++ errno = 0;
++ oldfl = fcntl(fileno(ibuf),F_GETFL);
++ fcntl(fileno(ibuf),F_SETFL,oldfl | O_NONBLOCK);
++ res = fgets(linebuf + n, linesize-n, ibuf);
++ fcntl(fileno(ibuf),F_SETFL,oldfl);
++ if (res != NULL) {
++ n = strlen(linebuf);
++ if (n > 0 && linebuf[n-1] == '\n')
++ break;
++ } else if (errno == EAGAIN || errno == EWOULDBLOCK) {
++ clearerr(ibuf);
++ } else {
++ /* probably EOF one the file descriptors */
++ if (n > 0)
++ break;
++ else
++ return -1;
++
++ }{
++ extern int got_interrupt;
++ fd_set rds;
++ FD_ZERO(&rds);
++ FD_SET(fileno(ibuf),&rds);
++ select(fileno(ibuf)+1,&rds,NULL,NULL,NULL);
++ /* if an interrupt occur drops the current line and returns */
++ if (got_interrupt)
++ return -1;
++ }
++ }
++#else
++ if (fgets(linebuf, linesize, ibuf) == NULL)
++ return -1;
++#endif
++ n = strlen(linebuf);
++ if (n > 0 && linebuf[n - 1] == '\n')
++ linebuf[--n] = '\0';
++ return n;
+ }
+
+ /*
+@@ -265,13 +234,16 @@
+ * passed message pointer.
+ */
+ FILE *
+-setinput(struct message *mp)
++setinput(mp)
++ register struct message *mp;
+ {
+
+ fflush(otf);
+- if (fseek(itf, (long)positionof(mp->m_block, mp->m_offset), 0) < 0)
+- err(1, "fseek");
+- return(itf);
++ if (fseek(itf, (long)positionof(mp->m_block, mp->m_offset), 0) < 0) {
++ perror("fseek");
++ panic("temporary file seek");
++ }
++ return (itf);
+ }
+
+ /*
+@@ -279,29 +251,24 @@
+ * a dynamically allocated message structure.
+ */
+ void
+-makemessage(FILE *f, int omsgCount)
++makemessage(f)
++ FILE *f;
+ {
+- size_t size;
+- struct message *nmessage;
++ register size = (msgCount + 1) * sizeof (struct message);
+
+- size = (msgCount + 1) * sizeof(struct message);
+- nmessage = (struct message *)realloc(message, size);
+- if (nmessage == 0)
+- errx(1, "Insufficient memory for %d messages",
+- msgCount);
+- if (omsgCount == 0 || message == NULL)
+- dot = nmessage;
+- else
+- dot = nmessage + (dot - message);
+- message = nmessage;
+- size -= (omsgCount + 1) * sizeof(struct message);
++ if (message != 0)
++ free((char *) message);
++ if ((message = (struct message *) malloc((unsigned) size)) == 0)
++ panic("Insufficient memory for %d messages", msgCount);
++ dot = message;
++ size -= sizeof (struct message);
+ fflush(f);
+- (void)lseek(fileno(f), (off_t)sizeof(*message), 0);
+- if (myread(fileno(f), (void *) &message[omsgCount], size) != size)
+- errx(1, "Message temporary file corrupted");
++ (void) lseek(fileno(f), (off_t)sizeof *message, 0);
++ if (read(fileno(f), (char *) message, size) != size)
++ panic("Message temporary file corrupted");
+ message[msgCount].m_size = 0;
+ message[msgCount].m_lines = 0;
+- (void)Fclose(f);
++ Fclose(f);
+ }
+
+ /*
+@@ -309,17 +276,19 @@
+ * If the write fails, return 1, else 0
+ */
+ int
+-append(struct message *mp, FILE *f)
++append(mp, f)
++ struct message *mp;
++ FILE *f;
+ {
+-
+- return(fwrite((char *) mp, sizeof(*mp), 1, f) != 1);
++ return fwrite((char *) mp, sizeof *mp, 1, f) != 1;
+ }
+
+ /*
+- * Delete or truncate a file, but only if the file is a plain file.
++ * Delete a file, but only if the file is a plain file.
+ */
+ int
+-rm(char *name)
++rm(name)
++ char *name;
+ {
+ struct stat sb;
+
+@@ -329,13 +298,7 @@
+ errno = EISDIR;
+ return(-1);
+ }
+- if (unlink(name) == -1) {
+- if (errno == EPERM)
+- return(truncate(name, 0));
+- else
+- return(-1);
+- }
+- return(0);
++ return(unlink(name));
+ }
+
+ static int sigdepth; /* depth of holdsigs() */
+@@ -344,7 +307,7 @@
+ * Hold signals SIGHUP, SIGINT, and SIGQUIT.
+ */
+ void
+-holdsigs(void)
++holdsigs()
+ {
+
+ if (sigdepth++ == 0) {
+@@ -360,7 +323,7 @@
+ * Release signals SIGHUP, SIGINT, and SIGQUIT.
+ */
+ void
+-relsesigs(void)
++relsesigs()
+ {
+
+ if (--sigdepth == 0)
+@@ -368,42 +331,18 @@
+ }
+
+ /*
+- * Unblock and ignore a signal
+- */
+-int
+-ignoresig(int sig, struct sigaction *oact, sigset_t *oset)
+-{
+- struct sigaction act;
+- sigset_t nset;
+- int error;
+-
+- sigemptyset(&act.sa_mask);
+- act.sa_flags = SA_RESTART;
+- act.sa_handler = SIG_IGN;
+- error = sigaction(sig, &act, oact);
+-
+- if (error == 0) {
+- sigemptyset(&nset);
+- sigaddset(&nset, sig);
+- (void)sigprocmask(SIG_UNBLOCK, &nset, oset);
+- } else if (oset != NULL)
+- (void)sigprocmask(SIG_BLOCK, NULL, oset);
+-
+- return(error);
+-}
+-
+-/*
+ * Determine the size of the file possessed by
+ * the passed buffer.
+ */
+ off_t
+-fsize(FILE *iob)
++fsize(iob)
++ FILE *iob;
+ {
+ struct stat sbuf;
+
+ if (fstat(fileno(iob), &sbuf) < 0)
+- return(0);
+- return(sbuf.st_size);
++ return 0;
++ return sbuf.st_size;
+ }
+
+ /*
+@@ -418,16 +357,16 @@
+ * Return the file name as a dynamic string.
+ */
+ char *
+-expand(char *name)
++expand(name)
++ register char *name;
+ {
+ char xname[PATHSIZE];
+ char cmdbuf[PATHSIZE]; /* also used for file names */
+- pid_t pid;
+- int l;
+- char *cp, *shell;
++ register int pid, l;
++ register char *cp, *shell;
+ int pivec[2];
+ struct stat sbuf;
+- extern int wait_status;
++ extern union wait wait_status;
+
+ /*
+ * The order of evaluation is "%" and "#" expand into constants.
+@@ -437,120 +376,112 @@
+ */
+ switch (*name) {
+ case '%':
+- findmail(name[1] ? name + 1 : myname, xname, sizeof(xname));
+- return(savestr(xname));
++ findmail(name[1] ? name + 1 : myname, xname, PATHSIZE);
++ return savestr(xname);
+ case '#':
+ if (name[1] != 0)
+ break;
+ if (prevfile[0] == 0) {
+- puts("No previous file");
+- return(NULL);
++ printf("No previous file\n");
++ return NOSTR;
+ }
+- return(savestr(prevfile));
++ return savestr(prevfile);
+ case '&':
+- if (name[1] == 0 && (name = value("MBOX")) == NULL)
++ if (name[1] == 0 && (name = value("MBOX")) == NOSTR)
+ name = "~/mbox";
+ /* fall through */
+ }
+- if (name[0] == '+' && getfold(cmdbuf, sizeof(cmdbuf)) >= 0) {
+- (void)snprintf(xname, sizeof(xname), "%s/%s", cmdbuf, name + 1);
++ if (name[0] == '+' && getfold(cmdbuf, PATHSIZE) >= 0) {
++ snprintf(xname, PATHSIZE, "%s/%s", cmdbuf, name + 1);
+ name = savestr(xname);
+ }
+ /* catch the most common shell meta character */
+- if (name[0] == '~' && homedir && (name[1] == '/' || name[1] == '\0')) {
+- (void)snprintf(xname, sizeof(xname), "%s%s", homedir, name + 1);
++ if (name[0] == '~' && (name[1] == '/' || name[1] == '\0')) {
++ snprintf(xname, PATHSIZE, "%s%s", homedir, name + 1);
+ name = savestr(xname);
+ }
+- if (strpbrk(name, "~{[*?$`'\"\\") == NULL)
+- return(name);
+- /* XXX - just use glob(3) and env expansion instead? */
++ if (!anyof(name, "~{[*?$`'\"\\"))
++ return name;
+ if (pipe(pivec) < 0) {
+- warn("pipe");
+- return(name);
++ perror("pipe");
++ return name;
+ }
+- (void)snprintf(cmdbuf, sizeof(cmdbuf), "echo %s", name);
+- shell = value("SHELL");
+- pid = start_command(shell, 0, -1, pivec[1], "-c", cmdbuf, NULL);
++ snprintf(cmdbuf, PATHSIZE, "echo %s", name);
++ if ((shell = value("SHELL")) == NOSTR)
++ shell = _PATH_CSHELL;
++ pid = start_command(shell, 0, -1, pivec[1], "-c", cmdbuf, NOSTR);
+ if (pid < 0) {
+- (void)close(pivec[0]);
+- (void)close(pivec[1]);
+- return(NULL);
+- }
+- (void)close(pivec[1]);
+- l = myread(pivec[0], xname, PATHSIZE);
+- if (l < 0)
+- warn("read"); /* report error before errno changes */
+- (void)close(pivec[0]);
+- if (wait_child(pid) < 0 && WIFSIGNALED(wait_status) &&
+- WTERMSIG(wait_status) != SIGPIPE) {
++ close(pivec[0]);
++ close(pivec[1]);
++ return NOSTR;
++ }
++ close(pivec[1]);
++ l = read(pivec[0], xname, PATHSIZE);
++ if (l < 0) {
++ perror("read");
++ close(pivec[0]);
++ return NOSTR;
++ }
++ close(pivec[0]);
++ if (wait_child(pid) < 0 && wait_status.w_termsig != SIGPIPE) {
+ fprintf(stderr, "\"%s\": Expansion failed.\n", name);
+- return(NULL);
++ return NOSTR;
+ }
+- if (l < 0)
+- return(NULL);
+ if (l == 0) {
+ fprintf(stderr, "\"%s\": No match.\n", name);
+- return(NULL);
++ return NOSTR;
+ }
+ if (l == PATHSIZE) {
+ fprintf(stderr, "\"%s\": Expansion buffer overflow.\n", name);
+- return(NULL);
++ return NOSTR;
+ }
+- xname[l] = '\0';
++ xname[l] = 0;
+ for (cp = &xname[l-1]; *cp == '\n' && cp > xname; cp--)
+ ;
+ cp[1] = '\0';
+- if (strchr(xname, ' ') && stat(xname, &sbuf) < 0) {
++ if (index(xname, ' ') && stat(xname, &sbuf) < 0) {
+ fprintf(stderr, "\"%s\": Ambiguous.\n", name);
+- return(NULL);
++ return NOSTR;
+ }
+- return(savestr(xname));
++ return savestr(xname);
+ }
+
+ /*
+ * Determine the current folder directory name.
+ */
+ int
+-getfold(char *name, int namelen)
++getfold(name, size)
++ char *name;
++ int size;
+ {
+ char *folder;
+
+- if ((folder = value("folder")) == NULL)
+- return(-1);
+- if (*folder == '/')
+- istrcpy(name, folder, namelen);
+- else
+- (void)snprintf(name, namelen, "%s/%s", homedir ? homedir : ".",
+- folder);
+- return(0);
++ if ((folder = value("folder")) == NOSTR)
++ return (-1);
++ if (*folder == '/') {
++ strncpy(name, folder, size);
++ name[size-1]='\0';
++ } else {
++ snprintf(name, size, "%s/%s", homedir, folder);
++ }
++ return (0);
+ }
+
+ /*
+ * Return the name of the dead.letter file.
+ */
+ char *
+-getdeadletter(void)
++getdeadletter()
+ {
+- char *cp;
++ register char *cp;
+
+- if ((cp = value("DEAD")) == NULL || (cp = expand(cp)) == NULL)
++ if ((cp = value("DEAD")) == NOSTR || (cp = expand(cp)) == NOSTR)
+ cp = expand("~/dead.letter");
+ else if (*cp != '/') {
+ char buf[PATHSIZE];
+
+- (void)snprintf(buf, sizeof(buf), "~/%s", cp);
++ (void) snprintf(buf, PATHSIZE, "~/%s", cp);
+ cp = expand(buf);
+ }
+- return(cp);
+-}
+-
+-/*
+- * Signal handler used by readline() to catch SIGINT, SIGHUP, SIGTSTP,
+- * SIGTTOU, SIGTTIN.
+- */
+-void
+-fioint(int s)
+-{
+-
+- fiosignal = s;
++ return cp;
+ }
+diff -urN mailx-8.1.1.orig/getname.c mailx-8.1.1/getname.c
+--- mailx-8.1.1.orig/getname.c 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/getname.c 1996-06-14 01:27:01.000000000 -0700
+@@ -1,4 +1,4 @@
+-/* $OpenBSD: getname.c,v 1.6 2002/10/07 22:45:37 vincent Exp $ */
++/* $OpenBSD: getname.c,v 1.4 1996/06/08 19:48:23 christos Exp $ */
+ /* $NetBSD: getname.c,v 1.4 1996/06/08 19:48:23 christos Exp $ */
+
+ /*
+@@ -36,9 +36,9 @@
+
+ #ifndef lint
+ #if 0
+-static const char sccsid[] = "@(#)getname.c 8.1 (Berkeley) 6/6/93";
++static char sccsid[] = "@(#)getname.c 8.1 (Berkeley) 6/6/93";
+ #else
+-static const char rcsid[] = "$OpenBSD: getname.c,v 1.6 2002/10/07 22:45:37 vincent Exp $";
++static char rcsid[] = "$OpenBSD: getname.c,v 1.4 1996/06/08 19:48:23 christos Exp $";
+ #endif
+ #endif /* not lint */
+
+@@ -46,31 +46,33 @@
+ #include <pwd.h>
+ #include "extern.h"
+
+-/* Getname / getuserid for those with hashed passwd data base. */
++/* Getname / getuserid for those with hashed passwd data base). */
+
+ /*
+- * Search the passwd file for a uid. Return name on success, NULL on failure
++ * Search the passwd file for a uid. Return name on success, NOSTR on failure
+ */
+ char *
+-getname(uid_t uid)
++getname(uid)
++ int uid;
+ {
+ struct passwd *pw;
+
+ if ((pw = getpwuid(uid)) == NULL)
+- return(NULL);
+- return(pw->pw_name);
++ return NOSTR;
++ return pw->pw_name;
+ }
+
+ /*
+ * Convert the passed name to a user id and return it. Return -1
+ * on error.
+ */
+-uid_t
+-getuserid(char *name)
++int
++getuserid(name)
++ char name[];
+ {
+ struct passwd *pw;
+
+ if ((pw = getpwnam(name)) == NULL)
+ return -1;
+- return(pw->pw_uid);
++ return pw->pw_uid;
+ }
+diff -urN mailx-8.1.1.orig/glob.h mailx-8.1.1/glob.h
+--- mailx-8.1.1.orig/glob.h 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/glob.h 2003-03-26 13:03:40.000000000 -0800
+@@ -1,4 +1,4 @@
+-/* $OpenBSD: glob.h,v 1.6 2001/11/21 15:26:39 millert Exp $ */
++/* $OpenBSD: glob.h,v 1.4 1996/06/08 19:48:25 christos Exp $ */
+ /* $NetBSD: glob.h,v 1.4 1996/06/08 19:48:25 christos Exp $ */
+
+ /*
+@@ -41,6 +41,7 @@
+ * A bunch of global variable declarations lie herein.
+ * def.h must be included first.
+ */
++
+ int msgCount; /* Count of messages read in */
+ int rcvmode; /* True if receiving mail */
+ int sawcom; /* Set after first command */
+@@ -82,8 +83,13 @@
+ int screenheight; /* Screen height, or best guess,
+ for "header" command */
+ int realscreenheight; /* the real screen height */
+-int uflag; /* Are we in -u mode? */
+-sigset_t intset; /* Signal set that is just SIGINT */
++gid_t effectivegid; /* Saved from when we started up */
++gid_t realgid; /* Saved from when we started up */
++
++#include <setjmp.h>
++
++jmp_buf srbuf;
++
+
+ /*
+ * The pointers for the string allocation routines,
+@@ -91,6 +97,7 @@
+ * The first holds STRINGSIZE bytes, the next
+ * twice as much, and so on.
+ */
++
+ #define NSPACE 25 /* Total number of string spaces */
+ struct strings {
+ char *s_topFree; /* Beginning of this area */
+diff -urN mailx-8.1.1.orig/head.c mailx-8.1.1/head.c
+--- mailx-8.1.1.orig/head.c 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/head.c 2003-03-26 13:03:40.000000000 -0800
+@@ -1,5 +1,5 @@
+-/* $OpenBSD: head.c,v 1.8 2002/06/14 21:35:00 todd Exp $ */
+-/* $NetBSD: head.c,v 1.6 1996/12/28 07:11:03 tls Exp $ */
++/* $OpenBSD: head.c,v 1.5 1996/06/08 19:48:26 christos Exp $ */
++/* $NetBSD: head.c,v 1.5 1996/06/08 19:48:26 christos Exp $ */
+
+ /*
+ * Copyright (c) 1980, 1993
+@@ -36,9 +36,9 @@
+
+ #ifndef lint
+ #if 0
+-static const char sccsid[] = "@(#)head.c 8.2 (Berkeley) 4/20/95";
++static char sccsid[] = "@(#)head.c 8.1 (Berkeley) 6/6/93";
+ #else
+-static const char rcsid[] = "$OpenBSD: head.c,v 1.8 2002/06/14 21:35:00 todd Exp $";
++static char rcsid[] = "$OpenBSD: head.c,v 1.5 1996/06/08 19:48:26 christos Exp $";
+ #endif
+ #endif /* not lint */
+
+@@ -54,41 +54,46 @@
+ /*
+ * See if the passed line buffer is a mail header.
+ * Return true if yes. Note the extreme pains to
+- * accommodate all funny formats.
++ * accomodate all funny formats.
+ */
+ int
+-ishead(char *linebuf)
++ishead(linebuf)
++ char linebuf[];
+ {
+- char *cp;
++ register char *cp;
+ struct headline hl;
+ char parbuf[BUFSIZ];
+
+ cp = linebuf;
+ if (*cp++ != 'F' || *cp++ != 'r' || *cp++ != 'o' || *cp++ != 'm' ||
+ *cp++ != ' ')
+- return(0);
++ return (0);
+ parse(linebuf, &hl, parbuf);
+- if (hl.l_from == NULL || hl.l_date == NULL) {
++ if (hl.l_from == NOSTR || hl.l_date == NOSTR) {
+ fail(linebuf, "No from or date field");
+- return(0);
++ return (0);
+ }
++ /* be very tolerant about the date */
++#if 0
+ if (!isdate(hl.l_date)) {
+ fail(linebuf, "Date field not legal date");
+- return(0);
++ return (0);
+ }
++#endif
+ /*
+ * I guess we got it!
+ */
+- return(1);
++ return (1);
+ }
+
+ /*ARGSUSED*/
+ void
+-fail(char *linebuf, char *reason)
++fail(linebuf, reason)
++ char linebuf[], reason[];
+ {
+
+ /*
+- if (value("debug") == NULL)
++ if (value("debug") == NOSTR)
+ return;
+ fprintf(stderr, "\"%s\"\nnot a header because %s\n", linebuf, reason);
+ */
+@@ -101,14 +106,17 @@
+ * structure. Actually, it scans.
+ */
+ void
+-parse(char *line, struct headline *hl, char *pbuf)
++parse(line, hl, pbuf)
++ char line[], pbuf[];
++ register struct headline *hl;
+ {
+- char *cp, *sp;
++ register char *cp;
++ char *sp;
+ char word[LINESIZE];
+
+- hl->l_from = NULL;
+- hl->l_tty = NULL;
+- hl->l_date = NULL;
++ hl->l_from = NOSTR;
++ hl->l_tty = NOSTR;
++ hl->l_date = NOSTR;
+ cp = line;
+ sp = pbuf;
+ /*
+@@ -118,11 +126,11 @@
+ cp = nextword(cp, word);
+ if (*word)
+ hl->l_from = copyin(word, &sp);
+- if (cp != NULL && cp[0] == 't' && cp[1] == 't' && cp[2] == 'y') {
++ if (cp != NOSTR && cp[0] == 't' && cp[1] == 't' && cp[2] == 'y') {
+ cp = nextword(cp, word);
+ hl->l_tty = copyin(word, &sp);
+ }
+- if (cp != NULL)
++ if (cp != NOSTR)
+ hl->l_date = copyin(cp, &sp);
+ }
+
+@@ -133,15 +141,18 @@
+ * the left string into it.
+ */
+ char *
+-copyin(char *src, char **space)
++copyin(src, space)
++ register char *src;
++ char **space;
+ {
+- char *cp, *top;
++ register char *cp;
++ char *top;
+
+ top = cp = *space;
+ while ((*cp++ = *src++) != '\0')
+ ;
+ *space = cp;
+- return(top);
++ return (top);
+ }
+
+ /*
+@@ -157,43 +168,23 @@
+ * 'a' A lower case char
+ * ' ' A space
+ * '0' A digit
+- * 'O' A digit or space
+- * 'p' A punctuation char
+- * 'P' A punctuation char or space
++ * 'O' An optional digit or space
+ * ':' A colon
+ * 'N' A new line
+ */
+-
+-/*
+- * Yuck. If the mail file is created by Sys V (Solaris),
+- * there are no seconds in the time...
+- */
+-
+-/*
+- * If the mail is created by another program such as imapd, it might
+- * have timezone as <-|+>nnnn (-0800 for instance) at the end.
+- */
+-
+-static char *date_formats[] = {
+- "Aaa Aaa O0 00:00:00 0000", /* Mon Jan 01 23:59:59 2001 */
+- "Aaa Aaa O0 00:00:00 AAA 0000", /* Mon Jan 01 23:59:59 PST 2001 */
+- "Aaa Aaa O0 00:00:00 0000 p0000", /* Mon Jan 01 23:59:59 2001 -0800 */
+- "Aaa Aaa O0 00:00 0000", /* Mon Jan 01 23:59 2001 */
+- "Aaa Aaa O0 00:00 AAA 0000", /* Mon Jan 01 23:59 PST 2001 */
+- "Aaa Aaa O0 00:00 0000 p0000", /* Mon Jan 01 23:59 2001 -0800 */
+- ""
+-};
++char ctype[] = "Aaa Aaa O0 00:00:00 0000";
++char ctype_without_secs[] = "Aaa Aaa O0 00:00 0000";
++char tmztype[] = "Aaa Aaa O0 00:00:00 AAA 0000";
++char tmztype_without_secs[] = "Aaa Aaa O0 00:00 AAA 0000";
+
+ int
+-isdate(char *date)
++isdate(date)
++ char date[];
+ {
+- int i;
+
+- for(i = 0; *date_formats[i]; i++) {
+- if (cmatch(date, date_formats[i]))
+- return 1;
+- }
+- return 0;
++ return cmatch(date, ctype_without_secs) ||
++ cmatch(date, tmztype_without_secs) ||
++ cmatch(date, ctype) || cmatch(date, tmztype);
+ }
+
+ /*
+@@ -201,68 +192,61 @@
+ * Return 1 if they match, 0 if they don't
+ */
+ int
+-cmatch(char *cp, char *tp)
++cmatch(cp, tp)
++ register char *cp, *tp;
+ {
+
+ while (*cp && *tp)
+ switch (*tp++) {
+ case 'a':
+ if (!islower(*cp++))
+- return(0);
++ return 0;
+ break;
+ case 'A':
+ if (!isupper(*cp++))
+- return(0);
++ return 0;
+ break;
+ case ' ':
+ if (*cp++ != ' ')
+- return(0);
++ return 0;
+ break;
+ case '0':
+ if (!isdigit(*cp++))
+- return(0);
++ return 0;
+ break;
+ case 'O':
+ if (*cp != ' ' && !isdigit(*cp))
+- return(0);
+- cp++;
+- break;
+- case 'p':
+- if (!ispunct(*cp++))
+- return(0);
+- break;
+- case 'P':
+- if (*cp != ' ' && !ispunct(*cp))
+- return(0);
++ return 0;
+ cp++;
+ break;
+ case ':':
+ if (*cp++ != ':')
+- return(0);
++ return 0;
+ break;
+ case 'N':
+ if (*cp++ != '\n')
+- return(0);
++ return 0;
+ break;
+ }
+ if (*cp || *tp)
+- return(0);
+- return(1);
++ return 0;
++ return (1);
+ }
+
+ /*
+ * Collect a liberal (space, tab delimited) word into the word buffer
+ * passed. Also, return a pointer to the next word following that,
+- * or NULL if none follow.
++ * or NOSTR if none follow.
+ */
+ char *
+-nextword(char *wp, char *wbuf)
++nextword(wp, wbuf)
++ register char *wp, *wbuf;
+ {
+- int c;
++ register c;
+
+- if (wp == NULL) {
++ if (wp == NOSTR) {
+ *wbuf = 0;
+- return(NULL);
++ return (NOSTR);
+ }
+ while ((c = *wp++) && c != ' ' && c != '\t') {
+ *wbuf++ = c;
+@@ -279,6 +263,6 @@
+ for (; c == ' ' || c == '\t'; c = *wp++)
+ ;
+ if (c == 0)
+- return(NULL);
+- return(wp - 1);
++ return (NOSTR);
++ return (wp - 1);
+ }
+diff -urN mailx-8.1.1.orig/lex.c mailx-8.1.1/lex.c
+--- mailx-8.1.1.orig/lex.c 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/lex.c 2003-03-26 13:03:40.000000000 -0800
+@@ -1,5 +1,5 @@
+-/* $OpenBSD: lex.c,v 1.27 2001/11/21 20:41:55 millert Exp $ */
+-/* $NetBSD: lex.c,v 1.10 1997/05/17 19:55:13 pk Exp $ */
++/* $OpenBSD: lex.c,v 1.7 1996/06/08 19:48:28 christos Exp $ */
++/* $NetBSD: lex.c,v 1.7 1996/06/08 19:48:28 christos Exp $ */
+
+ /*
+ * Copyright (c) 1980, 1993
+@@ -36,9 +36,9 @@
+
+ #ifndef lint
+ #if 0
+-static const char sccsid[] = "@(#)lex.c 8.2 (Berkeley) 4/20/95";
++static char sccsid[] = "@(#)lex.c 8.1 (Berkeley) 6/6/93";
+ #else
+-static const char rcsid[] = "$OpenBSD: lex.c,v 1.27 2001/11/21 20:41:55 millert Exp $";
++static char rcsid[] = "$OpenBSD: lex.c,v 1.7 1996/06/08 19:48:28 christos Exp $";
+ #endif
+ #endif /* not lint */
+
+@@ -55,8 +55,6 @@
+
+ char *prompt = "& ";
+
+-const struct cmd *com; /* command we are running */
+-
+ /*
+ * Set up editing on the given file name.
+ * If the first character of name is %, we are considered to be
+@@ -64,47 +62,49 @@
+ * signficance for mbox and so forth.
+ */
+ int
+-setfile(char *name)
++setfile(name)
++ char *name;
+ {
+ FILE *ibuf;
+- int i, fd;
++ int i;
+ struct stat stb;
+ char isedit = *name != '%';
+ char *who = name[1] ? name + 1 : myname;
+- char tempname[PATHSIZE];
+ static int shudclob;
++ extern char *tempMesg;
++ extern int errno;
+
+- if ((name = expand(name)) == NULL)
+- return(-1);
++ if ((name = expand(name)) == NOSTR)
++ return -1;
+
+ if ((ibuf = Fopen(name, "r")) == NULL) {
+ if (!isedit && errno == ENOENT)
+ goto nomail;
+- warn("%s", name);
++ perror(name);
+ return(-1);
+ }
+
+ if (fstat(fileno(ibuf), &stb) < 0) {
+- warn("fstat");
+- (void)Fclose(ibuf);
+- return(-1);
++ perror("fstat");
++ Fclose(ibuf);
++ return (-1);
+ }
+
+ switch (stb.st_mode & S_IFMT) {
+ case S_IFDIR:
+- (void)Fclose(ibuf);
++ Fclose(ibuf);
+ errno = EISDIR;
+- warn("%s", name);
+- return(-1);
++ perror(name);
++ return (-1);
+
+ case S_IFREG:
+ break;
+
+ default:
+- (void)Fclose(ibuf);
++ Fclose(ibuf);
+ errno = EINVAL;
+- warn("%s", name);
+- return(-1);
++ perror(name);
++ return (-1);
+ }
+
+ /*
+@@ -113,6 +113,7 @@
+ * while we are reading the new file, else we will ruin
+ * the message[] data structure.
+ */
++
+ holdsigs();
+ if (shudclob)
+ quit();
+@@ -121,113 +122,85 @@
+ * Copy the messages into /tmp
+ * and set pointers.
+ */
++
+ readonly = 0;
+- if ((i = open(name, O_WRONLY, 0)) < 0)
++ if ((i = open(name, 1)) < 0)
+ readonly++;
+ else
+- (void)close(i);
++ close(i);
+ if (shudclob) {
+- (void)fclose(itf);
+- (void)fclose(otf);
++ fclose(itf);
++ fclose(otf);
+ }
+ shudclob = 1;
+ edit = isedit;
+- istrcpy(prevfile, mailname, PATHSIZE);
+- if (name != mailname)
+- istrcpy(mailname, name, sizeof(mailname));
++ strncpy(prevfile, mailname, PATHSIZE);
++ prevfile[PATHSIZE-1]='\0';
++ if (name != mailname) {
++ strncpy(mailname, name, PATHSIZE);
++ mailname[PATHSIZE-1]='\0';
++ }
+ mailsize = fsize(ibuf);
+- (void)snprintf(tempname, sizeof(tempname),
+- "%s/mail.RxXXXXXXXXXX", tmpdir);
+- if ((fd = mkstemp(tempname)) == -1 ||
+- (otf = fdopen(fd, "w")) == NULL)
+- err(1, "%s", tempname);
+- (void)fcntl(fileno(otf), F_SETFD, 1);
+- if ((itf = fopen(tempname, "r")) == NULL)
+- err(1, "%s", tempname);
+- (void)fcntl(fileno(itf), F_SETFD, 1);
+- (void)rm(tempname);
+- setptr(ibuf, 0);
++ if ((otf = safe_fopen(tempMesg, "w")) == NULL) {
++ perror(tempMesg);
++ exit(1);
++ }
++ (void) fcntl(fileno(otf), F_SETFD, 1);
++ if ((itf = safe_fopen(tempMesg, "r")) == NULL) {
++ perror(tempMesg);
++ exit(1);
++ }
++ (void) fcntl(fileno(itf), F_SETFD, 1);
++ rm(tempMesg);
++ setptr(ibuf);
+ setmsize(msgCount);
+- /*
+- * New mail may have arrived while we were reading
+- * the mail file, so reset mailsize to be where
+- * we really are in the file...
+- */
+- mailsize = ftell(ibuf);
+- (void)Fclose(ibuf);
++ Fclose(ibuf);
+ relsesigs();
+ sawcom = 0;
+ if (!edit && msgCount == 0) {
+ nomail:
+ fprintf(stderr, "No mail for %s\n", who);
+- return(-1);
++ return -1;
+ }
+ return(0);
+ }
+
+-/*
+- * Incorporate any new mail that has arrived since we first
+- * started reading mail.
+- */
+-int
+-incfile(void)
+-{
+- int newsize;
+- int omsgCount = msgCount;
+- FILE *ibuf;
+-
+- ibuf = Fopen(mailname, "r");
+- if (ibuf == NULL)
+- return(-1);
+- holdsigs();
+- if (!spool_lock()) {
+- (void)Fclose(ibuf);
+- relsesigs();
+- return(-1);
+- }
+- newsize = fsize(ibuf);
+- /* make sure mail box has grown and is non-empty */
+- if (newsize == 0 || newsize <= mailsize) {
+- (void)Fclose(ibuf);
+- spool_unlock();
+- relsesigs();
+- return(newsize == mailsize ? 0 : -1);
+- }
+- setptr(ibuf, mailsize);
+- setmsize(msgCount);
+- mailsize = ftell(ibuf);
+- (void)Fclose(ibuf);
+- spool_unlock();
+- relsesigs();
+- return(msgCount - omsgCount);
+-}
+-
+-
+ int *msgvec;
+-int reset_on_stop; /* reset prompt if stopped */
++int reset_on_stop; /* do a reset() if stopped */
+
+ /*
+ * Interpret user commands one by one. If standard input is not a tty,
+ * print no prompt.
+ */
+ void
+-commands(void)
++commands()
+ {
+- int n, sig, *sigp;
+ int eofloop = 0;
++ register int n;
+ char linebuf[LINESIZE];
++#if __GNUC__
++ /* Avoid longjmp clobbering */
++ (void) &eofloop;
++#endif
+
+- prompt:
++ if (!sourcing) {
++ if (signal(SIGINT, SIG_IGN) != SIG_IGN)
++ signal(SIGINT, intr);
++ if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
++ signal(SIGHUP, hangup);
++ signal(SIGTSTP, stop);
++ signal(SIGTTOU, stop);
++ signal(SIGTTIN, stop);
++ }
++ setexit();
+ for (;;) {
+ /*
+ * Print the prompt, if needed. Clear out
+ * string space, and flush the output.
+ */
+- if (!sourcing && value("interactive") != NULL) {
+- if ((value("autoinc") != NULL) && (incfile() > 0))
+- puts("New mail has arrived.");
++ if (!sourcing && value("interactive") != NOSTR) {
+ reset_on_stop = 1;
+- printf("%s", prompt);
++ printf(prompt);
+ }
+ fflush(stdout);
+ sreset();
+@@ -236,24 +209,8 @@
+ * and handle end of file specially.
+ */
+ n = 0;
+- sig = 0;
+- sigp = sourcing ? NULL : &sig;
+ for (;;) {
+- if (readline(input, &linebuf[n], LINESIZE - n, sigp) < 0) {
+- if (sig) {
+- if (sig == SIGINT)
+- dointr();
+- else if (sig == SIGHUP)
+- /* nothing to do? */
+- exit(1);
+- else {
+- /* Stopped by job control */
+- (void)kill(0, sig);
+- if (reset_on_stop)
+- reset_on_stop = 0;
+- }
+- goto prompt;
+- }
++ if (readline(input, &linebuf[n], LINESIZE - n) < 0) {
+ if (n == 0)
+ n = -1;
+ break;
+@@ -274,10 +231,10 @@
+ unstack();
+ continue;
+ }
+- if (value("interactive") != NULL &&
+- value("ignoreeof") != NULL &&
++ if (value("interactive") != NOSTR &&
++ value("ignoreeof") != NOSTR &&
+ ++eofloop < 25) {
+- puts("Use \"quit\" to quit.");
++ printf("Use \"quit\" to quit.\n");
+ continue;
+ }
+ break;
+@@ -296,16 +253,18 @@
+ * Contxt is non-zero if called while composing mail.
+ */
+ int
+-execute(char *linebuf, int contxt)
++execute(linebuf, contxt)
++ char linebuf[];
++ int contxt;
+ {
+ char word[LINESIZE];
+ char *arglist[MAXARGC];
+- char *cp, *cp2;
+- int c, muvec[2];
++ const struct cmd *com = NULL;
++ register char *cp, *cp2;
++ register int c;
++ int muvec[2];
+ int e = 1;
+
+- com = NULL;
+-
+ /*
+ * Strip the white space away from the beginning
+ * of the command, then scan out a word, which
+@@ -314,18 +273,19 @@
+ * Handle ! escapes differently to get the correct
+ * lexical conventions.
+ */
++
+ for (cp = linebuf; isspace(*cp); cp++)
+ ;
+ if (*cp == '!') {
+ if (sourcing) {
+- puts("Can't \"!\" while sourcing");
++ printf("Can't \"!\" while sourcing\n");
+ goto out;
+ }
+ shell(cp+1);
+ return(0);
+ }
+ cp2 = word;
+- while (*cp && strchr(" \t0123456789$^.:/-+*'\"", *cp) == NULL)
++ while (*cp && index(" \t0123456789$^.:/-+*'\"", *cp) == NOSTR)
+ *cp2++ = *cp++;
+ *cp2 = '\0';
+
+@@ -336,10 +296,11 @@
+ * however, we ignore blank lines to eliminate
+ * confusion.
+ */
++
+ if (sourcing && *word == '\0')
+ return(0);
+ com = lex(word);
+- if (com == NULL) {
++ if (com == NONE) {
+ printf("Unknown command: \"%s\"\n", word);
+ goto out;
+ }
+@@ -348,6 +309,7 @@
+ * See if we should execute the command -- if a conditional
+ * we always execute it, otherwise, check the state of cond.
+ */
++
+ if ((com->c_argtype & F) == 0)
+ if ((cond == CRCV && !rcvmode) || (cond == CSEND && rcvmode))
+ return(0);
+@@ -358,6 +320,7 @@
+ * If we are sourcing an interactive command, it's
+ * an error.
+ */
++
+ if (!rcvmode && (com->c_argtype & M) == 0) {
+ printf("May not execute \"%s\" while sending\n",
+ com->c_name);
+@@ -378,60 +341,13 @@
+ goto out;
+ }
+ switch (com->c_argtype & ~(F|P|I|M|T|W|R)) {
+- case MSGLIST|STRLIST:
+- /*
+- * A message list defaulting to nearest forward
+- * legal message.
+- */
+- if (msgvec == 0) {
+- puts("Illegal use of \"message list\"");
+- break;
+- }
+- /*
+- * remove leading blanks.
+- */
+- while (isspace(*cp))
+- cp++;
+-
+- if (isdigit(*cp) || *cp == ':') {
+- if ((c = getmsglist(cp, msgvec, com->c_msgflag)) < 0)
+- break;
+- /* position to next space - past the message list */
+- while (!isspace(*cp))
+- cp++;
+- /* position to next non-space */
+- while (isspace(*cp))
+- cp++;
+- } else {
+- c = 0; /* no message list */
+- }
+-
+- if (c == 0) {
+- *msgvec = first(com->c_msgflag,
+- com->c_msgmask);
+- msgvec[1] = NULL;
+- }
+- if (*msgvec == NULL) {
+- puts("No applicable messages");
+- break;
+- }
+- /*
+- * Just the straight string, with
+- * leading blanks removed.
+- */
+- while (isspace(*cp))
+- cp++;
+-
+- e = (*com->c_func2)(msgvec, cp);
+- break;
+-
+ case MSGLIST:
+ /*
+ * A message list defaulting to nearest forward
+ * legal message.
+ */
+ if (msgvec == 0) {
+- puts("Illegal use of \"message list\"");
++ printf("Illegal use of \"message list\"\n");
+ break;
+ }
+ if ((c = getmsglist(cp, msgvec, com->c_msgflag)) < 0)
+@@ -442,7 +358,7 @@
+ msgvec[1] = NULL;
+ }
+ if (*msgvec == NULL) {
+- puts("No applicable messages");
++ printf("No applicable messages\n");
+ break;
+ }
+ e = (*com->c_func)(msgvec);
+@@ -454,7 +370,7 @@
+ * if none exist.
+ */
+ if (msgvec == 0) {
+- puts("Illegal use of \"message list\"");
++ printf("Illegal use of \"message list\"\n");
+ break;
+ }
+ if (getmsglist(cp, msgvec, com->c_msgflag) < 0)
+@@ -477,7 +393,7 @@
+ * A vector of strings, in shell style.
+ */
+ if ((c = getrawlist(cp, arglist,
+- sizeof(arglist) / sizeof(*arglist))) < 0)
++ sizeof arglist / sizeof *arglist)) < 0)
+ break;
+ if (c < com->c_minargs) {
+ printf("%s requires at least %d arg(s)\n",
+@@ -501,7 +417,7 @@
+ break;
+
+ default:
+- errx(1, "Unknown argtype");
++ panic("Unknown argtype");
+ }
+
+ out:
+@@ -511,16 +427,16 @@
+ */
+ if (e) {
+ if (e < 0)
+- return(1);
++ return 1;
+ if (loading)
+- return(1);
++ return 1;
+ if (sourcing)
+ unstack();
+- return(0);
++ return 0;
+ }
+ if (com == NULL)
+ return(0);
+- if (value("autoprint") != NULL && com->c_argtype & P)
++ if (value("autoprint") != NOSTR && com->c_argtype & P)
+ if ((dot->m_flag & MDELETED) == 0) {
+ muvec[0] = dot - &message[0] + 1;
+ muvec[1] = 0;
+@@ -536,14 +452,13 @@
+ * lists to message list functions.
+ */
+ void
+-setmsize(int n)
++setmsize(sz)
++ int sz;
+ {
+- size_t msize;
+
+- msize = (n + 1) * sizeof(*msgvec);
+- if ((msgvec = realloc(msgvec, msize)) == NULL)
+- errx(1, "Out of memory");
+- memset(msgvec, 0, msize);
++ if (msgvec != 0)
++ free((char *) msgvec);
++ msgvec = (int *) calloc((unsigned) (sz + 1), sizeof *msgvec);
+ }
+
+ /*
+@@ -552,17 +467,16 @@
+ */
+
+ const struct cmd *
+-lex(char *word)
++lex(word)
++ char word[];
+ {
+ extern const struct cmd cmdtab[];
+- const struct cmd *cp;
++ register const struct cmd *cp;
+
+- if (word[0] == '#')
+- word = "#";
+- for (cp = &cmdtab[0]; cp->c_name != NULL; cp++)
++ for (cp = &cmdtab[0]; cp->c_name != NOSTR; cp++)
+ if (isprefix(word, cp->c_name))
+ return(cp);
+- return(NULL);
++ return(NONE);
+ }
+
+ /*
+@@ -570,9 +484,10 @@
+ * Return true if yep.
+ */
+ int
+-isprefix(char *as1, char *as2)
++isprefix(as1, as2)
++ char *as1, *as2;
+ {
+- char *s1, *s2;
++ register char *s1, *s2;
+
+ s1 = as1;
+ s2 = as2;
+@@ -589,10 +504,13 @@
+ * Close all open files except 0, 1, 2, and the temporary.
+ * Also, unstack all source files.
+ */
++
+ int inithdr; /* am printing startup headers */
+
++/*ARGSUSED*/
+ void
+-dointr(void)
++intr(s)
++ int s;
+ {
+
+ noreset = 0;
+@@ -605,10 +523,46 @@
+ close_all_files();
+
+ if (image >= 0) {
+- (void)close(image);
++ close(image);
+ image = -1;
+ }
+- fputs("Interrupt\n", stderr);
++ fprintf(stderr, "Interrupt\n");
++ reset(0);
++}
++
++/*
++ * When we wake up after ^Z, reprint the prompt.
++ */
++void
++stop(s)
++ int s;
++{
++ sig_t old_action = signal(s, SIG_DFL);
++ sigset_t nset;
++
++ sigemptyset(&nset);
++ sigaddset(&nset, s);
++ sigprocmask(SIG_UNBLOCK, &nset, NULL);
++ kill(0, s);
++ sigprocmask(SIG_BLOCK, &nset, NULL);
++ signal(s, old_action);
++ if (reset_on_stop) {
++ reset_on_stop = 0;
++ reset(0);
++ }
++}
++
++/*
++ * Branch here on hangup signal and simulate "exit".
++ */
++/*ARGSUSED*/
++void
++hangup(s)
++ int s;
++{
++
++ /* nothing to do? */
++ exit(1);
+ }
+
+ /*
+@@ -616,15 +570,15 @@
+ * give the message count, and print a header listing.
+ */
+ void
+-announce(void)
++announce()
+ {
+ int vec[2], mdot;
+
+- mdot = newfileinfo(0);
++ mdot = newfileinfo();
+ vec[0] = mdot;
+ vec[1] = 0;
+ dot = &message[mdot - 1];
+- if (msgCount > 0 && value("noheader") == NULL) {
++ if (msgCount > 0 && value("noheader") == NOSTR) {
+ inithdr++;
+ headers(vec);
+ inithdr = 0;
+@@ -636,23 +590,23 @@
+ * Return a likely place to set dot.
+ */
+ int
+-newfileinfo(int omsgCount)
++newfileinfo()
+ {
+- struct message *mp;
+- int u, n, mdot, d, s;
+- char fname[PATHSIZE], zname[PATHSIZE], *ename;
++ register struct message *mp;
++ register int u, n, mdot, d, s;
++ char fname[BUFSIZ], zname[BUFSIZ], *ename;
+
+- for (mp = &message[omsgCount]; mp < &message[msgCount]; mp++)
++ for (mp = &message[0]; mp < &message[msgCount]; mp++)
+ if (mp->m_flag & MNEW)
+ break;
+ if (mp >= &message[msgCount])
+- for (mp = &message[omsgCount]; mp < &message[msgCount]; mp++)
++ for (mp = &message[0]; mp < &message[msgCount]; mp++)
+ if ((mp->m_flag & MREAD) == 0)
+ break;
+ if (mp < &message[msgCount])
+ mdot = mp - &message[0] + 1;
+ else
+- mdot = omsgCount + 1;
++ mdot = 1;
+ s = d = 0;
+ for (mp = &message[0], n = 0, u = 0; mp < &message[msgCount]; mp++) {
+ if (mp->m_flag & MNEW)
+@@ -665,17 +619,16 @@
+ s++;
+ }
+ ename = mailname;
+- if (getfold(fname, sizeof(fname)) >= 0) {
++ if (getfold(fname, BUFSIZ-1) >= 0) {
+ strcat(fname, "/");
+ if (strncmp(fname, mailname, strlen(fname)) == 0) {
+- (void)snprintf(zname, sizeof(zname), "+%s",
+- mailname + strlen(fname));
++ snprintf(zname, BUFSIZ, "+%s", mailname + strlen(fname));
+ ename = zname;
+ }
+ }
+ printf("\"%s\": ", ename);
+ if (msgCount == 1)
+- fputs("1 message", stdout);
++ printf("1 message");
+ else
+ printf("%d messages", msgCount);
+ if (n > 0)
+@@ -687,19 +640,21 @@
+ if (s > 0)
+ printf(" %d saved", s);
+ if (readonly)
+- fputs(" [Read only]", stdout);
+- putchar('\n');
++ printf(" [Read only]");
++ printf("\n");
+ return(mdot);
+ }
+
+ /*
+ * Print the current version number.
+ */
++
+ /*ARGSUSED*/
+ int
+-pversion(void *v)
++pversion(v)
++ void *v;
+ {
+- extern const char version[];
++ extern char *version;
+
+ printf("Version %s\n", version);
+ return(0);
+@@ -709,9 +664,10 @@
+ * Load a file of user definitions.
+ */
+ void
+-load(char *name)
++load(name)
++ char *name;
+ {
+- FILE *in, *oldin;
++ register FILE *in, *oldin;
+
+ if ((in = Fopen(name, "r")) == NULL)
+ return;
+@@ -723,5 +679,5 @@
+ loading = 0;
+ sourcing = 0;
+ input = oldin;
+- (void)Fclose(in);
++ Fclose(in);
+ }
+diff -urN mailx-8.1.1.orig/list.c mailx-8.1.1/list.c
+--- mailx-8.1.1.orig/list.c 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/list.c 2003-03-26 13:03:40.000000000 -0800
+@@ -1,5 +1,5 @@
+-/* $OpenBSD: list.c,v 1.12 2001/11/21 20:41:55 millert Exp $ */
+-/* $NetBSD: list.c,v 1.7 1997/07/09 05:23:36 mikel Exp $ */
++/* $OpenBSD: list.c,v 1.4 1996/06/08 19:48:30 christos Exp $ */
++/* $NetBSD: list.c,v 1.4 1996/06/08 19:48:30 christos Exp $ */
+
+ /*
+ * Copyright (c) 1980, 1993
+@@ -36,9 +36,9 @@
+
+ #ifndef lint
+ #if 0
+-static const char sccsid[] = "@(#)list.c 8.4 (Berkeley) 5/1/95";
++static char sccsid[] = "@(#)list.c 8.2 (Berkeley) 4/19/94";
+ #else
+-static const char rcsid[] = "$OpenBSD: list.c,v 1.12 2001/11/21 20:41:55 millert Exp $";
++static char rcsid[] = "$OpenBSD: list.c,v 1.4 1996/06/08 19:48:30 christos Exp $";
+ #endif
+ #endif /* not lint */
+
+@@ -46,8 +46,6 @@
+ #include <ctype.h>
+ #include "extern.h"
+
+-int matchto(char *, int);
+-
+ /*
+ * Mail -- a mail program
+ *
+@@ -61,14 +59,16 @@
+ * Returns the count of messages picked up or -1 on error.
+ */
+ int
+-getmsglist(char *buf, int *vector, int flags)
++getmsglist(buf, vector, flags)
++ char *buf;
++ int *vector, flags;
+ {
+- int *ip;
+- struct message *mp;
++ register int *ip;
++ register struct message *mp;
+
+ if (msgCount == 0) {
+ *vector = 0;
+- return(0);
++ return 0;
+ }
+ if (markall(buf, flags) < 0)
+ return(-1);
+@@ -89,6 +89,7 @@
+ /*
+ * Bit values for colon modifiers.
+ */
++
+ #define CMNEW 01 /* New messages */
+ #define CMOLD 02 /* Old messages */
+ #define CMUNREAD 04 /* Unread messages */
+@@ -99,6 +100,7 @@
+ * The following table describes the letters which can follow
+ * the colon and gives the corresponding modifier bit.
+ */
++
+ struct coltab {
+ char co_char; /* What to find past : */
+ int co_bit; /* Associated modifier bit */
+@@ -113,14 +115,16 @@
+ { 0, 0, 0, 0 }
+ };
+
+-static int lastcolmod;
++static int lastcolmod;
+
+ int
+-markall(char *buf, int f)
++markall(buf, f)
++ char buf[];
++ int f;
+ {
+- char **np;
+- int i;
+- struct message *mp;
++ register char **np;
++ register int i;
++ register struct message *mp;
+ char *namelist[NMLSIZE], *bufp;
+ int tok, beg, mc, star, other, valdot, colmod, colresult;
+
+@@ -141,7 +145,7 @@
+ case TNUMBER:
+ number:
+ if (star) {
+- puts("No numbers mixed with *");
++ printf("No numbers mixed with *\n");
+ return(-1);
+ }
+ mc++;
+@@ -168,14 +172,14 @@
+
+ case TPLUS:
+ if (beg != 0) {
+- puts("Non-numeric second argument");
++ printf("Non-numeric second argument\n");
+ return(-1);
+ }
+ i = valdot;
+ do {
+ i++;
+ if (i > msgCount) {
+- puts("Referencing beyond EOF");
++ printf("Referencing beyond EOF\n");
+ return(-1);
+ }
+ } while ((message[i - 1].m_flag & MDELETED) != f);
+@@ -188,7 +192,7 @@
+ do {
+ i--;
+ if (i <= 0) {
+- puts("Referencing before 1");
++ printf("Referencing before 1\n");
+ return(-1);
+ }
+ } while ((message[i - 1].m_flag & MDELETED) != f);
+@@ -198,7 +202,7 @@
+
+ case TSTRING:
+ if (beg != 0) {
+- puts("Non-numeric second argument");
++ printf("Non-numeric second argument\n");
+ return(-1);
+ }
+ other++;
+@@ -210,11 +214,9 @@
+ return(-1);
+ }
+ colmod |= colresult;
+- } else {
+- if ((com->c_argtype & ~(F|P|I|M|T|W|R))
+- != (MSGLIST|STRLIST))
+- *np++ = savestr(lexstring);
+ }
++ else
++ *np++ = savestr(lexstring);
+ break;
+
+ case TDOLLAR:
+@@ -227,19 +229,19 @@
+
+ case TSTAR:
+ if (other) {
+- puts("Can't mix \"*\" with anything");
++ printf("Can't mix \"*\" with anything\n");
+ return(-1);
+ }
+ star++;
+ break;
+
+ case TERROR:
+- return(-1);
++ return -1;
+ }
+ tok = scan(&bufp);
+ }
+ lastcolmod = colmod;
+- *np = NULL;
++ *np = NOSTR;
+ mc = 0;
+ if (star) {
+ for (i = 0; i < msgCount; i++)
+@@ -248,7 +250,7 @@
+ mc++;
+ }
+ if (mc == 0) {
+- puts("No applicable messages.");
++ printf("No applicable messages.\n");
+ return(-1);
+ }
+ return(0);
+@@ -259,6 +261,7 @@
+ * so that we can unmark any whose sender was not selected
+ * if any user names were given.
+ */
++
+ if ((np > namelist || colmod != 0) && mc == 0)
+ for (i = 1; i <= msgCount; i++)
+ if ((message[i-1].m_flag & MDELETED) == f)
+@@ -268,9 +271,10 @@
+ * If any names were given, go through and eliminate any
+ * messages whose senders were not requested.
+ */
++
+ if (np > namelist) {
+ for (i = 1; i <= msgCount; i++) {
+- for (mc = 0, np = &namelist[0]; *np != NULL; np++)
++ for (mc = 0, np = &namelist[0]; *np != NOSTR; np++)
+ if (**np == '/') {
+ if (matchsubj(*np, i)) {
+ mc++;
+@@ -290,6 +294,7 @@
+ /*
+ * Make sure we got some decent messages.
+ */
++
+ mc = 0;
+ for (i = 1; i <= msgCount; i++)
+ if (message[i-1].m_flag & MMARK) {
+@@ -299,9 +304,9 @@
+ if (mc == 0) {
+ printf("No applicable messages from {%s",
+ namelist[0]);
+- for (np = &namelist[1]; *np != NULL; np++)
++ for (np = &namelist[1]; *np != NOSTR; np++)
+ printf(", %s", *np);
+- puts("}");
++ printf("}\n");
+ return(-1);
+ }
+ }
+@@ -310,9 +315,10 @@
+ * If any colon modifiers were given, go through and
+ * unmark any messages which do not satisfy the modifiers.
+ */
++
+ if (colmod != 0) {
+ for (i = 1; i <= msgCount; i++) {
+- struct coltab *colp;
++ register struct coltab *colp;
+
+ mp = &message[i - 1];
+ for (colp = &coltab[0]; colp->co_char; colp++)
+@@ -320,18 +326,19 @@
+ if ((mp->m_flag & colp->co_mask)
+ != colp->co_equal)
+ unmark(i);
++
+ }
+ for (mp = &message[0]; mp < &message[msgCount]; mp++)
+ if (mp->m_flag & MMARK)
+ break;
+ if (mp >= &message[msgCount]) {
+- struct coltab *colp;
++ register struct coltab *colp;
+
+- fputs("No messages satisfy", stdout);
++ printf("No messages satisfy");
+ for (colp = &coltab[0]; colp->co_char; colp++)
+ if (colp->co_bit & colmod)
+ printf(" :%c", colp->co_char);
+- putchar('\n');
++ printf("\n");
+ return(-1);
+ }
+ }
+@@ -343,9 +350,10 @@
+ * value.
+ */
+ int
+-evalcol(int col)
++evalcol(col)
++ int col;
+ {
+- struct coltab *colp;
++ register struct coltab *colp;
+
+ if (col == 0)
+ return(lastcolmod);
+@@ -361,9 +369,10 @@
+ * has to be undeleted.
+ */
+ int
+-check(int mesg, int f)
++check(mesg, f)
++ int mesg, f;
+ {
+- struct message *mp;
++ register struct message *mp;
+
+ if (mesg < 1 || mesg > msgCount) {
+ printf("%d: Invalid message number\n", mesg);
+@@ -382,15 +391,14 @@
+ * for a RAWLIST.
+ */
+ int
+-getrawlist(char *line, char **argv, int argc)
++getrawlist(line, argv, argc)
++ char line[];
++ char **argv;
++ int argc;
+ {
+- char c, *cp, *cp2, quotec;
++ register char c, *cp, *cp2, quotec;
+ int argn;
+- char *linebuf;
+- size_t linebufsize = BUFSIZ;
+-
+- if ((linebuf = (char *)malloc(linebufsize)) == NULL)
+- errx(1, "Out of memory");
++ char linebuf[BUFSIZ];
+
+ argn = 0;
+ cp = line;
+@@ -400,20 +408,13 @@
+ if (*cp == '\0')
+ break;
+ if (argn >= argc - 1) {
+- puts("Too many elements in the list; excess discarded.");
++ printf(
++ "Too many elements in the list; excess discarded.\n");
+ break;
+ }
+ cp2 = linebuf;
+ quotec = '\0';
+ while ((c = *cp) != '\0') {
+- /* Alloc more space if necessary */
+- if (cp2 - linebuf == linebufsize - 1) {
+- linebufsize += BUFSIZ;
+- linebuf = (char *)realloc(linebuf, linebufsize);
+- if (linebuf == NULL)
+- errx(1, "Out of memory");
+- cp2 = linebuf + linebufsize - BUFSIZ - 1;
+- }
+ cp++;
+ if (quotec != '\0') {
+ if (c == quotec)
+@@ -478,17 +479,17 @@
+ *cp2 = '\0';
+ argv[argn++] = savestr(linebuf);
+ }
+- argv[argn] = NULL;
+- (void)free(linebuf);
+- return(argn);
++ argv[argn] = NOSTR;
++ return argn;
+ }
+
+ /*
+- * Scan out a single lexical item and return its token number,
++ * scan out a single lexical item and return its token number,
+ * updating the string pointer passed **p. Also, store the value
+ * of the number or string scanned in lexnumber or lexstring as
+ * appropriate. In any event, store the scanned `thing' in lexstring.
+ */
++
+ struct lex {
+ char l_char;
+ char l_token;
+@@ -505,15 +506,17 @@
+ };
+
+ int
+-scan(char **sp)
++scan(sp)
++ char **sp;
+ {
+- char *cp, *cp2;
+- int c;
+- struct lex *lp;
++ register char *cp, *cp2;
++ register int c;
++ register struct lex *lp;
+ int quotec;
+
+ if (regretp >= 0) {
+- istrcpy(lexstring, string_stack[regretp], STRINGLEN);
++ strncpy(lexstring, string_stack[regretp], STRINGLEN);
++ lexstring[STRINGLEN-1]='\0';
+ lexnumber = numberstack[regretp];
+ return(regretstack[regretp--]);
+ }
+@@ -524,6 +527,7 @@
+ /*
+ * strip away leading white space.
+ */
++
+ while (c == ' ' || c == '\t')
+ c = *cp++;
+
+@@ -531,6 +535,7 @@
+ * If no characters remain, we are at end of line,
+ * so report that.
+ */
++
+ if (c == '\0') {
+ *sp = --cp;
+ return(TEOL);
+@@ -541,6 +546,7 @@
+ * the number and convert it on the fly.
+ * Return TNUMBER when done.
+ */
++
+ if (isdigit(c)) {
+ lexnumber = 0;
+ while (isdigit(c)) {
+@@ -557,6 +563,7 @@
+ * Check for single character tokens; return such
+ * if found.
+ */
++
+ for (lp = &singles[0]; lp->l_char != 0; lp++)
+ if (c == lp->l_char) {
+ lexstring[0] = c;
+@@ -572,6 +579,7 @@
+ * If the lead character is a " or ', save it
+ * and scan until you get another.
+ */
++
+ quotec = 0;
+ if (c == '\'' || c == '"') {
+ quotec = c;
+@@ -590,7 +598,7 @@
+ }
+ if (quotec && c == 0) {
+ fprintf(stderr, "Missing %c\n", quotec);
+- return(TERROR);
++ return TERROR;
+ }
+ *sp = --cp;
+ *cp2 = '\0';
+@@ -601,11 +609,11 @@
+ * Unscan the named token by pushing it onto the regret stack.
+ */
+ void
+-regret(int token)
++regret(token)
++ int token;
+ {
+-
+ if (++regretp >= REGDEP)
+- errx(1, "Too many regrets");
++ panic("Too many regrets");
+ regretstack[regretp] = token;
+ lexstring[STRINGLEN-1] = '\0';
+ string_stack[regretp] = savestr(lexstring);
+@@ -616,9 +624,8 @@
+ * Reset all the scanner global variables.
+ */
+ void
+-scaninit(void)
++scaninit()
+ {
+-
+ regretp = -1;
+ }
+
+@@ -627,21 +634,22 @@
+ * its message number.
+ */
+ int
+-first(int f, int m)
++first(f, m)
++ int f, m;
+ {
+- struct message *mp;
++ register struct message *mp;
+
+ if (msgCount == 0)
+- return(0);
++ return 0;
+ f &= MDELETED;
+ m &= MDELETED;
+ for (mp = dot; mp < &message[msgCount]; mp++)
+ if ((mp->m_flag & m) == f)
+- return(mp - message + 1);
++ return mp - message + 1;
+ for (mp = dot-1; mp >= &message[0]; mp--)
+ if ((mp->m_flag & m) == f)
+- return(mp - message + 1);
+- return(0);
++ return mp - message + 1;
++ return 0;
+ }
+
+ /*
+@@ -649,12 +657,14 @@
+ * if so.
+ */
+ int
+-matchsender(char *str, int mesg)
++matchsender(str, mesg)
++ char *str;
++ int mesg;
+ {
+- char *cp, *cp2, *backup;
++ register char *cp, *cp2, *backup;
+
+ if (!*str) /* null string matches nothing instead of everything */
+- return(0);
++ return 0;
+ backup = cp2 = nameof(&message[mesg - 1], 0);
+ cp = str;
+ while (*cp2) {
+@@ -669,83 +679,45 @@
+ }
+
+ /*
+- * See if the passed name received the passed message number. Return true
+- * if so.
+- */
+-static char *to_fields[] = { "to", "cc", "bcc", NULL };
+-
+-int
+-matchto(char *str, int mesg)
+-{
+- struct message *mp;
+- char *cp, *cp2, *backup, **to;
+-
+- str++;
+-
+- if (*str == 0) /* null string matches nothing instead of everything */
+- return(0);
+-
+- mp = &message[mesg-1];
+-
+- for (to = to_fields; *to; to++) {
+- cp = str;
+- cp2 = hfield(*to, mp);
+- if (cp2 != NULL) {
+- backup = cp2;
+- while (*cp2) {
+- if (*cp == 0)
+- return(1);
+- if (raise(*cp++) != raise(*cp2++)) {
+- cp2 = ++backup;
+- cp = str;
+- }
+- }
+- if (*cp == 0)
+- return(1);
+- }
+- }
+- return(0);
+-}
+-
+-/*
+ * See if the given string matches inside the subject field of the
+ * given message. For the purpose of the scan, we ignore case differences.
+ * If it does, return true. The string search argument is assumed to
+ * have the form "/search-string." If it is of the form "/," we use the
+ * previous search string.
+ */
+-char lastscan[STRINGLEN];
+
++char lastscan[128];
+ int
+-matchsubj(char *str, int mesg)
++matchsubj(str, mesg)
++ char *str;
++ int mesg;
+ {
+- struct message *mp;
+- char *cp, *cp2, *backup;
++ register struct message *mp;
++ register char *cp, *cp2, *backup;
+
+ str++;
+- if (*str == '\0')
++ if (strlen(str) == 0) {
+ str = lastscan;
+- else
+- istrcpy(lastscan, str, sizeof(lastscan));
++ } else {
++ strncpy(lastscan, str, 128);
++ lastscan[127]='\0';
++ }
+ mp = &message[mesg-1];
+
+ /*
+ * Now look, ignoring case, for the word in the string.
+ */
+- if (value("searchheaders") && (cp = strchr(str, ':'))) {
+- /* Check for special case "/To:" */
+- if (raise(str[0]) == 'T' && raise(str[1]) == 'O' &&
+- str[2] == ':')
+- return(matchto(cp, mesg));
++
++ if (value("searchheaders") && (cp = index(str, ':'))) {
+ *cp++ = '\0';
+- cp2 = hfield(*str ? str : "subject", mp);
++ cp2 = hfield(str, mp);
+ cp[-1] = ':';
+ str = cp;
+ } else {
+ cp = str;
+ cp2 = hfield("subject", mp);
+ }
+- if (cp2 == NULL)
++ if (cp2 == NOSTR)
+ return(0);
+ backup = cp2;
+ while (*cp2) {
+@@ -763,13 +735,14 @@
+ * Mark the named message by setting its mark bit.
+ */
+ void
+-mark(int mesg)
++mark(mesg)
++ int mesg;
+ {
+- int i;
++ register int i;
+
+ i = mesg;
+ if (i < 1 || i > msgCount)
+- errx(1, "Bad message number to mark");
++ panic("Bad message number to mark");
+ message[i-1].m_flag |= MMARK;
+ }
+
+@@ -777,13 +750,14 @@
+ * Unmark the named message.
+ */
+ void
+-unmark(int mesg)
++unmark(mesg)
++ int mesg;
+ {
+- int i;
++ register int i;
+
+ i = mesg;
+ if (i < 1 || i > msgCount)
+- errx(1, "Bad message number to unmark");
++ panic("Bad message number to unmark");
+ message[i-1].m_flag &= ~MMARK;
+ }
+
+@@ -791,10 +765,11 @@
+ * Return the message number corresponding to the passed meta character.
+ */
+ int
+-metamess(int meta, int f)
++metamess(meta, f)
++ int meta, f;
+ {
+- int c, m;
+- struct message *mp;
++ register int c, m;
++ register struct message *mp;
+
+ c = meta;
+ switch (c) {
+@@ -805,7 +780,7 @@
+ for (mp = &message[0]; mp < &message[msgCount]; mp++)
+ if ((mp->m_flag & MDELETED) == f)
+ return(mp - &message[0] + 1);
+- puts("No applicable messages");
++ printf("No applicable messages\n");
+ return(-1);
+
+ case '$':
+@@ -815,11 +790,11 @@
+ for (mp = &message[msgCount-1]; mp >= &message[0]; mp--)
+ if ((mp->m_flag & MDELETED) == f)
+ return(mp - &message[0] + 1);
+- puts("No applicable messages");
++ printf("No applicable messages\n");
+ return(-1);
+
+ case '.':
+- /*
++ /*
+ * Current message.
+ */
+ m = dot - &message[0] + 1;
+diff -urN mailx-8.1.1.orig/mail.1 mailx-8.1.1/mail.1
+--- mailx-8.1.1.orig/mail.1 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/mail.1 2003-03-26 13:03:40.000000000 -0800
+@@ -1,5 +1,4 @@
+-.\" $OpenBSD: mail.1,v 1.35 2002/11/14 02:57:28 deraadt Exp $
+-.\"
++.\" $OpenBSD: mail.1,v 1.5 1994/06/29 05:09:32 deraadt Exp $
+ .\" Copyright (c) 1980, 1990, 1993
+ .\" The Regents of the University of California. All rights reserved.
+ .\"
+@@ -31,24 +30,21 @@
+ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ .\" SUCH DAMAGE.
+ .\"
+-.\" @(#)mail.1 8.8 (Berkeley) 4/28/95
++.\" from: @(#)mail.1 8.2 (Berkeley) 12/30/93
+ .\"
+-.Dd April 28, 1995
++.Dd December 30, 1993
+ .Dt MAIL 1
+-.Os
++.Os BSD 4
+ .Sh NAME
+-.Nm mail ,
+-.Nm mailx ,
+-.Nm Mail
++.Nm mail
+ .Nd send and receive mail
+ .Sh SYNOPSIS
+ .Nm mail
+ .Op Fl iInv
+ .Op Fl s Ar subject
+-.Op Fl c Ar list
+-.Op Fl b Ar list
+-.Ar to-addr Op Ar ...
+-.Op Fl Ar sendmail-options Op Ar ...
++.Op Fl c Ar cc-addr
++.Op Fl b Ar bcc-addr
++.Ar to-addr...
+ .Nm mail
+ .Op Fl iInNv
+ .Fl f
+@@ -56,15 +52,14 @@
+ .Nm mail
+ .Op Fl iInNv
+ .Op Fl u Ar user
+-.Sh DESCRIPTION
+-.Nm mail
+-is an intelligent mail processing system which has
++.Sh INTRODUCTION
++.Nm Mail
++is an intelligent mail processing system, which has
+ a command syntax reminiscent of
+ .Xr \&ed 1
+ with lines replaced by messages.
+ .Pp
+-The options are as follows:
+-.Bl -tag -width Ds
++.Bl -tag -width flag
+ .It Fl v
+ Verbose mode.
+ The details of
+@@ -76,66 +71,46 @@
+ .Nm mail
+ on noisy phone lines.
+ .It Fl I
+-Forces
+-.Nm mail
+-to run in interactive mode, even when input is not a terminal.
+-In particular, the special
+-.Ic \&~
+-command character, used when sending mail, is only available interactively.
++Forces mail to run in interactive mode even when
++input isn't a terminal.
++In particular, the
++.Sq Ic \&~
++special
++character when sending mail is only active in interactive mode.
+ .It Fl n
+ Inhibits reading
+ .Pa /etc/mail.rc
+ upon startup.
+ .It Fl N
+-Inhibits initial display of message headers
++Inhibits the initial display of message headers
+ when reading mail or editing a mail folder.
+-.It Fl s Ar subject
++.It Fl s
+ Specify subject on command line
+ (only the first argument after the
+ .Fl s
+ flag is used as a subject; be careful to quote subjects
+-containing spaces).
+-.It Fl c Ar list
++containing spaces.)
++.It Fl c
+ Send carbon copies to
+ .Ar list
+ of users.
+-.Ar list
+-should be a comma separated list of names.
+-.It Fl b Ar list
++.It Fl b
+ Send blind carbon copies to
+ .Ar list .
+-.It Fl f Ar name
+-Read in the contents of your mailbox
+-(or the specified file
+-.Ar name )
+-for processing; when you quit,
++List should be a comma-separated list of names.
++.It Fl f
++Read in the contents of your
++.Ar mbox
++(or the specified file)
++for processing; when you
++.Ar quit ,
+ .Nm mail
+ writes undeleted messages back to this file.
+-.It Fl u Ar user
++.It Fl u
+ Is equivalent to:
+ .Pp
+-.Dl $ mail -f /var/mail/user
+-.Pp
+-except that locking is done.
++.Dl mail -f /var/spool/mail/user
+ .El
+-.Ss Startup actions
+-At startup time,
+-.Nm mail
+-will execute commands in the system command files
+-.Pa /usr/share/misc/mail.rc ,
+-.Pa /usr/local/etc/mail.rc
+-and
+-.Pa /etc/mail.rc
+-in order unless explicitly told not to by using the
+-.Fl n
+-option.
+-Next, the commands in the user's personal command file
+-.Pa ~/.mailrc
+-are executed.
+-.Nm mail
+-then examines its command line options to determine whether the user
+-requested a new message to be sent or existing messages in a mailbox
+-to be examined.
+ .Ss Sending mail
+ To send a message to one or more people,
+ .Nm mail
+@@ -143,56 +118,56 @@
+ whom the mail will be sent.
+ You are then expected to type in
+ your message, followed
+-by a control-D
+-.Pq Sq ^D
++by an
++.Sq Li control\-D
+ at the beginning of a line.
+-The section below,
++The section below
+ .Ar Replying to or originating mail ,
+ describes some features of
+ .Nm mail
+ available to help you compose your letter.
+ .Pp
+ .Ss Reading mail
+-In normal usage,
++In normal usage
+ .Nm mail
+ is given no arguments and checks your mail out of the
+ post office, then
+ prints out a one line header of each message found.
+-The current message is initially set to the first message (numbered 1)
++The current message is initially the first message (numbered 1)
+ and can be printed using the
+ .Ic print
+ command (which can be abbreviated
+-.Ic p ) .
+-Moving among the messages is much like moving between lines in
+-.Xr ed 1 ;
+-you may use
+-.Ic \&+
++.Ql Ic p ) .
++You can move among the messages much as you move between lines in
++.Xr \&ed 1 ,
++with the commands
++.Ql Ic \&+
+ and
+-.Ic \&-
+-to shift forwards and backwards, or simply enter a message number to move
+-directly.
++.Ql Ic \&\-
++moving backwards and forwards, and
++simple numbers.
+ .Pp
+-.Ss Disposing of mail
++.Ss Disposing of mail.
+ After examining a message you can
+ .Ic delete
+-.Pq Ic d
+-or
++.Ql Ic d )
++the message or
+ .Ic reply
+-.Pq Ic r
++.Ql Ic r )
+ to it.
+ Deletion causes the
+ .Nm mail
+ program to forget about the message.
+ This is not irreversible; the message can be
+ .Ic undeleted
+-.Pq Ic u
++.Ql Ic u )
+ by giving its number, or the
+ .Nm mail
+ session can be aborted by giving the
+ .Ic exit
+-.Pq Ic x
++.Ql Ic x )
+ command.
+-Deleted messages, however, will usually disappear, never to be seen again.
++Deleted messages will, however, usually disappear never to be seen again.
+ .Pp
+ .Ss Specifying messages
+ Commands such as
+@@ -202,22 +177,22 @@
+ can be given a list of message numbers as arguments to apply
+ to a number of messages at once.
+ Thus
+-.Ic delete 1 2
++.Dq Li delete 1 2
+ deletes messages 1 and 2, while
+-.Ic delete 1\-5
++.Dq Li delete 1\-5
+ deletes messages 1 through 5.
+ The special name
+-.Sq \&*
+-addresses all messages and
+-.Sq \&$
++.Ql Li \&*
++addresses all messages, and
++.Ql Li \&$
+ addresses
+ the last message; thus the command
+ .Ic top
+ which prints the first few lines of a message could be used in
+-.Ic top \&*
++.Dq Li top \&*
+ to print the first few lines of all messages.
+ .Pp
+-.Ss Replying to or originating mail
++.Ss Replying to or originating mail.
+ You can use the
+ .Ic reply
+ command to
+@@ -227,15 +202,15 @@
+ defines the contents of the message.
+ While you are composing a message,
+ .Nm mail
+-treats lines beginning with the tilde
+-.Pq Sq ~
+-character specially.
++treats lines beginning with the character
++.Ql Ic \&~
++specially.
+ For instance, typing
+-.Ic ~m
++.Ql Ic \&~m
+ (alone on a line) will place a copy
+-of the current message into the response, right shifting it by a single
+-tab-stop (see
+-.Va indentprefix
++of the current message into the response right shifting it by a tabstop
++(see
++.Em indentprefix
+ variable, below).
+ Other escapes will set up subject fields, add and delete recipients
+ to the message and allow you to escape to an editor to revise the
+@@ -243,22 +218,23 @@
+ (These options
+ are given in the summary below.)
+ .Pp
+-.Ss Ending a mail processing session
++.Ss Ending a mail processing session.
+ You can end a
+ .Nm mail
+ session with the
+ .Ic quit
+-.Pq Ic q
++.Ql Ic q )
+ command.
+ Messages which have been examined go to your
+ .Ar mbox
+ file unless they have been deleted in which case they are discarded.
+-Unexamined messages go back to the post office (see the
++Unexamined messages go back to the post office.
++(See the
+ .Fl f
+ option above).
+ .Pp
+-.Ss Personal and system wide distribution lists
+-It is also possible to create personal distribution lists so that,
++.Ss Personal and systemwide distribution lists.
++It is also possible to create a personal distribution lists so that,
+ for instance, you can send mail to
+ .Dq Li cohorts
+ and have it go
+@@ -273,46 +249,46 @@
+ The current list of such aliases can be displayed with the
+ .Ic alias
+ command in
+-.Nm mail .
++.Nm mail .
+ System wide distribution lists can be created by editing
+-.Pa /etc/mail/aliases ,
+-(see
+-.Xr aliases 5
++.Pa /etc/aliases ,
++see
++.Xr aliases 5
+ and
+-.Xr sendmail 8 ) ;
++.Xr sendmail 8 ;
+ these are kept in a different syntax.
+ In mail you send, personal aliases will be expanded in mail sent
+ to others so that they will be able to
+ .Ic reply
+ to the recipients.
+-System wide aliases
++System wide
++.Ic aliases
+ are not expanded when the mail is sent,
+ but any reply returned to the machine will have the system wide
+ alias expanded as all mail goes through
+-.Xr sendmail .
++.Xr sendmail .
+ .Pp
+ .Ss Network mail (ARPA, UUCP, Berknet)
+ See
+ .Xr mailaddr 7
+ for a description of network addresses.
+ .Pp
+-.Nm mail
++.Nm Mail
+ has a number of options which can be set in the
+ .Pa .mailrc
+ file to alter its behavior; thus
+-.Ic set askcc
++.Dq Li set askcc
+ enables the
+ .Ar askcc
+ feature.
+ (These options are summarized below.)
+ .Sh SUMMARY
+-(Adapted from the
+-.Dq Mail Reference Manual . )
++(Adapted from the `Mail Reference Manual')
+ .Pp
+ Each command is typed on a line by itself, and may take arguments
+ following the command word.
+ The command need not be typed in its
+-entirety -- the first command which matches the typed prefix is used.
++entirety \- the first command which matches the typed prefix is used.
+ For commands which take message lists as arguments, if no message
+ list is given, then the next message forward which satisfies the
+ command's requirements is used.
+@@ -321,7 +297,7 @@
+ good messages at all,
+ .Nm mail
+ types
+-.Dq Li \&No applicable messages
++.Dq Li No applicable messages
+ and
+ aborts the command.
+ .Bl -tag -width delete
+@@ -329,9 +305,9 @@
+ Print out the preceding message.
+ If given a numeric
+ argument
+-.Ar n ,
++.Ar n ,
+ goes to the
+-.Ar n Ns th
++.Ar n Ns 'th
+ previous message and prints it.
+ .It Ic \&?
+ Prints a brief summary of commands.
+@@ -364,7 +340,7 @@
+ command.
+ .It Ic alias
+ .Pq Ic a
+-With no arguments, prints out all currently defined aliases.
++With no arguments, prints out all currently-defined aliases.
+ With one
+ argument, prints out that alias.
+ With more than one argument, creates
+@@ -406,7 +382,7 @@
+ .Pq Ic d
+ Takes a list of messages as argument and marks them all as deleted.
+ Deleted messages will not be saved in
+-.Ar mbox ,
++.Ar mbox ,
+ nor will they be available for most other commands.
+ .It Ic dp
+ (also
+@@ -425,15 +401,15 @@
+ .Pf ( Ic ex
+ or
+ .Ic x )
+-Effects an immediate return to the shell without
++Effects an immediate return to the Shell without
+ modifying the user's system mailbox, his
+ .Ar mbox
+ file, or his edit file in
+-.Fl f .
++.Fl f .
+ .It Ic file
+ .Pq Ic fi
+ The same as
+-.Ic folder .
++.Ic folder .
+ .It Ic folders
+ List the names of the folders in your folder directory.
+ .It Ic folder
+@@ -464,14 +440,13 @@
+ If
+ a
+ .Ql \&+
+-argument is given, the next 18\-message group is printed; if
++argument is given, then the next 18\-message group is printed, and if
+ a
+ .Ql \&\-
+ argument is given, the previous 18\-message group is printed.
+ .It Ic help
+ A synonym for
+-.Ic \&? .
+-.ne li
++.Ic \&?
+ .It Ic hold
+ .Pf ( Ic ho ,
+ also
+@@ -479,7 +454,7 @@
+ Takes a message list and marks each
+ message therein to be saved in the
+ user's system mailbox instead of in
+-.Ar mbox .
++.Ar mbox .
+ Does not override the
+ .Ic delete
+ command.
+@@ -501,13 +476,6 @@
+ .Ic ignore
+ is executed with no arguments, it lists the current set of
+ ignored fields.
+-.It Ic inc
+-Incorporate any new messages that have arrived while mail
+-is being read.
+-The new messages are added to the end of the message list,
+-and the current message is reset to be the first new mail message.
+-This does not renumber the existing message list, nor
+-does it cause any changes made so far to be saved.
+ .It Ic mail
+ .Pq Ic m
+ Takes as argument login names and distribution group names and sends
+@@ -522,12 +490,9 @@
+ have the
+ .Ic hold
+ option set.
+-.It Ic more
+-.Pq Ic \mo
+-Takes a message list and invokes the pager on that list.
+ .It Ic next
+ .Pq Ic n
+-(like
++like
+ .Ic \&+
+ or
+ .Tn CR )
+@@ -536,7 +501,7 @@
+ .It Ic preserve
+ .Pq Ic pre
+ A synonym for
+-.Ic hold .
++.Ic hold .
+ .It Ic print
+ .Pq Ic p
+ Takes a message list and types out each message on the user's terminal.
+@@ -559,7 +524,7 @@
+ mailbox file with the
+ .Fl f
+ flag, then the edit file is rewritten.
+-A return to the shell is
++A return to the Shell is
+ effected, unless the rewrite of edit file fails, in which case the user
+ can escape with the
+ .Ic exit
+@@ -571,10 +536,10 @@
+ The default message must not be deleted.
+ .It Ic respond
+ A synonym for
+-.Ic reply .
++.Ic reply .
+ .It Ic retain
+ Add the list of header fields named to the
+-.Ar retained list .
++.Ar retained list
+ Only the header fields in the retain list
+ are shown on your terminal when you print a message.
+ All other header fields are suppressed.
+@@ -603,10 +568,10 @@
+ (no space before or after =) or
+ .Ar option .
+ Quotation marks may be placed around any part of the assignment statement to
+-quote blanks or tabs, i.e.,
+-.Ic set indentprefix="->" .
++quote blanks or tabs, i.e.
++.Dq Li "set indentprefix=\*q->\*q"
+ .It Ic saveignore
+-.Ic saveignore
++.Ic Saveignore
+ is to
+ .Ic save
+ what
+@@ -614,15 +579,14 @@
+ is to
+ .Ic print
+ and
+-.Ic type .
++.Ic type .
+ Header fields thus marked are filtered out when
+ saving a message by
+ .Ic save
+ or when automatically saving to
+-.Ar mbox .
+-.pl +1
++.Ar mbox .
+ .It Ic saveretain
+-.Ic saveretain
++.Ic Saveretain
+ is to
+ .Ic save
+ what
+@@ -630,15 +594,15 @@
+ is to
+ .Ic print
+ and
+-.Ic type .
++.Ic type .
+ Header fields thus marked are the only ones saved
+ with a message when saving by
+ .Ic save
+ or when automatically saving to
+-.Ar mbox .
+-.Ic saveretain
++.Ar mbox .
++.Ic Saveretain
+ overrides
+-.Ic saveignore .
++.Ic saveignore .
+ .It Ic shell
+ .Pq Ic sh
+ Invokes an interactive version of the shell.
+@@ -659,7 +623,7 @@
+ .It Ic type
+ .Pq Ic t
+ A synonym for
+-.Ic print .
++.Ic print .
+ .It Ic unalias
+ Takes a list of names defined by
+ .Ic alias
+@@ -679,28 +643,27 @@
+ .It Ic unset
+ Takes a list of option names and discards their remembered values;
+ the inverse of
+-.Ic set .
++.Ic set .
+ .It Ic visual
+ .Pq Ic v
+ Takes a message list and invokes the display editor on each message.
+ .It Ic write
+ .Pq Ic w
+ Similar to
+-.Ic save ,
++.Ic save ,
+ except that
+ .Ic only
+ the message body
+-.Pf ( Ar without
+-the header)
+-is saved.
++.Pq Ar without
++the header) is saved.
+ Extremely useful for such tasks as sending and receiving source
+ program text over the message system.
+ .It Ic xit
+ .Pq Ic x
+ A synonym for
+-.Ic exit .
++.Ic exit .
+ .It Ic z
+-.Nm mail
++.Nm Mail
+ presents message headers in windowfuls as described under the
+ .Ic headers
+ command.
+@@ -710,16 +673,17 @@
+ .Ic \&z
+ command.
+ Also, you can move to the previous window by using
+-.Ic \&z\&\- .
++.Ic \&z\&\- .
+ .El
+-.Ss Tilde/escapes
++.Ss Tilde/Escapes
++.Pp
+ Here is a summary of the tilde escapes,
+ which are used when composing messages to perform
+ special functions.
+ Tilde escapes are only recognized at the beginning
+ of lines.
+ The name
+-.Dq tilde escape
++.Dq Em tilde\ escape
+ is somewhat of a misnomer since the actual escape character can be set
+ by the option
+ .Ic escape .
+@@ -733,7 +697,7 @@
+ Add the given names to the list of carbon copy recipients.
+ .It Ic \&~d
+ Read the file
+-.Pa dead.letter
++.Dq Pa dead.letter
+ from your home directory into the message.
+ .It Ic \&~e
+ Invoke the text editor on the message collected so far.
+@@ -748,7 +712,6 @@
+ or
+ .Ic retain
+ command) are not included.
+-.ne li
+ .It Ic \&~F Ns Ar messages
+ Identical to
+ .Ic \&~f ,
+@@ -760,7 +723,7 @@
+ .It Ic \&~m Ns Ar messages
+ Read the named messages into the message being sent, indented by a
+ tab or by the value of
+-.Va indentprefix .
++.Ar indentprefix .
+ If no messages are specified,
+ read the current message.
+ Message headers currently being ignored (by the
+@@ -777,7 +740,7 @@
+ fields.
+ .It Ic \&~q
+ Abort the message being sent, copying the message to
+-.Pa dead.letter
++.Dq Pa dead.letter
+ in your home directory if
+ .Ic save
+ is set.
+@@ -817,7 +780,7 @@
+ you have changed the escape character, then you should double
+ that character in order to send it.
+ .El
+-.Ss Mail options
++.Ss Mail Options
+ Options are controlled via
+ .Ic set
+ and
+@@ -834,24 +797,17 @@
+ to be appended to the end rather than prepended.
+ This should always be set (perhaps in
+ .Pa /etc/mail.rc ) .
+-.It Ar ask , asksub
++.It Ar ask, asksub
+ Causes
+ .Nm mail
+ to prompt you for the subject of each message you send.
+ If
+ you respond with simply a newline, no subject field will be sent.
+-.ne li
+ .It Ar askcc
+ Causes you to be prompted for additional carbon copy recipients at the
+ end of each message.
+ Responding with a newline indicates your
+ satisfaction with the current list.
+-.It Ar autoinc
+-Causes new mail to be automatically incorporated when it arrives.
+-Setting this is similar to issuing the
+-.Ic inc
+-command at each prompt, except that the current message is not
+-reset when new mail arrives.
+ .It Ar askbcc
+ Causes you to be prompted for additional blind carbon copy recipients at the
+ end of each message.
+@@ -861,8 +817,8 @@
+ Causes the
+ .Ic delete
+ command to behave like
+-.Ic dp ;
+-thus, after deleting a message, the next one will be typed
++.Ic dp
++\- thus, after deleting a message, the next one will be typed
+ automatically.
+ .It Ar debug
+ Setting the binary option
+@@ -872,7 +828,7 @@
+ on the command line and causes
+ .Nm mail
+ to output all sorts of information useful for debugging
+-.Nm mail .
++.Nm mail .
+ .It Ar dot
+ The binary option
+ .Ar dot
+@@ -894,7 +850,7 @@
+ which makes
+ .Nm mail
+ refuse to accept a control-d as the end of a message.
+-.Ar ignoreeof
++.Ar Ignoreeof
+ also applies to
+ .Nm mail
+ command mode.
+@@ -915,7 +871,7 @@
+ (erase or delete)
+ .Nm mail
+ copies the partial letter to the file
+-.Pa dead.letter
++.Dq Pa dead.letter
+ in your home directory.
+ Setting the binary option
+ .Ar nosave
+@@ -929,39 +885,9 @@
+ .It Ar quiet
+ Suppresses the printing of the version when first invoked.
+ .It Ar searchheaders
+-If this option is set, then a message-list specifier in the form
+-.Dq /x:y
+-will expand to all messages containing the substring
+-.Dq y
+-in the header
+-field
+-.Dq x .
+-The string search is case insensitive.
+-If
+-.Dq x
+-is omitted, it will default to the
+-.Dq Subject
+-header field.
+-The form
+-.Dq /to:y
+-is a special case, and will expand
+-to all messages containing the substring
+-.Dq y
+-in the
+-.Dq To ,
+-.Dq Cc
+-or
+-.Dq Bcc
+-header fields.
+-The check for
+-.Dq to
+-is case sensitive, so that
+-.Dq /To:y
+-can be used to limit the search for
+-.Dq y
+-to just the
+-.Dq To:
+-field.
++If this option is set, then a message-list specifier in the form ``/x:y''
++will expand to all messages containing the substring ``y'' in the header
++field ``x''. The string search is case insensitive.
+ .It Ar verbose
+ Setting the option
+ .Ar verbose
+@@ -972,7 +898,7 @@
+ the actual delivery of messages is displayed on the user's
+ terminal.
+ .El
+-.Ss Option string values
++.Ss Option String Values
+ .Bl -tag -width Va
+ .It Ev EDITOR
+ Pathname of the text editor to use in the
+@@ -1010,7 +936,6 @@
+ command and
+ .Ic \&~v
+ escape.
+-.ne li
+ .It Va crt
+ The valued option
+ .Va crt
+@@ -1030,8 +955,7 @@
+ .It Ar folder
+ The name of the directory to use for storing folders of
+ messages.
+-If this name begins with a
+-.Ql / ,
++If this name begins with a `/',
+ .Nm mail
+ considers it to be an absolute pathname; otherwise, the
+ folder directory is found relative to your home directory.
+@@ -1048,10 +972,8 @@
+ mail.
+ If not defined, then outgoing mail is not so saved.
+ .It Ar indentprefix
+-String used by the
+-.Ic \&~m
+-tilde escape for indenting messages, in place of the normal tab character
+-.Pq Sq ^I
++String used by the ``~m'' tilde escape for indenting messages, in place of
++the normal tab character (^I).
+ Be sure to quote the value if it contains
+ spaces or tabs.
+ .It Ar toplines
+@@ -1061,54 +983,44 @@
+ command; normally, the first five lines are printed.
+ .El
+ .Sh ENVIRONMENT
+-.Nm mail
++.Nm Mail
+ utilizes the
+-.Ev HOME ,
+-.Ev LOGNAME ,
++.Ev HOME
+ and
+ .Ev USER
+ environment variables.
+-.Pp
+-If the
+-.Ev MAIL
+-environment variable is set, its value is used as the path to the
+-user's mail spool.
+ .Sh FILES
+-.Bl -tag -width /usr/share/misc/mail.*help -compact
+-.It Pa /var/mail/*
+-post office (unless overridden by the
+-.Ev MAIL
+-environment variable)
++.Bl -tag -width /usr/lib/mail.*help -compact
++.It Pa /var/spool/mail/*
++Post office.
+ .It ~/mbox
+-user's old mail
++User's old mail.
+ .It ~/.mailrc
+-file giving initial mail commands; can be overridden by setting the
+-.Ev MAILRC
+-environment variable
++File giving initial mail commands.
+ .It Pa /tmp/R*
+-temporary files
+-.It Pa /usr/share/misc/mail.*help
+-help files
++Temporary files.
++.It Pa /usr/lib/mail.*help
++Help files.
+ .It Pa /etc/mail.rc
+-system initialization file
++System initialization file.
+ .El
+ .Sh SEE ALSO
+ .Xr fmt 1 ,
+-.Xr lockspool 1 ,
++.Xr newaliases 1 ,
+ .Xr vacation 1 ,
+ .Xr aliases 5 ,
+ .Xr mailaddr 7 ,
+-.Xr mail.local 8 ,
+-.Xr newaliases 8 ,
+ .Xr sendmail 8
++and
+ .Rs
+-.%T "The Mail Reference Manual"
++.%T "The Mail Reference Manual" .
+ .Re
+ .Sh HISTORY
+ A
+ .Nm mail
+-command appeared in
+-.At v3 .
++command
++appeared in
++.At v6 .
+ This man page is derived from
+ .%T "The Mail Reference Manual"
+ originally written by Kurt Shoens.
+@@ -1117,10 +1029,5 @@
+ Most are
+ not useful to the general user.
+ .Pp
+-Usually,
+-.Nm mail
+-and
+-.Nm mailx
+-are just links to
+-.Nm Mail ,
+-which can be confusing.
++.\" This bug is not the case in this particular distribution.
++.\" Usually, .Nm mail is just a link to .Nm Mail, which can be confusing.
+diff -urN mailx-8.1.1.orig/main.c mailx-8.1.1/main.c
+--- mailx-8.1.1.orig/main.c 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/main.c 2003-03-26 13:03:40.000000000 -0800
+@@ -1,5 +1,5 @@
+-/* $OpenBSD: main.c,v 1.17 2001/11/21 15:28:25 millert Exp $ */
+-/* $NetBSD: main.c,v 1.7 1997/05/13 06:15:57 mikel Exp $ */
++/* $OpenBSD: main.c,v 1.5 1996/06/08 19:48:31 christos Exp $ */
++/* $NetBSD: main.c,v 1.5 1996/06/08 19:48:31 christos Exp $ */
+
+ /*
+ * Copyright (c) 1980, 1993
+@@ -35,53 +35,93 @@
+ */
+
+ #ifndef lint
+-static const char copyright[] =
++static char copyright[] =
+ "@(#) Copyright (c) 1980, 1993\n\
+ The Regents of the University of California. All rights reserved.\n";
+ #endif /* not lint */
+
+ #ifndef lint
+ #if 0
+-static const char sccsid[] = "@(#)main.c 8.2 (Berkeley) 4/20/95";
++static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 6/6/93";
+ #else
+-static const char rcsid[] = "$OpenBSD: main.c,v 1.17 2001/11/21 15:28:25 millert Exp $";
++static char rcsid[] = "$OpenBSD: main.c,v 1.5 1996/06/08 19:48:31 christos Exp $";
+ #endif
+ #endif /* not lint */
+
++/*
++ * Most strcpy/sprintf functions have been changed to strncpy/snprintf to
++ * correct several buffer overruns (at least one ot them was exploitable).
++ * Sat Jun 20 04:58:09 CEST 1998 Alvaro Martinez Echevarria <alvaro@lander.es>
++ */
++
+ #include "rcv.h"
+ #include <fcntl.h>
+ #include <sys/ioctl.h>
+ #include "extern.h"
+
+-/* __dead void usage(void); */
+-int main(int, char **);
+-
+ /*
+ * Mail -- a mail program
+ *
+ * Startup -- interface with user.
+ */
+
++jmp_buf hdrjmp;
++
+ int
+-main(int argc, char **argv)
++main(argc, argv)
++ int argc;
++ char *argv[];
+ {
+- int i;
++ register int i;
+ struct name *to, *cc, *bcc, *smopts;
+ char *subject;
+ char *ef;
++ char* cmd;
+ char nosrc = 0;
+- char *rc;
+- extern const char version[];
++ sig_t prevint;
+
++ /*
++ * Absolutely the first thing we do is save our egid
++ * and set it to the rgid, so that we can safely run
++ * setgid. We use the sgid (saved set-gid) to allow ourselves
++ * to revert to the egid if we want (temporarily) to become
++ * priveliged.
++ */
++ effectivegid = getegid();
++ realgid = getgid();
++ if (setgid (realgid) < 0) {
++ perror("setgid");
++ exit(1);
++ }
++
+ /*
+ * Set up a reasonable environment.
+ * Figure out whether we are being run interactively,
+ * start the SIGCHLD catcher, and so forth.
+ */
+- (void)signal(SIGCHLD, sigchild);
+- (void)signal(SIGPIPE, SIG_IGN);
++ (void) signal(SIGCHLD, sigchild);
+ if (isatty(0))
+ assign("interactive", "");
++
++ /*
++ * Grab some stuff from the environment we might use
++ */
++
++ if (cmd = getenv("PAGER"))
++ assign("PAGER", cmd);
++ if (cmd = getenv("LISTER"))
++ assign("LISTER", cmd);
++ if (cmd = getenv("SHELL"))
++ assign("SHELL", cmd);
++ if (cmd = getenv("EDITOR"))
++ assign("EDITOR", cmd);
++ if (cmd = getenv("VISUAL"))
++ assign("VISUAL", cmd);
++ if (cmd = getenv("MBOX"))
++ assign("MBOX", cmd);
++ if (cmd = getenv("DEAD"))
++ assign("DEAD", cmd);
++
+ image = -1;
+ /*
+ * Now, determine how we are being used.
+@@ -90,13 +130,13 @@
+ * of users to mail to. Argp will be set to point to the
+ * first of these users.
+ */
+- ef = NULL;
+- to = NULL;
+- cc = NULL;
+- bcc = NULL;
+- smopts = NULL;
+- subject = NULL;
+- while ((i = getopt(argc, argv, "INT:b:c:dfins:u:v")) != -1) {
++ ef = NOSTR;
++ to = NIL;
++ cc = NIL;
++ bcc = NIL;
++ smopts = NIL;
++ subject = NOSTR;
++ while ((i = getopt(argc, argv, "INT:b:c:dfins:u:v")) != EOF) {
+ switch (i) {
+ case 'T':
+ /*
+@@ -104,19 +144,17 @@
+ * articles have been read/deleted for netnews.
+ */
+ Tflag = optarg;
+- if ((i = creat(Tflag, 0600)) < 0)
+- err(1, "%s", Tflag);
+- (void)close(i);
++ if ((i = creat(Tflag, 0600)) < 0) {
++ perror(Tflag);
++ exit(1);
++ }
++ close(i);
+ break;
+ case 'u':
+ /*
+ * Next argument is person to pretend to be.
+ */
+- if (strlen(optarg) >= 33)
+- errx(1, "username `%s' too long", optarg);
+- unsetenv("MAIL");
+ myname = optarg;
+- uflag = 1;
+ break;
+ case 'i':
+ /*
+@@ -186,9 +224,14 @@
+ */
+ bcc = cat(bcc, nalloc(optarg, GBCC));
+ break;
+- default:
+- usage();
+- /*NOTREACHED*/
++ case '?':
++ fputs("\
++Usage: mail [-iInv] [-s subject] [-c cc-addr] [-b bcc-addr] to-addr ...\n\
++ [- sendmail-options ...]\n\
++ mail [-iInNv] -f [name]\n\
++ mail [-iInNv] [-u user]\n",
++ stderr);
++ exit(1);
+ }
+ }
+ for (i = optind; (argv[i]) && (*argv[i] != '-'); i++)
+@@ -198,19 +241,14 @@
+ /*
+ * Check for inconsistent arguments.
+ */
+- if (to == NULL && (subject != NULL || cc != NULL || bcc != NULL))
+- errx(1, "You must specify direct recipients with -s, -c, or -b");
+- if (ef != NULL && to != NULL)
+- errx(1, "Cannot give -f and people to send to");
+- /*
+- * Block SIGINT except where we install an explicit handler for it.
+- */
+- sigemptyset(&intset);
+- sigaddset(&intset, SIGINT);
+- (void)sigprocmask(SIG_BLOCK, &intset, NULL);
+- /*
+- * Initialization.
+- */
++ if (to == NIL && (subject != NOSTR || cc != NIL || bcc != NIL)) {
++ fputs("You must specify direct recipients with -s, -c, or -b.\n", stderr);
++ exit(1);
++ }
++ if (ef != NOSTR && to != NIL) {
++ fprintf(stderr, "Cannot give -f and people to send to.\n");
++ exit(1);
++ }
+ tinit();
+ setscreensize();
+ input = stdin;
+@@ -222,9 +260,7 @@
+ * Expand returns a savestr, but load only uses the file name
+ * for fopen, so it's safe to do this.
+ */
+- if ((rc = getenv("MAILRC")) == 0)
+- rc = "~/.mailrc";
+- load(expand(rc));
++ load(expand("~/.mailrc"));
+ if (!rcvmode) {
+ mail(to, cc, bcc, smopts, subject);
+ /*
+@@ -237,25 +273,44 @@
+ * Decide whether we are editing a mailbox or reading
+ * the system mailbox, and open up the right stuff.
+ */
+- if (ef == NULL)
++ if (ef == NOSTR)
+ ef = "%";
+ if (setfile(ef) < 0)
+ exit(1); /* error already reported */
++ if (setjmp(hdrjmp) == 0) {
++ extern char *version;
+
+- if (value("quiet") == NULL)
+- (void)printf("Mail version %s. Type ? for help.\n",
+- version);
+- announce();
+- (void)fflush(stdout);
++ if ((prevint = signal(SIGINT, SIG_IGN)) != SIG_IGN)
++ signal(SIGINT, hdrstop);
++ if (value("quiet") == NOSTR)
++ printf("Mail version %s. Type ? for help.\n",
++ version);
++ announce();
++ fflush(stdout);
++ signal(SIGINT, prevint);
++ }
+ commands();
+- (void)ignoresig(SIGHUP, NULL, NULL);
+- (void)ignoresig(SIGINT, NULL, NULL);
+- (void)ignoresig(SIGQUIT, NULL, NULL);
++ signal(SIGHUP, SIG_IGN);
++ signal(SIGINT, SIG_IGN);
++ signal(SIGQUIT, SIG_IGN);
+ quit();
+ exit(0);
+ }
+
+ /*
++ * Interrupt printing of the headers.
++ */
++void
++hdrstop(signo)
++ int signo;
++{
++
++ fflush(stdout);
++ fprintf(stderr, "\nInterrupt\n");
++ longjmp(hdrjmp, 1);
++}
++
++/*
+ * Compute what the screen size for printing headers should be.
+ * We use the following algorithm for the height:
+ * If baud rate < 1200, use 9
+@@ -264,7 +319,7 @@
+ * Width is either 80 or ws_col;
+ */
+ void
+-setscreensize(void)
++setscreensize()
+ {
+ struct termios tbuf;
+ struct winsize ws;
+@@ -273,7 +328,7 @@
+ if (ioctl(1, TIOCGWINSZ, (char *) &ws) < 0)
+ ws.ws_col = ws.ws_row = 0;
+ if (tcgetattr(1, &tbuf) < 0)
+- ospeed = 9600;
++ ospeed = B9600;
+ else
+ ospeed = cfgetospeed(&tbuf);
+ if (ospeed < B1200)
+@@ -289,15 +344,3 @@
+ if ((screenwidth = ws.ws_col) == 0)
+ screenwidth = 80;
+ }
+-
+-usage(void)
+-{
+-
+- fprintf(stderr, "usage: %s [-iInv] [-s subject] [-c cc-addr] "
+- "[-b bcc-addr] to-addr ...\n", __progname);
+- fprintf(stderr, " %*s [- sendmail-options ...]\n",
+- (int)strlen(__progname), "");
+- fprintf(stderr, " %s [-iInNv] -f [name]\n", __progname);
+- fprintf(stderr, " %s [-iInNv] [-u user]\n", __progname);
+- exit(1);
+-}
+diff -urN mailx-8.1.1.orig/misc/mail.help mailx-8.1.1/misc/mail.help
+--- mailx-8.1.1.orig/misc/mail.help 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/misc/mail.help 1996-06-21 21:26:58.000000000 -0700
+@@ -1,37 +1,23 @@
+-Mail Command Description
+-------------------------- --------------------------------------------
+-t [message list] type message(s).
+-n goto and type next message.
+-e [message list] edit message(s).
+-f [message list] give head lines of messages.
+-d [message list] delete message(s).
+-s [message list] <file> append message(s) to file.
+-u [message list] undelete message(s).
+-R [message list] reply to message sender(s).
+-r [message list] reply to message sender(s) and all recipients.
+-p [message list] print message list (pipe to lpr).
+-pre [message list] make messages go back to /var/mail.
+-m <recipient list> mail to specific recipient(s).
+-q quit, saving unresolved messages in mbox.
+-x quit, do not remove system mailbox.
+-h print out active message headers.
+-! shell escape.
+-| [msglist] command pipe message(s) to shell command.
+-pi [msglist] command pipe message(s) to shell command.
++ Mail Commands
++t <message list> type messages
++n goto and type next message
++e <message list> edit messages
++f <message list> give head lines of messages
++d <message list> delete messages
++s <message list> file append messages to file
++u <message list> undelete messages
++R <message list> reply to message senders
++r <message list> reply to message senders and all recipients
++pre <message list> make messages go back to /usr/spool/mail
++m <user list> mail to specific users
++q quit, saving unresolved messages in mbox
++x quit, do not remove system mailbox
++h print out active message headers
++! shell escape
+ cd [directory] chdir to directory or home if none given
+-fi <file> switch to file (%=system inbox, %user=user's
+- system inbox). + searches in your folder
+- directory for the file.
+-set variable[=value] set Mail variable.
+
+-A [message list] consists of integers, ranges of same, :status, /subject, or
+-user names separated by spaces. If omitted, Mail uses the current message.
+-The pipe command doesn't accept user names or subject message list, since
+-that might conflict with the command string.
++A <message list> consists of integers, ranges of same, or user names separated
++by spaces. If omitted, Mail uses the last message typed.
+
+-A <recipient list> consists of recipient addresses or aliases separated by
+-spaces. Aliases are defined in .mailrc in your home directory.
+-
+-<file> is a full or relative pathname, +folder, % (system inbox), %user
+-(specified user's syetem inbox), # (previous file), & (mbox file), or an
+-expression understood by ${SHELL:-/bin/sh} -c 'echo ...'.
++A <user list> consists of user names or aliases separated by spaces.
++Aliases are defined in .mailrc in your home directory.
+diff -urN mailx-8.1.1.orig/misc/mail.rc mailx-8.1.1/misc/mail.rc
+--- mailx-8.1.1.orig/misc/mail.rc 1996-06-21 21:26:59.000000000 -0700
++++ mailx-8.1.1/misc/mail.rc 2003-03-26 13:03:39.000000000 -0800
+@@ -1,2 +1,2 @@
+-set append dot save asksub
++set ask askcc append dot save crt
+ ignore Received Message-Id Resent-Message-Id Status Mail-From Return-Path Via
+diff -urN mailx-8.1.1.orig/misc/mail.tildehelp mailx-8.1.1/misc/mail.tildehelp
+--- mailx-8.1.1.orig/misc/mail.tildehelp 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/misc/mail.tildehelp 1996-06-21 21:26:59.000000000 -0700
+@@ -1,22 +1,22 @@
+ -----------------------------------------------------------
+ The following ~ escapes are defined:
+-~~ Quote a single tilde.
+-~b users Add users to "blind" cc list.
+-~c users Add users to cc list.
+-~d Read in dead.letter.
+-~e Edit the message buffer.
+-~f messages Read in messages.
+-~F messages Same as ~f, but keep all header lines.
+-~h Prompt for to list, subject and cc list.
+-~r file Read a file into the message buffer.
+-~p Print (show) the message buffer.
+-~m messages Read in messages, right shifted by a tab.
+-~M messages Same as ~m, but keep all header lines.
+-~s subject Set subject.
+-~t users Add users to to list.
+-~v Invoke display editor on message.
++~~ Quote a single tilde
++~b users Add users to "blind" cc list
++~c users Add users to cc list
++~d Read in dead.letter
++~e Edit the message buffer
++~f messages Read in messages
++~F messages Same as ~f, but keep all header lines
++~h Prompt for to list, subject and cc list
++~r file Read a file into the message buffer
++~p Print the message buffer
++~m messages Read in messages, right shifted by a tab
++~M messages Same as ~m, but keep all header lines
++~s subject Set subject
++~t users Add users to to list
++~v Invoke display editor on message
+ ~w file Write message onto file.
+-~? Print this message.
+-~!command Invoke the shell.
+-~|command Pipe the message through the command and replace it.
++~? Print this message
++~!command Invoke the shell
++~|command Pipe the message through the command
+ -----------------------------------------------------------
+diff -urN mailx-8.1.1.orig/names.c mailx-8.1.1/names.c
+--- mailx-8.1.1.orig/names.c 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/names.c 2003-03-26 13:03:40.000000000 -0800
+@@ -1,4 +1,4 @@
+-/* $OpenBSD: names.c,v 1.16 2001/11/21 20:41:55 millert Exp $ */
++/* $OpenBSD: names.c,v 1.5 1996/06/08 19:48:32 christos Exp $ */
+ /* $NetBSD: names.c,v 1.5 1996/06/08 19:48:32 christos Exp $ */
+
+ /*
+@@ -36,9 +36,9 @@
+
+ #ifndef lint
+ #if 0
+-static const char sccsid[] = "@(#)names.c 8.1 (Berkeley) 6/6/93";
++static char sccsid[] = "@(#)names.c 8.1 (Berkeley) 6/6/93";
+ #else
+-static const char rcsid[] = "$OpenBSD: names.c,v 1.16 2001/11/21 20:41:55 millert Exp $";
++static char rcsid[] = "$OpenBSD: names.c,v 1.5 1996/06/08 19:48:32 christos Exp $";
+ #endif
+ #endif /* not lint */
+
+@@ -58,13 +58,15 @@
+ * name and return it.
+ */
+ struct name *
+-nalloc(char *str, int ntype)
+-{
+- struct name *np;
+-
+- np = (struct name *)salloc(sizeof(*np));
+- np->n_flink = NULL;
+- np->n_blink = NULL;
++nalloc(str, ntype)
++ char str[];
++ int ntype;
++{
++ register struct name *np;
++
++ np = (struct name *) salloc(sizeof *np);
++ np->n_flink = NIL;
++ np->n_blink = NIL;
+ np->n_type = ntype;
+ np->n_name = savestr(str);
+ return(np);
+@@ -74,14 +76,15 @@
+ * Find the tail of a list and return it.
+ */
+ struct name *
+-tailof(struct name *name)
++tailof(name)
++ struct name *name;
+ {
+- struct name *np;
++ register struct name *np;
+
+ np = name;
+- if (np == NULL)
+- return(NULL);
+- while (np->n_flink != NULL)
++ if (np == NIL)
++ return(NIL);
++ while (np->n_flink != NIL)
+ np = np->n_flink;
+ return(np);
+ }
+@@ -89,53 +92,55 @@
+ /*
+ * Extract a list of names from a line,
+ * and make a list of names from it.
+- * Return the list or NULL if none found.
++ * Return the list or NIL if none found.
+ */
+ struct name *
+-extract(char *line, int ntype)
+-{
+- char *cp;
+- struct name *top, *np, *t;
+- char *nbuf;
+-
+- if (line == NULL || *line == '\0')
+- return(NULL);
+- if ((nbuf = (char *)malloc(strlen(line) + 1)) == NULL)
+- errx(1, "Out of memory");
+- top = NULL;
+- np = NULL;
++extract(line, ntype)
++ char line[];
++ int ntype;
++{
++ register char *cp;
++ register struct name *top, *np, *t;
++ char nbuf[BUFSIZ];
++
++ if (line == NOSTR || *line == '\0')
++ return NIL;
++ top = NIL;
++ np = NIL;
+ cp = line;
+- while ((cp = yankword(cp, nbuf)) != NULL) {
++ while ((cp = yankword(cp, nbuf, BUFSIZ)) != NOSTR) {
+ t = nalloc(nbuf, ntype);
+- if (top == NULL)
++ if (top == NIL)
+ top = t;
+ else
+ np->n_flink = t;
+ t->n_blink = np;
+ np = t;
+ }
+- (void)free(nbuf);
+- return(top);
++ return top;
+ }
+
+ /*
+ * Turn a list of names into a string of the same names.
+ */
+ char *
+-detract(struct name *np, int ntype)
+-{
+- int s, comma;
+- char *cp, *top;
+- struct name *p;
++detract(np, ntype)
++ register struct name *np;
++ int ntype;
++{
++ register int s;
++ register char *cp, *top;
++ register struct name *p;
++ register int comma;
+
+ comma = ntype & GCOMMA;
+- if (np == NULL)
+- return(NULL);
++ if (np == NIL)
++ return(NOSTR);
+ ntype &= ~GCOMMA;
+ s = 0;
+ if (debug && comma)
+- fputs("detract asked to insert commas\n", stderr);
+- for (p = np; p != NULL; p = p->n_flink) {
++ fprintf(stderr, "detract asked to insert commas\n");
++ for (p = np; p != NIL; p = p->n_flink) {
+ if (ntype && (p->n_type & GMASK) != ntype)
+ continue;
+ s += strlen(p->n_name) + 1;
+@@ -143,15 +148,15 @@
+ s++;
+ }
+ if (s == 0)
+- return(NULL);
++ return(NOSTR);
+ s += 2;
+ top = salloc(s);
+ cp = top;
+- for (p = np; p != NULL; p = p->n_flink) {
++ for (p = np; p != NIL; p = p->n_flink) {
+ if (ntype && (p->n_type & GMASK) != ntype)
+ continue;
+ cp = copy(p->n_name, cp);
+- if (comma && p->n_flink != NULL)
++ if (comma && p->n_flink != NIL)
+ *cp++ = ',';
+ *cp++ = ' ';
+ }
+@@ -166,16 +171,19 @@
+ * Throw away things between ()'s, and take anything between <>.
+ */
+ char *
+-yankword(char *ap, char *wbuf)
++yankword(ap, wbuf, maxsize)
++ char *ap, wbuf[];
++ int maxsize;
+ {
+- char *cp, *cp2;
++ register char *cp, *cp2;
++ int used = 0;
+
+ cp = ap;
+ for (;;) {
+ if (*cp == '\0')
+- return(NULL);
++ return NOSTR;
+ if (*cp == '(') {
+- int nesting = 0;
++ register int nesting = 0;
+
+ while (*cp != '\0') {
+ switch (*cp++) {
+@@ -195,13 +203,14 @@
+ break;
+ }
+ if (*cp == '<')
+- for (cp2 = wbuf; *cp && (*cp2++ = *cp++) != '>';)
++ /* Pre-increment "used" so we leave room for the trailing zero */
++ for (cp2 = wbuf; *cp && (++used < maxsize) && (*cp2++ = *cp++) != '>';)
+ ;
+ else
+- for (cp2 = wbuf; *cp && !strchr(" \t,(", *cp); *cp2++ = *cp++)
++ for (cp2 = wbuf; *cp && (++used < maxsize) && !index(" \t,(", *cp); *cp2++ = *cp++)
+ ;
+ *cp2 = '\0';
+- return(cp);
++ return cp;
+ }
+
+ /*
+@@ -213,19 +222,24 @@
+ * program and removed.
+ */
+ struct name *
+-outof(struct name *names, FILE *fo, struct header *hp)
++outof(names, fo, hp)
++ struct name *names;
++ FILE *fo;
++ struct header *hp;
+ {
+- int c, ispipe;
+- struct name *np, *top;
++ register int c;
++ register struct name *np, *top;
+ time_t now;
+ char *date, *fname;
+ FILE *fout, *fin;
++ int ispipe;
++ extern char *tempEdit;
+
+ top = names;
+ np = names;
+- (void)time(&now);
++ (void) time(&now);
+ date = ctime(&now);
+- while (np != NULL) {
++ while (np != NIL) {
+ if (!isfileaddr(np->n_name) && np->n_name[0] != '|') {
+ np = np->n_flink;
+ continue;
+@@ -240,37 +254,33 @@
+ * See if we have copied the complete message out yet.
+ * If not, do so.
+ */
+- if (image < 0) {
+- int fd;
+- char tempname[PATHSIZE];
+
+- (void)snprintf(tempname, sizeof(tempname),
+- "%s/mail.ReXXXXXXXXXX", tmpdir);
+- if ((fd = mkstemp(tempname)) == -1 ||
+- (fout = Fdopen(fd, "a")) == NULL) {
+- warn("%s", tempname);
++ if (image < 0) {
++ /* hopefully we always create the file, so I change the "a" to "w" the line below */
++ if ((fout = Fopen(tempEdit, "w")) == NULL) {
++ perror(tempEdit);
+ senderr++;
+ goto cant;
+ }
+- image = open(tempname, O_RDWR);
+- (void)rm(tempname);
++ image = open(tempEdit, 2);
++ (void) unlink(tempEdit);
+ if (image < 0) {
+- warn("%s", tempname);
++ perror(tempEdit);
+ senderr++;
+- (void)Fclose(fout);
++ (void) Fclose(fout);
+ goto cant;
+ }
+- (void)fcntl(image, F_SETFD, 1);
++ (void) fcntl(image, F_SETFD, 1);
+ fprintf(fout, "From %s %s", myname, date);
+ puthead(hp, fout, GTO|GSUBJECT|GCC|GNL);
+ while ((c = getc(fo)) != EOF)
+- (void)putc(c, fout);
++ (void) putc(c, fout);
+ rewind(fo);
+- (void)putc('\n', fout);
+- (void)fflush(fout);
++ (void) putc('\n', fout);
++ (void) fflush(fout);
+ if (ferror(fout))
+- warn("%s", tempname);
+- (void)Fclose(fout);
++ perror(tempEdit);
++ (void) Fclose(fout);
+ }
+
+ /*
+@@ -278,8 +288,9 @@
+ * or give it as the standard input to the desired
+ * program as appropriate.
+ */
++
+ if (ispipe) {
+- pid_t pid;
++ int pid;
+ char *shell;
+ sigset_t nset;
+
+@@ -290,13 +301,14 @@
+ * share the same lseek location and trample
+ * on one another.
+ */
+- shell = value("SHELL");
++ if ((shell = value("SHELL")) == NOSTR)
++ shell = _PATH_CSHELL;
+ sigemptyset(&nset);
+ sigaddset(&nset, SIGHUP);
+ sigaddset(&nset, SIGINT);
+ sigaddset(&nset, SIGQUIT);
+ pid = start_command(shell, &nset,
+- image, -1, "-c", fname, NULL);
++ image, -1, "-c", fname, NOSTR);
+ if (pid < 0) {
+ senderr++;
+ goto cant;
+@@ -305,30 +317,28 @@
+ } else {
+ int f;
+ if ((fout = Fopen(fname, "a")) == NULL) {
+- warn("%s", fname);
++ perror(fname);
+ senderr++;
+ goto cant;
+ }
+ if ((f = dup(image)) < 0) {
+- warn("dup");
++ perror("dup");
+ fin = NULL;
+ } else
+ fin = Fdopen(f, "r");
+ if (fin == NULL) {
+- fputs("Can't reopen image\n", stderr);
+- (void)Fclose(fout);
++ fprintf(stderr, "Can't reopen image\n");
++ (void) Fclose(fout);
+ senderr++;
+ goto cant;
+ }
+ rewind(fin);
+ while ((c = getc(fin)) != EOF)
+- (void)putc(c, fout);
+- if (ferror(fout)) {
+- senderr++;
+- warn("%s", fname);
+- }
+- (void)Fclose(fout);
+- (void)Fclose(fin);
++ (void) putc(c, fout);
++ if (ferror(fout))
++ senderr++, perror(fname);
++ (void) Fclose(fout);
++ (void) Fclose(fin);
+ }
+ cant:
+ /*
+@@ -340,7 +350,7 @@
+ np = np->n_flink;
+ }
+ if (image >= 0) {
+- (void)close(image);
++ (void) close(image);
+ image = -1;
+ }
+ return(top);
+@@ -352,19 +362,20 @@
+ * be a filename. We cheat with .'s to allow path names like ./...
+ */
+ int
+-isfileaddr(char *name)
++isfileaddr(name)
++ char *name;
+ {
+- char *cp;
++ register char *cp;
+
+ if (*name == '+')
+- return(1);
++ return 1;
+ for (cp = name; *cp; cp++) {
+ if (*cp == '!' || *cp == '%' || *cp == '@')
+- return(0);
++ return 0;
+ if (*cp == '/')
+- return(1);
++ return 1;
+ }
+- return(0);
++ return 0;
+ }
+
+ /*
+@@ -373,17 +384,19 @@
+ * Changed after all these months of service to recursively
+ * expand names (2/14/80).
+ */
++
+ struct name *
+-usermap(struct name *names)
++usermap(names)
++ struct name *names;
+ {
+- struct name *new, *np, *cp;
++ register struct name *new, *np, *cp;
+ struct grouphead *gh;
+- int metoo;
++ register int metoo;
+
+- new = NULL;
++ new = NIL;
+ np = names;
+- metoo = (value("metoo") != NULL);
+- while (np != NULL) {
++ metoo = (value("metoo") != NOSTR);
++ while (np != NIL) {
+ if (np->n_name[0] == '\\') {
+ cp = np->n_flink;
+ new = put(new, np);
+@@ -392,7 +405,7 @@
+ }
+ gh = findgroup(np->n_name);
+ cp = np->n_flink;
+- if (gh != NULL)
++ if (gh != NOGRP)
+ new = gexpand(new, gh, metoo, np->n_type);
+ else
+ new = put(new, np);
+@@ -406,8 +419,12 @@
+ * fixed level to keep things from going haywire.
+ * Direct recursion is not expanded for convenience.
+ */
++
+ struct name *
+-gexpand(struct name *nlist, struct grouphead *gh, int metoo, int ntype)
++gexpand(nlist, gh, metoo, ntype)
++ struct name *nlist;
++ struct grouphead *gh;
++ int metoo, ntype;
+ {
+ struct group *gp;
+ struct grouphead *ngh;
+@@ -420,13 +437,13 @@
+ return(nlist);
+ }
+ depth++;
+- for (gp = gh->g_list; gp != NULL; gp = gp->ge_link) {
++ for (gp = gh->g_list; gp != NOGE; gp = gp->ge_link) {
+ cp = gp->ge_name;
+ if (*cp == '\\')
+ goto quote;
+ if (strcmp(cp, gh->g_name) == 0)
+ goto quote;
+- if ((ngh = findgroup(cp)) != NULL) {
++ if ((ngh = findgroup(cp)) != NOGRP) {
+ nlist = gexpand(nlist, ngh, metoo, ntype);
+ continue;
+ }
+@@ -436,7 +453,7 @@
+ * At this point should allow to expand
+ * to self if only person in group
+ */
+- if (gp == gh->g_list && gp->ge_link == NULL)
++ if (gp == gh->g_list && gp->ge_link == NOGE)
+ goto skip;
+ if (!metoo && strcmp(cp, myname) == 0)
+ np->n_type |= GDEL;
+@@ -451,13 +468,14 @@
+ * Concatenate the two passed name lists, return the result.
+ */
+ struct name *
+-cat(struct name *n1, struct name *n2)
++cat(n1, n2)
++ struct name *n1, *n2;
+ {
+- struct name *tail;
++ register struct name *tail;
+
+- if (n1 == NULL)
++ if (n1 == NIL)
+ return(n2);
+- if (n2 == NULL)
++ if (n2 == NIL)
+ return(n1);
+ tail = tailof(n1);
+ tail->n_flink = n2;
+@@ -470,29 +488,31 @@
+ * Return an error if the name list won't fit.
+ */
+ char **
+-unpack(struct name *sm, struct name *np)
++unpack(np)
++ struct name *np;
+ {
+- char **ap, **top;
++ register char **ap, **top;
++ register struct name *n;
+ int t, extra, metoo, verbose;
+
+- if ((t = count(np)) == 0)
+- errx(1, "No names to unpack");
+- t += count(sm);
+-
++ n = np;
++ if ((t = count(n)) == 0)
++ panic("No names to unpack");
+ /*
+ * Compute the number of extra arguments we will need.
+- * We need at least four extra -- one for "send-mail", one for the
+- * "-i" flag, one for the "--" to signal end of command line
+- * arguments, and one for the terminating 0 pointer.
++ * We need at least two extra -- one for "mail" and one for
++ * the terminating 0 pointer. Additional spots may be needed
++ * to pass along -f to the host mailer.
+ */
+- extra = 4;
+- metoo = value("metoo") != NULL;
++ extra = 2;
++ extra++;
++ metoo = value("metoo") != NOSTR;
+ if (metoo)
+ extra++;
+- verbose = value("verbose") != NULL;
++ verbose = value("verbose") != NOSTR;
+ if (verbose)
+ extra++;
+- top = (char **)salloc((t + extra) * sizeof(*top));
++ top = (char **) salloc((t + extra) * sizeof *top);
+ ap = top;
+ *ap++ = "send-mail";
+ *ap++ = "-i";
+@@ -500,14 +520,10 @@
+ *ap++ = "-m";
+ if (verbose)
+ *ap++ = "-v";
+- for (; sm != NULL; sm = sm->n_flink)
+- if ((sm->n_type & GDEL) == 0)
+- *ap++ = sm->n_name;
+- *ap++ = "--";
+- for (; np != NULL; np = np->n_flink)
+- if ((np->n_type & GDEL) == 0)
+- *ap++ = np->n_name;
+- *ap = NULL;
++ for (; n != NIL; n = n->n_flink)
++ if ((n->n_type & GDEL) == 0)
++ *ap++ = n->n_name;
++ *ap = NOSTR;
+ return(top);
+ }
+
+@@ -517,23 +533,24 @@
+ * Return the head of the new list.
+ */
+ struct name *
+-elide(struct name *names)
++elide(names)
++ struct name *names;
+ {
+- struct name *np, *t, *new;
++ register struct name *np, *t, *new;
+ struct name *x;
+
+- if (names == NULL)
+- return(NULL);
++ if (names == NIL)
++ return(NIL);
+ new = names;
+ np = names;
+ np = np->n_flink;
+- if (np != NULL)
+- np->n_blink = NULL;
+- new->n_flink = NULL;
+- while (np != NULL) {
++ if (np != NIL)
++ np->n_blink = NIL;
++ new->n_flink = NIL;
++ while (np != NIL) {
+ t = new;
+ while (strcasecmp(t->n_name, np->n_name) < 0) {
+- if (t->n_flink == NULL)
++ if (t->n_flink == NIL)
+ break;
+ t = t->n_flink;
+ }
+@@ -542,12 +559,13 @@
+ * If we ran out of t's, put the new entry after
+ * the current value of t.
+ */
++
+ if (strcasecmp(t->n_name, np->n_name) < 0) {
+ t->n_flink = np;
+ np->n_blink = t;
+ t = np;
+ np = np->n_flink;
+- t->n_flink = NULL;
++ t->n_flink = NIL;
+ continue;
+ }
+
+@@ -556,12 +574,13 @@
+ * current t. If at the front of the list,
+ * the new guy becomes the new head of the list.
+ */
++
+ if (t == new) {
+ t = np;
+ np = np->n_flink;
+ t->n_flink = new;
+ new->n_blink = t;
+- t->n_blink = NULL;
++ t->n_blink = NIL;
+ new = t;
+ continue;
+ }
+@@ -570,6 +589,7 @@
+ * The normal case -- we are inserting into the
+ * middle of the list.
+ */
++
+ x = np;
+ np = np->n_flink;
+ x->n_flink = t;
+@@ -582,13 +602,14 @@
+ * Now the list headed up by new is sorted.
+ * Go through it and remove duplicates.
+ */
++
+ np = new;
+- while (np != NULL) {
++ while (np != NIL) {
+ t = np;
+- while (t->n_flink != NULL &&
++ while (t->n_flink != NIL &&
+ strcasecmp(np->n_name, t->n_flink->n_name) == 0)
+ t = t->n_flink;
+- if (t == np || t == NULL) {
++ if (t == np || t == NIL) {
+ np = np->n_flink;
+ continue;
+ }
+@@ -597,8 +618,9 @@
+ * Now t points to the last entry with the same name
+ * as np. Make np point beyond t.
+ */
++
+ np->n_flink = t->n_flink;
+- if (t->n_flink != NULL)
++ if (t->n_flink != NIL)
+ t->n_flink->n_blink = np;
+ np = np->n_flink;
+ }
+@@ -610,11 +632,12 @@
+ * the list.
+ */
+ struct name *
+-put(struct name *list, struct name *node)
++put(list, node)
++ struct name *list, *node;
+ {
+ node->n_flink = list;
+- node->n_blink = NULL;
+- if (list != NULL)
++ node->n_blink = NIL;
++ if (list != NIL)
+ list->n_blink = node;
+ return(node);
+ }
+@@ -624,61 +647,63 @@
+ * a name list and return it.
+ */
+ int
+-count(struct name *np)
++count(np)
++ register struct name *np;
+ {
+- int c;
++ register int c;
+
+- for (c = 0; np != NULL; np = np->n_flink)
++ for (c = 0; np != NIL; np = np->n_flink)
+ if ((np->n_type & GDEL) == 0)
+ c++;
+- return(c);
++ return c;
+ }
+
+ /*
+ * Delete the given name from a namelist.
+ */
+ struct name *
+-delname(struct name *np, char *name)
+-{
+- struct name *p;
+-
+- for (p = np; p != NULL; p = p->n_flink)
+- if ((strcasecmp(p->n_name, name) == 0) ||
+- (value("allnet") &&
+- strncasecmp(p->n_name, name, strlen(name)) == 0 &&
+- *(p->n_name+strlen(name)) == '@')) {
+- if (p->n_blink == NULL) {
+- if (p->n_flink != NULL)
+- p->n_flink->n_blink = NULL;
++delname(np, name)
++ register struct name *np;
++ char name[];
++{
++ register struct name *p;
++
++ for (p = np; p != NIL; p = p->n_flink)
++ if (strcasecmp(p->n_name, name) == 0) {
++ if (p->n_blink == NIL) {
++ if (p->n_flink != NIL)
++ p->n_flink->n_blink = NIL;
+ np = p->n_flink;
+ continue;
+ }
+- if (p->n_flink == NULL) {
+- if (p->n_blink != NULL)
+- p->n_blink->n_flink = NULL;
++ if (p->n_flink == NIL) {
++ if (p->n_blink != NIL)
++ p->n_blink->n_flink = NIL;
+ continue;
+ }
+ p->n_blink->n_flink = p->n_flink;
+ p->n_flink->n_blink = p->n_blink;
+ }
+- return(np);
++ return np;
+ }
+
+ /*
+ * Pretty print a name list
+ * Uncomment it if you need it.
+ */
+-#if 0
++
++/*
+ void
+-prettyprint(struct name *name)
++prettyprint(name)
++ struct name *name;
+ {
+- struct name *np;
++ register struct name *np;
+
+ np = name;
+- while (np != NULL) {
++ while (np != NIL) {
+ fprintf(stderr, "%s(%d) ", np->n_name, np->n_type);
+ np = np->n_flink;
+ }
+- putc('\n', stderr);
++ fprintf(stderr, "\n");
+ }
+-#endif
++*/
+diff -urN mailx-8.1.1.orig/pathnames.h mailx-8.1.1/pathnames.h
+--- mailx-8.1.1.orig/pathnames.h 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/pathnames.h 2003-03-26 13:03:39.000000000 -0800
+@@ -1,4 +1,4 @@
+-/* $OpenBSD: pathnames.h,v 1.6 2001/10/04 04:23:26 pvalchev Exp $ */
++/* $OpenBSD: pathnames.h,v 1.4 1996/06/08 19:48:34 christos Exp $ */
+ /* $NetBSD: pathnames.h,v 1.4 1996/06/08 19:48:34 christos Exp $ */
+
+ /*
+@@ -37,17 +37,34 @@
+ * $NetBSD: pathnames.h,v 1.4 1996/06/08 19:48:34 christos Exp $
+ */
+
+-#include <paths.h>
++/* mail installed files */
++#define _PATH_HELP "/usr/lib/mail.help"
++#define _PATH_TILDE "/usr/lib/mail.tildehelp"
++#define _PATH_MASTER_RC "/etc/mail.rc"
++
++/* mail runtime files */
++#ifndef _PATH_MAILDIR
++#define _PATH_MAILDIR "/var/mail:/var/spool/mail"
++#endif
+
+ /* executables */
++#ifndef _PATH_CSHELL
++#define _PATH_CSHELL "/bin/csh"
++#endif
++#ifndef _PATH_MORE
++#define _PATH_MORE "/bin/more"
++#endif
++#ifndef _PATH_EX
+ #define _PATH_EX "/usr/bin/ex"
+-#define _PATH_MORE "/usr/bin/more"
+-#define _PATH_LS "/bin/ls"
+-#define _PATH_LOCKSPOOL "/usr/libexec/lockspool"
++#endif
++#ifndef _PATH_VI
++#define _PATH_VI "/usr/bin/vi"
++#endif
++#ifndef _PATH_SENDMAIL
++#define _PATH_SENDMAIL "/usr/sbin/sendmail"
++#endif
+
+-/* directories & files */
+-#define _PATH_MAILDIR "/var/mail"
+-#define _PATH_HELP "/usr/share/misc/mail.help"
+-#define _PATH_TILDE "/usr/share/misc/mail.tildehelp"
+-#define _PATH_MASTER_RC "/etc/mail.rc"
+-#define _PATH_LOCTMP "/tmp/local.XXXXXXXXXX"
++/* directories */
++#ifndef _PATH_TMP
++#define _PATH_TMP "/tmp/"
++#endif
+diff -urN mailx-8.1.1.orig/popen.c mailx-8.1.1/popen.c
+--- mailx-8.1.1.orig/popen.c 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/popen.c 2003-03-26 13:03:40.000000000 -0800
+@@ -1,5 +1,5 @@
+-/* $OpenBSD: popen.c,v 1.32 2002/06/12 06:07:15 mpech Exp $ */
+-/* $NetBSD: popen.c,v 1.6 1997/05/13 06:48:42 mikel Exp $ */
++/* $OpenBSD: popen.c,v 1.3 1996/06/26 21:22:34 dm Exp $ */
++/* $NetBSD: popen.c,v 1.4 1996/06/08 19:48:35 christos Exp $ */
+
+ /*
+ * Copyright (c) 1980, 1993
+@@ -36,9 +36,9 @@
+
+ #ifndef lint
+ #if 0
+-static const char sccsid[] = "@(#)popen.c 8.1 (Berkeley) 6/6/93";
++static char sccsid[] = "@(#)popen.c 8.1 (Berkeley) 6/6/93";
+ #else
+-static const char rcsid[] = "$OpenBSD: popen.c,v 1.32 2002/06/12 06:07:15 mpech Exp $";
++static char rcsid[] = "$OpenBSD: popen.c,v 1.3 1996/06/26 21:22:34 dm Exp $";
+ #endif
+ #endif /* not lint */
+
+@@ -46,7 +46,7 @@
+ #include <sys/wait.h>
+ #include <fcntl.h>
+ #include <errno.h>
+-#include <stdarg.h>
++#include <lockfile.h>
+ #include "extern.h"
+
+ #define READ 0
+@@ -55,127 +55,163 @@
+ struct fp {
+ FILE *fp;
+ int pipe;
+- pid_t pid;
++ int pid;
+ struct fp *link;
+ };
+ static struct fp *fp_head;
+
+ struct child {
+- pid_t pid;
++ int pid;
+ char done;
+ char free;
+- int status;
++ union wait status;
+ struct child *link;
+ };
+-static struct child *child, *child_freelist = NULL;
++static struct child *child;
++static struct child *findchild __P((int));
++static void delchild __P((struct child *));
++static int file_pid __P((FILE *));
+
+-static struct child *findchild(pid_t, int);
+-static void delchild(struct child *);
+-static pid_t file_pid(FILE *);
+-static int handle_spool_locks(int);
++FILE *
++safe_fopen(file, mode)
++ char *file, *mode;
++{
++ int omode, fd;
++
++ if (!strcmp(mode, "r")) {
++ omode = O_RDONLY;
++ } else if (!strcmp(mode, "w")) {
++ omode = O_WRONLY | O_CREAT | O_EXCL;
++ } else if (!strcmp(mode, "a")) {
++ omode = O_WRONLY | O_APPEND | O_CREAT;
++ } else if (!strcmp(mode, "a+")) {
++ omode = O_RDWR | O_APPEND;
++ } else if (!strcmp(mode, "r+")) {
++ omode = O_RDWR;
++ } else if (!strcmp(mode, "w+")) {
++ omode = O_RDWR | O_CREAT | O_EXCL;
++ } else {
++ fprintf(stderr,
++ "Internal error: bad stdio open mode %s\n", mode);
++ errno = EINVAL;
++ return NULL;
++ }
++
++ if ((fd = open(file, omode, 0666)) < 0)
++ return NULL;
++ return fdopen(fd, mode);
++}
+
+ FILE *
+-Fopen(char *file, char *mode)
++Fopen(file, mode)
++ char *file, *mode;
+ {
+ FILE *fp;
+
+- if ((fp = fopen(file, mode)) != NULL) {
++ if ((fp = safe_fopen(file, mode)) != NULL) {
+ register_file(fp, 0, 0);
+- (void)fcntl(fileno(fp), F_SETFD, 1);
++ (void) fcntl(fileno(fp), F_SETFD, 1);
+ }
+- return(fp);
++ return fp;
+ }
+
+ FILE *
+-Fdopen(int fd, char *mode)
++Fdopen(fd, mode)
++ int fd;
++ char *mode;
+ {
+ FILE *fp;
+
+ if ((fp = fdopen(fd, mode)) != NULL) {
+ register_file(fp, 0, 0);
+- (void)fcntl(fileno(fp), F_SETFD, 1);
++ (void) fcntl(fileno(fp), F_SETFD, 1);
+ }
+- return(fp);
++ return fp;
+ }
+
+ int
+-Fclose(FILE *fp)
++Fclose(fp)
++ FILE *fp;
+ {
+-
+ unregister_file(fp);
+- return(fclose(fp));
++ return fclose(fp);
+ }
+
+ FILE *
+-Popen(char *cmd, char *mode)
++Popen(cmd, mode)
++ char *cmd;
++ char *mode;
+ {
+ int p[2];
+ int myside, hisside, fd0, fd1;
+- pid_t pid;
++ int pid;
+ sigset_t nset;
+ FILE *fp;
+
+ if (pipe(p) < 0)
+- return(NULL);
+- (void)fcntl(p[READ], F_SETFD, 1);
+- (void)fcntl(p[WRITE], F_SETFD, 1);
++ return NULL;
++ (void) fcntl(p[READ], F_SETFD, 1);
++ (void) fcntl(p[WRITE], F_SETFD, 1);
+ if (*mode == 'r') {
+ myside = p[READ];
+- hisside = fd0 = fd1 = p[WRITE];
++ fd0 = -1;
++ hisside = fd1 = p[WRITE];
+ } else {
+ myside = p[WRITE];
+ hisside = fd0 = p[READ];
+ fd1 = -1;
+ }
+ sigemptyset(&nset);
+- pid = start_command(value("SHELL"), &nset, fd0, fd1, "-c", cmd, NULL);
+- if (pid < 0) {
+- (void)close(p[READ]);
+- (void)close(p[WRITE]);
+- return(NULL);
++ if ((pid = start_command(cmd, &nset, fd0, fd1, NOSTR, NOSTR, NOSTR)) < 0) {
++ close(p[READ]);
++ close(p[WRITE]);
++ return NULL;
+ }
+- (void)close(hisside);
++ (void) close(hisside);
+ if ((fp = fdopen(myside, mode)) != NULL)
+ register_file(fp, 1, pid);
+- return(fp);
++ return fp;
+ }
+
+ int
+-Pclose(FILE *ptr)
++Pclose(ptr)
++ FILE *ptr;
+ {
+ int i;
+ sigset_t nset, oset;
+
+ i = file_pid(ptr);
+ unregister_file(ptr);
+- (void)fclose(ptr);
++ (void) fclose(ptr);
+ sigemptyset(&nset);
+ sigaddset(&nset, SIGINT);
+ sigaddset(&nset, SIGHUP);
+ sigprocmask(SIG_BLOCK, &nset, &oset);
+ i = wait_child(i);
+ sigprocmask(SIG_SETMASK, &oset, NULL);
+- return(i);
++ return i;
+ }
+
+ void
+-close_all_files(void)
++close_all_files()
+ {
+
+ while (fp_head)
+ if (fp_head->pipe)
+- (void)Pclose(fp_head->fp);
++ (void) Pclose(fp_head->fp);
+ else
+- (void)Fclose(fp_head->fp);
++ (void) Fclose(fp_head->fp);
+ }
+
+ void
+-register_file(FILE *fp, int pipe, pid_t pid)
++register_file(fp, pipe, pid)
++ FILE *fp;
++ int pipe, pid;
+ {
+ struct fp *fpp;
+
+- if ((fpp = (struct fp *)malloc(sizeof(*fpp))) == NULL)
+- errx(1, "Out of memory");
++ if ((fpp = (struct fp *) malloc(sizeof *fpp)) == NULL)
++ panic("Out of memory");
+ fpp->fp = fp;
+ fpp->pipe = pipe;
+ fpp->pid = pid;
+@@ -184,183 +220,165 @@
+ }
+
+ void
+-unregister_file(FILE *fp)
++unregister_file(fp)
++ FILE *fp;
+ {
+ struct fp **pp, *p;
+
+ for (pp = &fp_head; (p = *pp) != NULL; pp = &p->link)
+ if (p->fp == fp) {
+ *pp = p->link;
+- (void)free(p);
++ free((char *) p);
+ return;
+ }
+- errx(1, "Invalid file pointer");
++ panic("Invalid file pointer");
+ }
+
+-static pid_t
+-file_pid(FILE *fp)
++static int
++file_pid(fp)
++ FILE *fp;
+ {
+ struct fp *p;
+
+ for (p = fp_head; p; p = p->link)
+ if (p->fp == fp)
+- return(p->pid);
+- errx(1, "Invalid file pointer");
++ return (p->pid);
++ panic("Invalid file pointer");
+ /*NOTREACHED*/
+ }
+
+ /*
+ * Run a command without a shell, with optional arguments and splicing
+- * of stdin (-1 means none) and stdout. The command name can be a sequence
+- * of words.
++ * of stdin and stdout. The command name can be a sequence of words.
+ * Signals must be handled by the caller.
+- * "nset" contains the signals to ignore in the new process.
+- * SIGINT is enabled unless it's in "nset".
++ * "Mask" contains the signals to ignore in the new process.
++ * SIGINT is enabled unless it's in the mask.
+ */
+-pid_t
+-start_commandv(char *cmd, sigset_t *nset, int infd, int outfd, va_list args)
++/*VARARGS4*/
++int
++run_command(cmd, mask, infd, outfd, a0, a1, a2)
++ char *cmd;
++ sigset_t *mask;
++ int infd, outfd;
++ char *a0, *a1, *a2;
+ {
+- pid_t pid;
++ int pid;
+
+- if ((pid = fork()) < 0) {
+- warn("fork");
+- return(-1);
++ if ((pid = start_command(cmd, mask, infd, outfd, a0, a1, a2)) < 0)
++ return -1;
++ return wait_command(pid);
++}
++
++/*VARARGS4*/
++int
++start_command(cmd, mask, infd, outfd, a0, a1, a2)
++ char *cmd;
++ sigset_t *mask;
++ int infd, outfd;
++ char *a0, *a1, *a2;
++{
++ int pid;
++
++ if ((pid = vfork()) < 0) {
++ perror("fork");
++ return -1;
+ }
+ if (pid == 0) {
+ char *argv[100];
+- int i = getrawlist(cmd, argv, sizeof(argv)/ sizeof(*argv));
++ int i = getrawlist(cmd, argv, sizeof argv / sizeof *argv);
+
+- while ((argv[i++] = va_arg(args, char *)))
+- ;
+- argv[i] = NULL;
+- prepare_child(nset, infd, outfd);
++ if ((argv[i++] = a0) != NOSTR &&
++ (argv[i++] = a1) != NOSTR &&
++ (argv[i++] = a2) != NOSTR)
++ argv[i] = NOSTR;
++ prepare_child(mask, infd, outfd);
+ execvp(argv[0], argv);
+- warn("%s", argv[0]);
++ perror(argv[0]);
+ _exit(1);
+ }
+- return(pid);
+-}
+-
+-int
+-run_command(char *cmd, sigset_t *nset, int infd, int outfd, ...)
+-{
+- pid_t pid;
+- va_list args;
+-
+- va_start(args, outfd);
+- pid = start_commandv(cmd, nset, infd, outfd, args);
+- va_end(args);
+- if (pid < 0)
+- return(-1);
+- return(wait_command(pid));
+-}
+-
+-int
+-start_command(char *cmd, sigset_t *nset, int infd, int outfd, ...)
+-{
+- va_list args;
+- int r;
+-
+- va_start(args, outfd);
+- r = start_commandv(cmd, nset, infd, outfd, args);
+- va_end(args);
+- return(r);
++ return pid;
+ }
+
+ void
+-prepare_child(sigset_t *nset, int infd, int outfd)
++prepare_child(nset, infd, outfd)
++ sigset_t *nset;
++ int infd, outfd;
+ {
+ int i;
+- sigset_t eset;
++ sigset_t fset;
+
+ /*
+ * All file descriptors other than 0, 1, and 2 are supposed to be
+ * close-on-exec.
+ */
+- if (infd > 0) {
++ if (infd >= 0)
+ dup2(infd, 0);
+- } else if (infd != 0) {
+- /* we don't want the child stealing my stdin input */
+- close(0);
+- open(_PATH_DEVNULL, O_RDONLY, 0);
+- }
+- if (outfd >= 0 && outfd != 1)
++ if (outfd >= 0)
+ dup2(outfd, 1);
+- if (nset == NULL)
+- return;
+- if (nset != NULL) {
+- for (i = 1; i < NSIG; i++)
++ if (nset) {
++ for (i = 1; i <= NSIG; i++)
+ if (sigismember(nset, i))
+- (void)signal(i, SIG_IGN);
++ (void) signal(i, SIG_IGN);
++ if (!sigismember(nset, SIGINT))
++ (void) signal(SIGINT, SIG_DFL);
+ }
+- if (nset == NULL || !sigismember(nset, SIGINT))
+- (void)signal(SIGINT, SIG_DFL);
+- sigemptyset(&eset);
+- (void)sigprocmask(SIG_SETMASK, &eset, NULL);
++ sigfillset(&fset);
++ (void) sigprocmask(SIG_UNBLOCK, &fset, NULL);
+ }
+
+ int
+-wait_command(pid_t pid)
++wait_command(pid)
++ int pid;
+ {
+
+ if (wait_child(pid) < 0) {
+- puts("Fatal error in process.");
+- return(-1);
++ printf("Fatal error in process.\n");
++ return -1;
+ }
+- return(0);
++ return 0;
+ }
+
+ static struct child *
+-findchild(pid_t pid, int dont_alloc)
++findchild(pid)
++ int pid;
+ {
+- struct child **cpp;
++ register struct child **cpp;
+
+ for (cpp = &child; *cpp != NULL && (*cpp)->pid != pid;
+ cpp = &(*cpp)->link)
+ ;
+ if (*cpp == NULL) {
+- if (dont_alloc)
+- return(NULL);
+- if (child_freelist) {
+- *cpp = child_freelist;
+- child_freelist = (*cpp)->link;
+- } else {
+- *cpp = (struct child *)malloc(sizeof(struct child));
+- if (*cpp == NULL)
+- errx(1, "Out of memory");
+- }
++ *cpp = (struct child *) malloc(sizeof (struct child));
+ (*cpp)->pid = pid;
+ (*cpp)->done = (*cpp)->free = 0;
+ (*cpp)->link = NULL;
+ }
+- return(*cpp);
++ return *cpp;
+ }
+
+ static void
+-delchild(struct child *cp)
++delchild(cp)
++ register struct child *cp;
+ {
+- struct child **cpp;
++ register struct child **cpp;
+
+ for (cpp = &child; *cpp != cp; cpp = &(*cpp)->link)
+ ;
+ *cpp = cp->link;
+- cp->link = child_freelist;
+- child_freelist = cp;
++ free((char *) cp);
+ }
+
+ void
+-sigchild(int signo)
++sigchild(signo)
++ int signo;
+ {
+- pid_t pid;
+- int status;
+- struct child *cp;
+- int save_errno = errno;
++ int pid;
++ union wait status;
++ register struct child *cp;
+
+ while ((pid =
+- waitpid((pid_t)-1, &status, WNOHANG)) > 0) {
+- cp = findchild(pid, 1);
+- if (!cp)
+- continue;
++ wait3((int *)&status, WNOHANG, (struct rusage *)0)) > 0) {
++ cp = findchild(pid);
+ if (cp->free)
+ delchild(cp);
+ else {
+@@ -368,124 +386,132 @@
+ cp->status = status;
+ }
+ }
+- errno = save_errno;
+ }
+
+-int wait_status;
++union wait wait_status;
+
+ /*
+ * Wait for a specific child to die.
+ */
+ int
+-wait_child(pid_t pid)
++wait_child(pid)
++ int pid;
+ {
+- struct child *cp;
+ sigset_t nset, oset;
+- pid_t rv = 0;
+-
++ register struct child *cp = findchild(pid);
+ sigemptyset(&nset);
+ sigaddset(&nset, SIGCHLD);
+ sigprocmask(SIG_BLOCK, &nset, &oset);
+- /*
+- * If we have not already waited on the pid (via sigchild)
+- * wait on it now. Otherwise, use the wait status stashed
+- * by sigchild.
+- */
+- cp = findchild(pid, 1);
+- if (cp == NULL || !cp->done)
+- rv = waitpid(pid, &wait_status, 0);
+- else
+- wait_status = cp->status;
+- if (cp != NULL)
+- delchild(cp);
++
++ while (!cp->done)
++ sigsuspend(&oset);
++ wait_status = cp->status;
++ delchild(cp);
+ sigprocmask(SIG_SETMASK, &oset, NULL);
+- if (rv == -1 || (WIFEXITED(wait_status) && WEXITSTATUS(wait_status)))
+- return(-1);
+- else
+- return(0);
++ return wait_status.w_status ? -1 : 0;
+ }
+
+ /*
+ * Mark a child as don't care.
+ */
+ void
+-free_child(pid_t pid)
++free_child(pid)
++ int pid;
+ {
+- struct child *cp;
+ sigset_t nset, oset;
+-
++ register struct child *cp = findchild(pid);
+ sigemptyset(&nset);
+ sigaddset(&nset, SIGCHLD);
+ sigprocmask(SIG_BLOCK, &nset, &oset);
+- if ((cp = findchild(pid, 0)) != NULL) {
+- if (cp->done)
+- delchild(cp);
+- else
+- cp->free = 1;
+- }
++
++ if (cp->done)
++ delchild(cp);
++ else
++ cp->free = 1;
+ sigprocmask(SIG_SETMASK, &oset, NULL);
+ }
+
+ /*
+- * Lock(1)/unlock(0) mail spool using lockspool(1).
++ * Lock(1)/unlock(0) mail spool using liblockfile
+ * Returns 1 for success, 0 for failure, -1 for bad usage.
+ */
+ static int
+-handle_spool_locks(int action)
++handle_spool_locks(mailname, action)
++ const char *mailname;
++ int action;
+ {
+- static FILE *lockfp = NULL;
+- static pid_t lock_pid;
++ int retval;
++ char lockpath[PATHSIZE];
++
++ snprintf(lockpath, PATHSIZE - 1, "%s.lock", mailname);
++ lockpath[PATHSIZE - 1] = '\0';
+
+ if (action == 0) {
+ /* Clear the lock */
+- if (lockfp == NULL) {
+- fputs("handle_spool_locks: no spool lock to remove.\n",
+- stderr);
+- return(-1);
+- }
+- (void)Pclose(lockfp);
+- lockfp = NULL;
++ retval = lockfile_remove(lockpath);
++ if (retval == 0)
++ return(1);
++ else
++ warn("Cannot remove lockfile %s", lockpath);
++
+ } else if (action == 1) {
+- char *cmd;
+- char buf[sizeof(_PATH_LOCKSPOOL) + 32 + 1];
+
+- /* XXX - lockspool requires root for user arg, we do not */
+- if (uflag) {
+- snprintf(buf, sizeof(buf), "%s %s", _PATH_LOCKSPOOL,
+- myname);
+- cmd = buf;
+- } else
+- cmd = _PATH_LOCKSPOOL;
+-
+- /* Create the lock */
+- lockfp = Popen(cmd, "r");
+- if (lockfp == NULL)
+- return(0);
+- if (getc(lockfp) != '1') {
+- Pclose(lockfp);
+- lockfp = NULL;
+- return(0);
+- }
+- lock_pid = fp_head->pid; /* new entries added at head */
+- } else {
+- (void)fprintf(stderr, "handle_spool_locks: unknown action %d\n",
+- action);
+- return(-1);
++ retval = lockfile_create(lockpath, 3, 0);
++ switch (retval) {
++ case L_SUCCESS:
++ return(1);
++
++ case L_NAMELEN:
++ warnx( "Cannot create lockfile %s: %s",
++ lockpath,
++ "Recipient name too long."
++ );
++ break;
++
++ case L_TMPLOCK:
++ warnx( "Cannot create lockfile %s: %s",
++ lockpath,
++ "Error creating temporary lockfile"
++ );
++ break;
++
++ case L_TMPWRITE:
++ warnx( "Cannot create lockfile %s: %s",
++ lockpath,
++ "Failed to write pid into tmp lockfile."
++ );
++ break;
++
++ case L_MAXTRYS:
++ warnx( "Cannot create lockfile %s: %s",
++ lockpath,
++ "Failed after max tries."
++ );
++ break;
++
++ case L_ERROR:
++ default:
++ warn( "Cannot create lockfile %s",
++ lockpath
++ );
++ break;
++
++ }
+ }
+-
+- return(1);
++
++ return(0);
+ }
+
+ int
+-spool_lock(void)
++spool_lock(mailname)
++ const char * mailname;
+ {
+-
+- return(handle_spool_locks(1));
++ return(handle_spool_locks(mailname, 1));
+ }
+
+ int
+-spool_unlock(void)
++spool_unlock(mailname)
++ const char * mailname;
+ {
+-
+- return(handle_spool_locks(0));
++ return(handle_spool_locks(mailname, 0));
+ }
+diff -urN mailx-8.1.1.orig/quit.c mailx-8.1.1/quit.c
+--- mailx-8.1.1.orig/quit.c 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/quit.c 2003-03-26 13:03:40.000000000 -0800
+@@ -1,5 +1,5 @@
+-/* $OpenBSD: quit.c,v 1.16 2001/11/21 15:26:39 millert Exp $ */
+-/* $NetBSD: quit.c,v 1.6 1996/12/28 07:11:07 tls Exp $ */
++/* $OpenBSD: quit.c,v 1.5 1996/06/08 19:48:37 christos Exp $ */
++/* $NetBSD: quit.c,v 1.5 1996/06/08 19:48:37 christos Exp $ */
+
+ /*
+ * Copyright (c) 1980, 1993
+@@ -36,9 +36,9 @@
+
+ #ifndef lint
+ #if 0
+-static const char sccsid[] = "@(#)quit.c 8.2 (Berkeley) 4/28/95";
++static char sccsid[] = "@(#)quit.c 8.1 (Berkeley) 6/6/93";
+ #else
+-static const char rcsid[] = "$OpenBSD: quit.c,v 1.16 2001/11/21 15:26:39 millert Exp $";
++static char rcsid[] = "$OpenBSD: quit.c,v 1.5 1996/06/08 19:48:37 christos Exp $";
+ #endif
+ #endif /* not lint */
+
+@@ -56,15 +56,16 @@
+ * The "quit" command.
+ */
+ int
+-quitcmd(void *v)
++quitcmd(v)
++ void *v;
+ {
+ /*
+ * If we are sourcing, then return 1 so execute() can handle it.
+ * Otherwise, return -1 to abort command loop.
+ */
+ if (sourcing)
+- return(1);
+- return(-1);
++ return 1;
++ return -1;
+ }
+
+ /*
+@@ -72,29 +73,31 @@
+ * Save all untouched messages back in the system mailbox.
+ * Remove the system mailbox, if none saved there.
+ */
+-int
+-quit(void)
++void
++quit()
+ {
+ int mcount, p, modify, autohold, anystat, holdbit, nohold;
+ FILE *ibuf = NULL, *obuf, *fbuf, *rbuf, *readstat = NULL, *abuf;
+- struct message *mp;
+- int c, fd;
++ register struct message *mp;
++ register int c;
++ extern char *tempQuit, *tempResid;
+ struct stat minfo;
+- char *mbox, tempname[PATHSIZE];
++ char *mbox;
+
+ /*
+ * If we are read only, we can't do anything,
+ * so just return quickly.
+ */
+ if (readonly)
+- return(0);
+-
++ return;
+ /*
+ * If editing (not reading system mail box), then do the work
+ * in edstop()
+ */
+- if (edit)
+- return(edstop());
++ if (edit) {
++ edstop();
++ return;
++ }
+
+ /*
+ * See if there any messages to save in mbox. If no, we
+@@ -105,53 +108,55 @@
+ * If all the messages are to be preserved, just exit with
+ * a message.
+ */
+- fbuf = Fopen(mailname, "r+");
++
++ fbuf = Fopen(mailname, "r");
+ if (fbuf == NULL)
+ goto newmail;
+ if (flock(fileno(fbuf), LOCK_EX) == -1) {
+- warn("Unable to lock mailbox");
+- (void)Fclose(fbuf);
+- return(-1);
++nolock:
++ perror("Unable to lock mailbox");
++ Fclose(fbuf);
++ return;
+ }
+- if (!spool_lock()) {
++ if (!spool_lock(mailname)) {
+ (void)Fclose(fbuf);
+- return(-1); /* lockspool printed the error for us */
+- }
++ return; /* lockspool printed error for us */
++ }
++
+ rbuf = NULL;
+ if (fstat(fileno(fbuf), &minfo) >= 0 && minfo.st_size > mailsize) {
+- puts("New mail has arrived.");
+- (void)snprintf(tempname, sizeof(tempname),
+- "%s/mail.RqXXXXXXXXXX", tmpdir);
+- if ((fd = mkstemp(tempname)) == -1 ||
+- (rbuf = Fdopen(fd, "w")) == NULL)
++ printf("New mail has arrived.\n");
++ rbuf = Fopen(tempResid, "w");
++ if (rbuf == NULL || fbuf == NULL)
+ goto newmail;
+ #ifdef APPEND
+ fseek(fbuf, (long)mailsize, 0);
+ while ((c = getc(fbuf)) != EOF)
+- (void)putc(c, rbuf);
++ (void) putc(c, rbuf);
+ #else
+ p = minfo.st_size - mailsize;
+ while (p-- > 0) {
+ c = getc(fbuf);
+ if (c == EOF)
+ goto newmail;
+- (void)putc(c, rbuf);
++ (void) putc(c, rbuf);
+ }
+ #endif
+- (void)Fclose(rbuf);
+- if ((rbuf = Fopen(tempname, "r")) == NULL)
++ Fclose(rbuf);
++ if ((rbuf = Fopen(tempResid, "r")) == NULL)
+ goto newmail;
+- (void)rm(tempname);
++ rm(tempResid);
+ }
+
+ /*
+ * Adjust the message flags in each message.
+ */
++
+ anystat = 0;
+- autohold = value("hold") != NULL;
++ autohold = value("hold") != NOSTR;
+ holdbit = autohold ? MPRESERVE : MBOX;
+ nohold = MBOX|MSAVED|MDELETED|MPRESERVE;
+- if (value("keepsave") != NULL)
++ if (value("keepsave") != NOSTR)
+ nohold &= ~MSAVED;
+ for (mp = &message[0]; mp < &message[msgCount]; mp++) {
+ if (mp->m_flag & MNEW) {
+@@ -166,9 +171,9 @@
+ mp->m_flag |= holdbit;
+ }
+ modify = 0;
+- if (Tflag != NULL) {
++ if (Tflag != NOSTR) {
+ if ((readstat = Fopen(Tflag, "w")) == NULL)
+- Tflag = NULL;
++ Tflag = NOSTR;
+ }
+ for (c = 0, p = 0, mp = &message[0]; mp < &message[msgCount]; mp++) {
+ if (mp->m_flag & MBOX)
+@@ -177,28 +182,28 @@
+ p++;
+ if (mp->m_flag & MODIFY)
+ modify++;
+- if (Tflag != NULL && (mp->m_flag & (MREAD|MDELETED)) != 0) {
++ if (Tflag != NOSTR && (mp->m_flag & (MREAD|MDELETED)) != 0) {
+ char *id;
+
+- if ((id = hfield("article-id", mp)) != NULL)
++ if ((id = hfield("article-id", mp)) != NOSTR)
+ fprintf(readstat, "%s\n", id);
+ }
+ }
+- if (Tflag != NULL)
+- (void)Fclose(readstat);
++ if (Tflag != NOSTR)
++ Fclose(readstat);
+ if (p == msgCount && !modify && !anystat) {
+ printf("Held %d message%s in %s\n",
+ p, p == 1 ? "" : "s", mailname);
+- (void)Fclose(fbuf);
+- spool_unlock();
+- return(0);
++ Fclose(fbuf);
++ spool_unlock(mailname);
++ return;
+ }
+ if (c == 0) {
+ if (p != 0) {
+ writeback(rbuf);
+- (void)Fclose(fbuf);
+- spool_unlock();
+- return(0);
++ Fclose(fbuf);
++ spool_unlock(mailname);
++ return;
+ }
+ goto cream;
+ }
+@@ -209,67 +214,67 @@
+ * If he has specified "append" don't copy his mailbox,
+ * just copy saveable entries at the end.
+ */
++
+ mbox = expand("&");
+ mcount = c;
+- if (value("append") == NULL) {
+- (void)snprintf(tempname, sizeof(tempname),
+- "%s/mail.RmXXXXXXXXXX", tmpdir);
+- if ((fd = mkstemp(tempname)) == -1 ||
+- (obuf = Fdopen(fd, "w")) == NULL) {
+- warn("%s", tempname);
+- (void)Fclose(fbuf);
+- spool_unlock();
+- return(-1);
++ if (value("append") == NOSTR) {
++ if ((obuf = Fopen(tempQuit, "w")) == NULL) {
++ perror(tempQuit);
++ Fclose(fbuf);
++ spool_unlock(mailname);
++ return;
++ }
++ if ((ibuf = Fopen(tempQuit, "r")) == NULL) {
++ perror(tempQuit);
++ rm(tempQuit);
++ Fclose(obuf);
++ Fclose(fbuf);
++ spool_unlock(mailname);
++ return;
+ }
+- if ((ibuf = Fopen(tempname, "r")) == NULL) {
+- warn("%s", tempname);
+- (void)rm(tempname);
+- (void)Fclose(obuf);
+- (void)Fclose(fbuf);
+- spool_unlock();
+- return(-1);
+- }
+- (void)rm(tempname);
++ rm(tempQuit);
+ if ((abuf = Fopen(mbox, "r")) != NULL) {
+ while ((c = getc(abuf)) != EOF)
+- (void)putc(c, obuf);
+- (void)Fclose(abuf);
++ (void) putc(c, obuf);
++ Fclose(abuf);
+ }
+ if (ferror(obuf)) {
+- warn("%s", tempname);
+- (void)Fclose(ibuf);
+- (void)Fclose(obuf);
+- (void)Fclose(fbuf);
+- spool_unlock();
+- return(-1);
++ perror(tempQuit);
++ Fclose(ibuf);
++ Fclose(obuf);
++ Fclose(fbuf);
++ spool_unlock(mailname);
++ return;
+ }
+- (void)Fclose(obuf);
+- (void)close(creat(mbox, 0600));
++ Fclose(obuf);
++ close(creat(mbox, 0600));
+ if ((obuf = Fopen(mbox, "r+")) == NULL) {
+- warn("%s", mbox);
+- (void)Fclose(ibuf);
+- (void)Fclose(fbuf);
+- spool_unlock();
+- return(-1);
++ perror(mbox);
++ Fclose(ibuf);
++ Fclose(fbuf);
++ spool_unlock(mailname);
++ return;
+ }
+- } else {
++ }
++ else {
+ if ((obuf = Fopen(mbox, "a")) == NULL) {
+- warn("%s", mbox);
+- (void)Fclose(fbuf);
+- spool_unlock();
+- return(-1);
++ perror(mbox);
++ Fclose(fbuf);
++ spool_unlock(mailname);
++ return;
+ }
+ fchmod(fileno(obuf), 0600);
+ }
+ for (mp = &message[0]; mp < &message[msgCount]; mp++)
+ if (mp->m_flag & MBOX)
+- if (sendmessage(mp, obuf, saveignore, NULL) < 0) {
+- warn("%s", mbox);
+- (void)Fclose(ibuf);
+- (void)Fclose(obuf);
+- (void)Fclose(fbuf);
+- spool_unlock();
+- return(-1);
++ if (send(mp, obuf, saveignore, NOSTR) < 0) {
++ perror(mbox);
++ if (ibuf)
++ Fclose(ibuf);
++ Fclose(obuf);
++ Fclose(fbuf);
++ spool_unlock(mailname);
++ return;
+ }
+
+ /*
+@@ -277,29 +282,30 @@
+ * to the end of the stuff we just saved.
+ * If we are appending, this is unnecessary.
+ */
+- if (value("append") == NULL) {
++
++ if (value("append") == NOSTR) {
+ rewind(ibuf);
+ c = getc(ibuf);
+ while (c != EOF) {
+- (void)putc(c, obuf);
++ (void) putc(c, obuf);
+ if (ferror(obuf))
+ break;
+ c = getc(ibuf);
+ }
+- (void)Fclose(ibuf);
++ Fclose(ibuf);
+ fflush(obuf);
+ }
+ trunc(obuf);
+ if (ferror(obuf)) {
+- warn("%s", mbox);
+- (void)Fclose(obuf);
+- (void)Fclose(fbuf);
+- spool_unlock();
+- return(-1);
++ perror(mbox);
++ Fclose(obuf);
++ Fclose(fbuf);
++ spool_unlock(mailname);
++ return;
+ }
+- (void)Fclose(obuf);
++ Fclose(obuf);
+ if (mcount == 1)
+- puts("Saved 1 message in mbox");
++ printf("Saved 1 message in mbox\n");
+ else
+ printf("Saved %d messages in mbox\n", mcount);
+
+@@ -307,44 +313,45 @@
+ * Now we are ready to copy back preserved files to
+ * the system mailbox, if any were requested.
+ */
++
+ if (p != 0) {
+ writeback(rbuf);
+- (void)Fclose(fbuf);
+- spool_unlock();
+- return(0);
++ Fclose(fbuf);
++ spool_unlock(mailname);
++ return;
+ }
+
+ /*
+- * Finally, remove his /var/mail file.
++ * Finally, remove his /usr/mail file.
+ * If new mail has arrived, copy it back.
+ */
++
+ cream:
+ if (rbuf != NULL) {
+ abuf = Fopen(mailname, "r+");
+ if (abuf == NULL)
+ goto newmail;
+ while ((c = getc(rbuf)) != EOF)
+- (void)putc(c, abuf);
+- (void)Fclose(rbuf);
++ (void) putc(c, abuf);
++ Fclose(rbuf);
+ trunc(abuf);
+- (void)Fclose(abuf);
++ Fclose(abuf);
+ alter(mailname);
+- (void)Fclose(fbuf);
+- spool_unlock();
+- return(0);
++ Fclose(fbuf);
++ spool_unlock(mailname);
++ return;
+ }
+ demail();
+- (void)Fclose(fbuf);
+- spool_unlock();
+- return(0);;
++ Fclose(fbuf);
++ spool_unlock(mailname);
++ return;
+
+ newmail:
+- puts("Thou hast new mail.");
++ printf("Thou hast new mail.\n");
+ if (fbuf != NULL) {
+- (void)Fclose(fbuf);
+- spool_unlock();
++ Fclose(fbuf);
++ spool_unlock(mailname);
+ }
+- return(0);
+ }
+
+ /*
+@@ -354,46 +361,47 @@
+ * Incorporate the any new mail that we found.
+ */
+ int
+-writeback(FILE *res)
++writeback(res)
++ register FILE *res;
+ {
+- struct message *mp;
+- int p, c;
++ register struct message *mp;
++ register int p, c;
+ FILE *obuf;
+
+ p = 0;
+ if ((obuf = Fopen(mailname, "r+")) == NULL) {
+- warn("%s", mailname);
++ perror(mailname);
+ return(-1);
+ }
+ #ifndef APPEND
+ if (res != NULL)
+ while ((c = getc(res)) != EOF)
+- (void)putc(c, obuf);
++ (void) putc(c, obuf);
+ #endif
+ for (mp = &message[0]; mp < &message[msgCount]; mp++)
+ if ((mp->m_flag&MPRESERVE)||(mp->m_flag&MTOUCH)==0) {
+ p++;
+- if (sendmessage(mp, obuf, NULL, NULL) < 0) {
+- warn("%s", mailname);
+- (void)Fclose(obuf);
++ if (send(mp, obuf, (struct ignoretab *)0, NOSTR) < 0) {
++ perror(mailname);
++ Fclose(obuf);
+ return(-1);
+ }
+ }
+ #ifdef APPEND
+ if (res != NULL)
+ while ((c = getc(res)) != EOF)
+- (void)putc(c, obuf);
++ (void) putc(c, obuf);
+ #endif
+ fflush(obuf);
+ trunc(obuf);
+ if (ferror(obuf)) {
+- warn("%s", mailname);
+- (void)Fclose(obuf);
++ perror(mailname);
++ Fclose(obuf);
+ return(-1);
+ }
+ if (res != NULL)
+- (void)Fclose(res);
+- (void)Fclose(obuf);
++ Fclose(res);
++ Fclose(obuf);
+ alter(mailname);
+ if (p == 1)
+ printf("Held 1 message in %s\n", mailname);
+@@ -406,21 +414,22 @@
+ * Terminate an editing session by attempting to write out the user's
+ * file from the temporary. Save any new stuff appended to the file.
+ */
+-int
+-edstop(void)
++void
++edstop()
+ {
+- int gotcha, c;
+- struct message *mp;
++ extern char *tmpdir;
++ register int gotcha, c;
++ register struct message *mp;
+ FILE *obuf, *ibuf, *readstat = NULL;
+ struct stat statb;
+- char tempname[PATHSIZE];
++ char *tempname;
+
+ if (readonly)
+- return(0);
++ return;
+ holdsigs();
+- if (Tflag != NULL) {
++ if (Tflag != NOSTR) {
+ if ((readstat = Fopen(Tflag, "w")) == NULL)
+- Tflag = NULL;
++ Tflag = NOSTR;
+ }
+ for (mp = &message[0], gotcha = 0; mp < &message[msgCount]; mp++) {
+ if (mp->m_flag & MNEW) {
+@@ -429,57 +438,53 @@
+ }
+ if (mp->m_flag & (MODIFY|MDELETED|MSTATUS))
+ gotcha++;
+- if (Tflag != NULL && (mp->m_flag & (MREAD|MDELETED)) != 0) {
++ if (Tflag != NOSTR && (mp->m_flag & (MREAD|MDELETED)) != 0) {
+ char *id;
+
+- if ((id = hfield("article-id", mp)) != NULL)
++ if ((id = hfield("article-id", mp)) != NOSTR)
+ fprintf(readstat, "%s\n", id);
+ }
+ }
+- if (Tflag != NULL)
+- (void)Fclose(readstat);
+- if (!gotcha || Tflag != NULL)
++ if (Tflag != NOSTR)
++ Fclose(readstat);
++ if (!gotcha || Tflag != NOSTR)
+ goto done;
+ ibuf = NULL;
+ if (stat(mailname, &statb) >= 0 && statb.st_size > mailsize) {
+- int fd;
++ tempname = tempnam(tmpdir, "mbox");
+
+- (void)snprintf(tempname, sizeof(tempname), "%s/mbox.XXXXXXXXXX",
+- tmpdir);
+- if ((fd = mkstemp(tempname)) == -1 ||
+- (obuf = Fdopen(fd, "w")) == NULL) {
+- warn("%s", tempname);
+- if (fd != -1)
+- close(fd);
++ if ((obuf = Fopen(tempname, "w")) == NULL) {
++ perror(tempname);
+ relsesigs();
+- return(-1);
++ reset(0);
+ }
+ if ((ibuf = Fopen(mailname, "r")) == NULL) {
+- warn("%s", mailname);
+- (void)Fclose(obuf);
+- (void)rm(tempname);
++ perror(mailname);
++ Fclose(obuf);
++ rm(tempname);
+ relsesigs();
+- return(-1);
++ reset(0);
+ }
+ fseek(ibuf, (long)mailsize, 0);
+ while ((c = getc(ibuf)) != EOF)
+- (void)putc(c, obuf);
+- (void)Fclose(ibuf);
+- (void)Fclose(obuf);
++ (void) putc(c, obuf);
++ Fclose(ibuf);
++ Fclose(obuf);
+ if ((ibuf = Fopen(tempname, "r")) == NULL) {
+- warn("%s", tempname);
+- (void)rm(tempname);
++ perror(tempname);
++ rm(tempname);
+ relsesigs();
+- return(-1);
++ reset(0);
+ }
+- (void)rm(tempname);
++ rm(tempname);
++ free(tempname);
+ }
+ printf("\"%s\" ", mailname);
+ fflush(stdout);
+ if ((obuf = Fopen(mailname, "r+")) == NULL) {
+- warn("%s", mailname);
++ perror(mailname);
+ relsesigs();
+- return(-1);
++ reset(0);
+ }
+ trunc(obuf);
+ c = 0;
+@@ -487,33 +492,32 @@
+ if ((mp->m_flag & MDELETED) != 0)
+ continue;
+ c++;
+- if (sendmessage(mp, obuf, NULL, NULL) < 0) {
+- warn("%s", mailname);
++ if (send(mp, obuf, (struct ignoretab *) NULL, NOSTR) < 0) {
++ perror(mailname);
+ relsesigs();
+- return(-1);
++ reset(0);
+ }
+ }
+ gotcha = (c == 0 && ibuf == NULL);
+ if (ibuf != NULL) {
+ while ((c = getc(ibuf)) != EOF)
+- (void)putc(c, obuf);
+- (void)Fclose(ibuf);
++ (void) putc(c, obuf);
++ Fclose(ibuf);
+ }
+ fflush(obuf);
+ if (ferror(obuf)) {
+- warn("%s", mailname);
++ perror(mailname);
+ relsesigs();
+- return(-1);
++ reset(0);
+ }
+- (void)Fclose(obuf);
++ Fclose(obuf);
+ if (gotcha) {
+- (void)rm(mailname);
+- puts("removed");
++ rm(mailname);
++ printf("removed\n");
+ } else
+- puts("complete");
++ printf("complete\n");
+ fflush(stdout);
+
+ done:
+ relsesigs();
+- return(0);
+ }
+diff -urN mailx-8.1.1.orig/rcv.h mailx-8.1.1/rcv.h
+--- mailx-8.1.1.orig/rcv.h 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/rcv.h 1996-06-14 01:27:06.000000000 -0700
+@@ -1,4 +1,4 @@
+-/* $OpenBSD: rcv.h,v 1.2 1996/06/11 12:53:48 deraadt Exp $ */
++/* $OpenBSD: rcv.h,v 1.4 1996/06/08 19:48:38 christos Exp $ */
+ /* $NetBSD: rcv.h,v 1.4 1996/06/08 19:48:38 christos Exp $ */
+
+ /*
+diff -urN mailx-8.1.1.orig/send.c mailx-8.1.1/send.c
+--- mailx-8.1.1.orig/send.c 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/send.c 1996-06-14 01:27:08.000000000 -0700
+@@ -1,4 +1,4 @@
+-/* $OpenBSD: send.c,v 1.15 2001/11/28 01:26:35 millert Exp $ */
++/* $OpenBSD: send.c,v 1.6 1996/06/08 19:48:39 christos Exp $ */
+ /* $NetBSD: send.c,v 1.6 1996/06/08 19:48:39 christos Exp $ */
+
+ /*
+@@ -36,17 +36,15 @@
+
+ #ifndef lint
+ #if 0
+-static const char sccsid[] = "@(#)send.c 8.1 (Berkeley) 6/6/93";
++static char sccsid[] = "@(#)send.c 8.1 (Berkeley) 6/6/93";
+ #else
+-static const char rcsid[] = "$OpenBSD: send.c,v 1.15 2001/11/28 01:26:35 millert Exp $";
++static char rcsid[] = "$OpenBSD: send.c,v 1.6 1996/06/08 19:48:39 christos Exp $";
+ #endif
+ #endif /* not lint */
+
+ #include "rcv.h"
+ #include "extern.h"
+
+-static volatile sig_atomic_t sendsignal; /* Interrupted by a signal? */
+-
+ /*
+ * Mail -- a mail program
+ *
+@@ -61,33 +59,25 @@
+ * prefix is a string to prepend to each output line.
+ */
+ int
+-sendmessage(struct message *mp, FILE *obuf, struct ignoretab *doign,
+- char *prefix)
++send(mp, obuf, doign, prefix)
++ register struct message *mp;
++ FILE *obuf;
++ struct ignoretab *doign;
++ char *prefix;
+ {
+- int count;
+- FILE *ibuf;
++ long count;
++ register FILE *ibuf;
+ char line[LINESIZE];
+ int ishead, infld, ignoring = 0, dostat, firstline;
+- char *cp, *cp2;
+- int c = 0;
++ register char *cp, *cp2;
++ register int c = 0;
+ int length;
+ int prefixlen = 0;
+- int rval;
+- struct sigaction act, saveint;
+- sigset_t oset;
+-
+- sendsignal = 0;
+- rval = -1;
+- sigemptyset(&act.sa_mask);
+- act.sa_flags = SA_RESTART;
+- act.sa_handler = sendint;
+- (void)sigaction(SIGINT, &act, &saveint);
+- (void)sigprocmask(SIG_UNBLOCK, &intset, &oset);
+
+ /*
+ * Compute the prefix string, without trailing whitespace
+ */
+- if (prefix != NULL) {
++ if (prefix != NOSTR) {
+ cp2 = 0;
+ for (cp = prefix; *cp; cp++)
+ if (*cp != ' ' && *cp != '\t')
+@@ -104,11 +94,11 @@
+ * Process headers first
+ */
+ while (count > 0 && ishead) {
+- if (fgets(line, sizeof(line), ibuf) == NULL)
++ if (fgets(line, LINESIZE, ibuf) == NULL)
+ break;
+ count -= length = strlen(line);
+ if (firstline) {
+- /*
++ /*
+ * First line is the From line, so no headers
+ * there to worry about
+ */
+@@ -122,8 +112,7 @@
+ * fields
+ */
+ if (dostat) {
+- if (statusput(mp, obuf, prefix) == -1)
+- goto out;
++ statusput(mp, obuf, prefix);
+ dostat = 0;
+ }
+ ishead = 0;
+@@ -151,13 +140,12 @@
+ * there are no headers at all.
+ */
+ if (dostat) {
+- if (statusput(mp, obuf, prefix) == -1)
+- goto out;
++ statusput(mp, obuf, prefix);
+ dostat = 0;
+ }
+ if (doign != ignoreall)
+ /* add blank line */
+- (void)putc('\n', obuf);
++ (void) putc('\n', obuf);
+ ishead = 0;
+ ignoring = 0;
+ } else {
+@@ -175,8 +163,7 @@
+ * and print the real Status: field
+ */
+ if (dostat) {
+- if (statusput(mp, obuf, prefix) == -1)
+- goto out;
++ statusput(mp, obuf, prefix);
+ dostat = 0;
+ }
+ ignoring = 1;
+@@ -192,32 +179,29 @@
+ * Strip trailing whitespace from prefix
+ * if line is blank.
+ */
+- if (prefix != NULL) {
++ if (prefix != NOSTR)
+ if (length > 1)
+ fputs(prefix, obuf);
+ else
+- (void)fwrite(prefix, sizeof(*prefix),
++ (void) fwrite(prefix, sizeof *prefix,
+ prefixlen, obuf);
+- }
+- (void)fwrite(line, sizeof(*line), length, obuf);
++ (void) fwrite(line, sizeof *line, length, obuf);
+ if (ferror(obuf))
+- goto out;
++ return -1;
+ }
+- if (sendsignal == SIGINT)
+- goto out;
+ }
+ /*
+ * Copy out message body
+ */
+ if (doign == ignoreall)
+ count--; /* skip final blank line */
+- while (count > 0) {
+- if (fgets(line, sizeof(line), ibuf) == NULL) {
+- c = 0;
+- break;
+- }
+- count -= c = strlen(line);
+- if (prefix != NULL) {
++ if (prefix != NOSTR)
++ while (count > 0) {
++ if (fgets(line, LINESIZE, ibuf) == NULL) {
++ c = 0;
++ break;
++ }
++ count -= c = strlen(line);
+ /*
+ * Strip trailing whitespace from prefix
+ * if line is blank.
+@@ -225,53 +209,48 @@
+ if (c > 1)
+ fputs(prefix, obuf);
+ else
+- (void)fwrite(prefix, sizeof(*prefix),
++ (void) fwrite(prefix, sizeof *prefix,
+ prefixlen, obuf);
++ (void) fwrite(line, sizeof *line, c, obuf);
++ if (ferror(obuf))
++ return -1;
++ }
++ else
++ while (count > 0) {
++ c = count < LINESIZE ? count : LINESIZE;
++ if ((c = fread(line, sizeof *line, c, ibuf)) <= 0)
++ break;
++ count -= c;
++ if (fwrite(line, sizeof *line, c, obuf) != c)
++ return -1;
+ }
+- /*
+- * We can't read the record file (or inbox for recipient)
+- * properly with 'From ' lines in the message body (from
+- * forwarded messages or sentences starting with "From "),
+- * so we will prepend those lines with a '>'.
+- */
+- if (strncmp(line, "From ", 5) == 0)
+- (void)fwrite(">", 1, 1, obuf); /* '>' before 'From ' */
+- (void)fwrite(line, sizeof(*line), c, obuf);
+- if (ferror(obuf) || sendsignal == SIGINT)
+- goto out;
+- }
+ if (doign == ignoreall && c > 0 && line[c - 1] != '\n')
+ /* no final blank line */
+ if ((c = getc(ibuf)) != EOF && putc(c, obuf) == EOF)
+- goto out;
+- rval = 0;
+-out:
+- sendsignal = 0;
+- (void)sigprocmask(SIG_SETMASK, &oset, NULL);
+- (void)sigaction(SIGINT, &saveint, NULL);
+- return(rval);
++ return -1;
++ return 0;
+ }
+
+ /*
+ * Output a reasonable looking status field.
+ */
+-int
+-statusput(struct message *mp, FILE *obuf, char *prefix)
++void
++statusput(mp, obuf, prefix)
++ register struct message *mp;
++ FILE *obuf;
++ char *prefix;
+ {
+ char statout[3];
+- char *cp = statout;
++ register char *cp = statout;
+
+ if (mp->m_flag & MREAD)
+ *cp++ = 'R';
+ if ((mp->m_flag & MNEW) == 0)
+ *cp++ = 'O';
+ *cp = 0;
+- if (statout[0]) {
++ if (statout[0])
+ fprintf(obuf, "%sStatus: %s\n",
+- prefix == NULL ? "" : prefix, statout);
+- return(ferror(obuf) ? -1 : 0);
+- }
+- return(0);
++ prefix == NOSTR ? "" : prefix, statout);
+ }
+
+ /*
+@@ -279,8 +258,9 @@
+ * which does all the dirty work.
+ */
+ int
+-mail(struct name *to, struct name *cc, struct name *bcc, struct name *smopts,
+- char *subject)
++mail(to, cc, bcc, smopts, subject)
++ struct name *to, *cc, *bcc, *smopts;
++ char *subject;
+ {
+ struct header head;
+
+@@ -299,16 +279,17 @@
+ * the mail routine below.
+ */
+ int
+-sendmail(void *v)
++sendmail(v)
++ void *v;
+ {
+ char *str = v;
+ struct header head;
+
+ head.h_to = extract(str, GTO);
+- head.h_subject = NULL;
+- head.h_cc = NULL;
+- head.h_bcc = NULL;
+- head.h_smopts = NULL;
++ head.h_subject = NOSTR;
++ head.h_cc = NIL;
++ head.h_bcc = NIL;
++ head.h_smopts = NIL;
+ mail1(&head, 0);
+ return(0);
+ }
+@@ -318,10 +299,12 @@
+ * in the passed header. (Internal interface).
+ */
+ void
+-mail1(struct header *hp, int printheaders)
++mail1(hp, printheaders)
++ struct header *hp;
++ int printheaders;
+ {
+ char *cp;
+- pid_t pid;
++ int pid;
+ char **namelist;
+ struct name *to;
+ FILE *mtf;
+@@ -332,12 +315,21 @@
+ */
+ if ((mtf = collect(hp, printheaders)) == NULL)
+ return;
+- if (fsize(mtf) == 0) {
+- if (hp->h_subject == NULL)
+- puts("No message, no subject; hope that's ok");
++ if (value("interactive") != NOSTR)
++ if (value("askcc") != NOSTR || value("askbcc") != NOSTR) {
++ if (value("askcc") != NOSTR)
++ grabh(hp, GCC);
++ if (value("askbcc") != NOSTR)
++ grabh(hp, GBCC);
++ } else {
++ printf("EOT\n");
++ (void) fflush(stdout);
++ }
++ if (fsize(mtf) == 0)
++ if (hp->h_subject == NOSTR)
++ printf("No message, no subject; hope that's ok\n");
+ else
+- puts("Null message body; hope that's ok");
+- }
++ printf("Null message body; hope that's ok\n");
+ /*
+ * Now, take the user names from the combined
+ * to and cc lists and do all the alias
+@@ -345,8 +337,8 @@
+ */
+ senderr = 0;
+ to = usermap(cat(hp->h_bcc, cat(hp->h_to, hp->h_cc)));
+- if (to == NULL) {
+- puts("No recipients specified");
++ if (to == NIL) {
++ printf("No recipients specified\n");
+ senderr++;
+ }
+ /*
+@@ -361,21 +353,21 @@
+ goto out;
+ fixhead(hp, to);
+ if ((mtf = infix(hp, mtf)) == NULL) {
+- fputs(". . . message lost, sorry.\n", stderr);
++ fprintf(stderr, ". . . message lost, sorry.\n");
+ return;
+ }
+- namelist = unpack(hp->h_smopts, to);
++ namelist = unpack(cat(hp->h_smopts, to));
+ if (debug) {
+ char **t;
+
+- fputs("Sendmail arguments:", stdout);
+- for (t = namelist; *t != NULL; t++)
++ printf("Sendmail arguments:");
++ for (t = namelist; *t != NOSTR; t++)
+ printf(" \"%s\"", *t);
+- putchar('\n');
++ printf("\n");
+ goto out;
+ }
+- if ((cp = value("record")) != NULL)
+- (void)savemail(expand(cp), mtf);
++ if ((cp = value("record")) != NOSTR)
++ (void) savemail(expand(cp), mtf);
+ /*
+ * Fork, set up the temporary mail file as standard
+ * input for "mail", and exec with the user list we generated
+@@ -383,13 +375,12 @@
+ */
+ pid = fork();
+ if (pid == -1) {
+- warn("fork");
++ perror("fork");
+ savedeadletter(mtf);
+ goto out;
+ }
+ if (pid == 0) {
+ sigset_t nset;
+-
+ sigemptyset(&nset);
+ sigaddset(&nset, SIGHUP);
+ sigaddset(&nset, SIGINT);
+@@ -398,20 +389,20 @@
+ sigaddset(&nset, SIGTTIN);
+ sigaddset(&nset, SIGTTOU);
+ prepare_child(&nset, fileno(mtf), -1);
+- if ((cp = value("sendmail")) != NULL)
++ if ((cp = value("sendmail")) != NOSTR)
+ cp = expand(cp);
+ else
+ cp = _PATH_SENDMAIL;
+ execv(cp, namelist);
+- warn("%s", cp);
++ perror(cp);
+ _exit(1);
+ }
+- if (value("verbose") != NULL)
+- (void)wait_child(pid);
++ if (value("verbose") != NOSTR)
++ (void) wait_child(pid);
+ else
+ free_child(pid);
+ out:
+- (void)Fclose(mtf);
++ (void) Fclose(mtf);
+ }
+
+ /*
+@@ -419,14 +410,16 @@
+ * the distribution list into the appropriate fields.
+ */
+ void
+-fixhead(struct header *hp, struct name *tolist)
+-{
+- struct name *np;
+-
+- hp->h_to = NULL;
+- hp->h_cc = NULL;
+- hp->h_bcc = NULL;
+- for (np = tolist; np != NULL; np = np->n_flink)
++fixhead(hp, tolist)
++ struct header *hp;
++ struct name *tolist;
++{
++ register struct name *np;
++
++ hp->h_to = NIL;
++ hp->h_cc = NIL;
++ hp->h_bcc = NIL;
++ for (np = tolist; np != NIL; np = np->n_flink)
+ if ((np->n_type & GMASK) == GTO)
+ hp->h_to =
+ cat(hp->h_to, nalloc(np->n_name, np->n_type));
+@@ -443,47 +436,45 @@
+ * and return the new file.
+ */
+ FILE *
+-infix(struct header *hp, FILE *fi)
+-{
+- FILE *nfo, *nfi;
+- int c, fd;
+- char tempname[PATHSIZE];
+-
+- (void)snprintf(tempname, sizeof(tempname),
+- "%s/mail.RsXXXXXXXXXX", tmpdir);
+- if ((fd = mkstemp(tempname)) == -1 ||
+- (nfo = Fdopen(fd, "w")) == NULL) {
+- warn("%s", tempname);
++infix(hp, fi)
++ struct header *hp;
++ FILE *fi;
++{
++ extern char *tempMail;
++ register FILE *nfo, *nfi;
++ register int c;
++
++ if ((nfo = Fopen(tempMail, "w")) == NULL) {
++ perror(tempMail);
+ return(fi);
+ }
+- if ((nfi = Fopen(tempname, "r")) == NULL) {
+- warn("%s", tempname);
+- (void)Fclose(nfo);
+- (void)rm(tempname);
++ if ((nfi = Fopen(tempMail, "r")) == NULL) {
++ perror(tempMail);
++ (void) Fclose(nfo);
+ return(fi);
+ }
+- (void)rm(tempname);
+- (void)puthead(hp, nfo, GTO|GSUBJECT|GCC|GBCC|GNL|GCOMMA);
++ (void) rm(tempMail);
++ (void) puthead(hp, nfo, GTO|GSUBJECT|GCC|GBCC|GNL|GCOMMA);
+ c = getc(fi);
+ while (c != EOF) {
+- (void)putc(c, nfo);
++ (void) putc(c, nfo);
+ c = getc(fi);
+ }
+ if (ferror(fi)) {
+- warn("read");
++ perror("read");
+ rewind(fi);
+ return(fi);
+ }
+- (void)fflush(nfo);
++ (void) fflush(nfo);
+ if (ferror(nfo)) {
+- warn("%s", tempname);
+- (void)Fclose(nfo);
+- (void)Fclose(nfi);
++ perror(tempMail);
++ (void) Fclose(nfo);
++ (void) Fclose(nfi);
+ rewind(fi);
+ return(fi);
+ }
+- (void)Fclose(nfo);
+- (void)Fclose(fi);
++ (void) Fclose(nfo);
++ (void) Fclose(fi);
+ rewind(nfi);
+ return(nfi);
+ }
+@@ -493,21 +484,24 @@
+ * passed file buffer.
+ */
+ int
+-puthead(struct header *hp, FILE *fo, int w)
++puthead(hp, fo, w)
++ struct header *hp;
++ FILE *fo;
++ int w;
+ {
+- int gotcha;
++ register int gotcha;
+
+ gotcha = 0;
+- if (hp->h_to != NULL && w & GTO)
++ if (hp->h_to != NIL && w & GTO)
+ fmt("To:", hp->h_to, fo, w&GCOMMA), gotcha++;
+- if (hp->h_subject != NULL && w & GSUBJECT)
++ if (hp->h_subject != NOSTR && w & GSUBJECT)
+ fprintf(fo, "Subject: %s\n", hp->h_subject), gotcha++;
+- if (hp->h_cc != NULL && w & GCC)
++ if (hp->h_cc != NIL && w & GCC)
+ fmt("Cc:", hp->h_cc, fo, w&GCOMMA), gotcha++;
+- if (hp->h_bcc != NULL && w & GBCC)
++ if (hp->h_bcc != NIL && w & GBCC)
+ fmt("Bcc:", hp->h_bcc, fo, w&GCOMMA), gotcha++;
+ if (gotcha && w & GNL)
+- (void)putc('\n', fo);
++ (void) putc('\n', fo);
+ return(0);
+ }
+
+@@ -515,16 +509,20 @@
+ * Format the given header line to not exceed 72 characters.
+ */
+ void
+-fmt(char *str, struct name *np, FILE *fo, int comma)
++fmt(str, np, fo, comma)
++ char *str;
++ register struct name *np;
++ FILE *fo;
++ int comma;
+ {
+- int col, len;
++ register col, len;
+
+ comma = comma ? 1 : 0;
+ col = strlen(str);
+ if (col)
+ fputs(str, fo);
+- for (; np != NULL; np = np->n_flink) {
+- if (np->n_flink == NULL)
++ for (; np != NIL; np = np->n_flink) {
++ if (np->n_flink == NIL)
+ comma = 0;
+ len = strlen(np->n_name);
+ col++; /* for the space */
+@@ -544,44 +542,31 @@
+ /*
+ * Save the outgoing mail on the passed file.
+ */
++
+ /*ARGSUSED*/
+ int
+-savemail(char *name, FILE *fi)
++savemail(name, fi)
++ char name[];
++ register FILE *fi;
+ {
+- FILE *fo;
++ register FILE *fo;
+ char buf[BUFSIZ];
++ register i;
+ time_t now;
+
+ if ((fo = Fopen(name, "a")) == NULL) {
+- warn("%s", name);
+- return(-1);
++ perror(name);
++ return (-1);
+ }
+- (void)time(&now);
++ (void) time(&now);
+ fprintf(fo, "From %s %s", myname, ctime(&now));
+- while (fgets(buf, sizeof(buf), fi) == buf) {
+- /*
+- * We can't read the record file (or inbox for recipient)
+- * in the message body (from forwarded messages or sentences
+- * starting with "From "), so we will prepend those lines with
+- * a '>'.
+- */
+- if (strncmp(buf, "From ", 5) == 0)
+- (void)fwrite(">", 1, 1, fo); /* '>' before 'From ' */
+- (void)fwrite(buf, 1, strlen(buf), fo);
+- }
+- (void)putc('\n', fo);
+- (void)fflush(fo);
++ while ((i = fread(buf, 1, sizeof buf, fi)) > 0)
++ (void) fwrite(buf, 1, i, fo);
++ (void) putc('\n', fo);
++ (void) fflush(fo);
+ if (ferror(fo))
+- warn("%s", name);
+- (void)Fclose(fo);
++ perror(name);
++ (void) Fclose(fo);
+ rewind(fi);
+- return(0);
+-}
+-
+-/*ARGSUSED*/
+-void
+-sendint(int s)
+-{
+-
+- sendsignal = s;
++ return (0);
+ }
+diff -urN mailx-8.1.1.orig/strings.c mailx-8.1.1/strings.c
+--- mailx-8.1.1.orig/strings.c 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/strings.c 1996-06-14 01:27:08.000000000 -0700
+@@ -1,4 +1,4 @@
+-/* $OpenBSD: strings.c,v 1.7 2001/11/21 15:26:39 millert Exp $ */
++/* $OpenBSD: strings.c,v 1.5 1996/06/08 19:48:40 christos Exp $ */
+ /* $NetBSD: strings.c,v 1.5 1996/06/08 19:48:40 christos Exp $ */
+
+ /*
+@@ -36,9 +36,9 @@
+
+ #ifndef lint
+ #if 0
+-static const char sccsid[] = "@(#)strings.c 8.1 (Berkeley) 6/6/93";
++static char sccsid[] = "@(#)strings.c 8.1 (Berkeley) 6/6/93";
+ #else
+-static const char rcsid[] = "$OpenBSD: strings.c,v 1.7 2001/11/21 15:26:39 millert Exp $";
++static char rcsid[] = "$OpenBSD: strings.c,v 1.5 1996/06/08 19:48:40 christos Exp $";
+ #endif
+ #endif /* not lint */
+
+@@ -60,32 +60,36 @@
+ * The string spaces are of exponentially increasing size, to satisfy
+ * the occasional user with enormous string size requests.
+ */
++
+ char *
+-salloc(int size)
++salloc(size)
++ int size;
+ {
+- char *t;
+- int s;
+- struct strings *sp;
++ register char *t;
++ register int s;
++ register struct strings *sp;
+ int index;
+
+ s = size;
+- s += (sizeof(char *) - 1);
+- s &= ~(sizeof(char *) - 1);
++ s += (sizeof (char *) - 1);
++ s &= ~(sizeof (char *) - 1);
+ index = 0;
+ for (sp = &stringdope[0]; sp < &stringdope[NSPACE]; sp++) {
+- if (sp->s_topFree == NULL && (STRINGSIZE << index) >= s)
++ if (sp->s_topFree == NOSTR && (STRINGSIZE << index) >= s)
+ break;
+ if (sp->s_nleft >= s)
+ break;
+ index++;
+ }
+ if (sp >= &stringdope[NSPACE])
+- errx(1, "String too large");
+- if (sp->s_topFree == NULL) {
++ panic("String too large");
++ if (sp->s_topFree == NOSTR) {
+ index = sp - &stringdope[0];
+- sp->s_topFree = (char *)malloc(STRINGSIZE << index);
+- if (sp->s_topFree == NULL)
+- errx(1, "No room for space %d", index);
++ sp->s_topFree = malloc(STRINGSIZE << index);
++ if (sp->s_topFree == NOSTR) {
++ fprintf(stderr, "No room for space %d\n", index);
++ panic("Internal error");
++ }
+ sp->s_nextFree = sp->s_topFree;
+ sp->s_nleft = STRINGSIZE << index;
+ }
+@@ -101,16 +105,16 @@
+ * since last reset.
+ */
+ void
+-sreset(void)
++sreset()
+ {
+- struct strings *sp;
+- int index;
++ register struct strings *sp;
++ register int index;
+
+ if (noreset)
+ return;
+ index = 0;
+ for (sp = &stringdope[0]; sp < &stringdope[NSPACE]; sp++) {
+- if (sp->s_topFree == NULL)
++ if (sp->s_topFree == NOSTR)
+ continue;
+ sp->s_nextFree = sp->s_topFree;
+ sp->s_nleft = STRINGSIZE << index;
+@@ -123,10 +127,10 @@
+ * Meant to be called in main, after initialization.
+ */
+ void
+-spreserve(void)
++spreserve()
+ {
+- struct strings *sp;
++ register struct strings *sp;
+
+ for (sp = &stringdope[0]; sp < &stringdope[NSPACE]; sp++)
+- sp->s_topFree = NULL;
++ sp->s_topFree = NOSTR;
+ }
+diff -urN mailx-8.1.1.orig/temp.c mailx-8.1.1/temp.c
+--- mailx-8.1.1.orig/temp.c 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/temp.c 1996-06-14 01:27:08.000000000 -0700
+@@ -1,4 +1,4 @@
+-/* $OpenBSD: temp.c,v 1.13 2002/01/24 23:01:19 millert Exp $ */
++/* $OpenBSD: temp.c,v 1.5 1996/06/08 19:48:42 christos Exp $ */
+ /* $NetBSD: temp.c,v 1.5 1996/06/08 19:48:42 christos Exp $ */
+
+ /*
+@@ -36,13 +36,14 @@
+
+ #ifndef lint
+ #if 0
+-static const char sccsid[] = "@(#)temp.c 8.1 (Berkeley) 6/6/93";
++static char sccsid[] = "@(#)temp.c 8.1 (Berkeley) 6/6/93";
+ #else
+-static const char rcsid[] = "$OpenBSD: temp.c,v 1.13 2002/01/24 23:01:19 millert Exp $";
++static char rcsid[] = "$OpenBSD: temp.c,v 1.5 1996/06/08 19:48:42 christos Exp $";
+ #endif
+ #endif /* not lint */
+
+ #include "rcv.h"
++#include <errno.h>
+ #include "extern.h"
+
+ /*
+@@ -51,47 +52,49 @@
+ * Give names to all the temporary files that we will need.
+ */
+
+-char *tmpdir;
++char *tempMail;
++char *tempQuit;
++char *tempEdit;
++char *tempResid;
++char *tempMesg;
++char *tmpdir;
+
+ void
+-tinit(void)
++tinit()
+ {
+- char *cp;
++ register char *cp;
+
+- if ((tmpdir = getenv("TMPDIR")) == NULL || *tmpdir == '\0')
++ if ((tmpdir = getenv("TMPDIR")) == NULL) {
+ tmpdir = _PATH_TMP;
+- if ((tmpdir = strdup(tmpdir)) == NULL)
+- errx(1, "Out of memory");
+-
+- /* Strip trailing '/' if necessary */
+- cp = tmpdir + strlen(tmpdir) - 1;
+- while (cp > tmpdir && *cp == '/') {
+- *cp = '\0';
+- cp--;
+ }
+
++ tempMail = tempnam (tmpdir, "Rs");
++ tempResid = tempnam (tmpdir, "Rq");
++ tempQuit = tempnam (tmpdir, "Rm");
++ tempEdit = tempnam (tmpdir, "Re");
++ tempMesg = tempnam (tmpdir, "Rx");
++
+ /*
+ * It's okay to call savestr in here because main will
+ * do a spreserve() after us.
+ */
+- if (myname != NULL) {
++ if (myname != NOSTR) {
+ if (getuserid(myname) < 0) {
+- errx(1, "\"%s\" is not a user of this system", myname);
++ printf("\"%s\" is not a user of this system\n",
++ myname);
++ exit(1);
+ }
+ } else {
+- if ((cp = username()) == NULL) {
++ if ((cp = username()) == NOSTR) {
+ myname = "nobody";
+ if (rcvmode)
+ exit(1);
+ } else
+ myname = savestr(cp);
+ }
+- if ((cp = getenv("HOME")) == NULL || *cp == '\0' ||
+- strlen(cp) >= PATHSIZE)
+- homedir = NULL;
+- else
+- homedir = savestr(cp);
++ if ((cp = getenv("HOME")) == NOSTR)
++ cp = ".";
++ homedir = savestr(cp);
+ if (debug)
+- printf("user = %s, homedir = %s\n", myname,
+- homedir ? homedir : "NONE");
++ printf("user = %s, homedir = %s\n", myname, homedir);
+ }
+diff -urN mailx-8.1.1.orig/tty.c mailx-8.1.1/tty.c
+--- mailx-8.1.1.orig/tty.c 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/tty.c 2003-03-26 13:03:40.000000000 -0800
+@@ -1,5 +1,5 @@
+-/* $OpenBSD: tty.c,v 1.16 2001/11/28 01:04:34 millert Exp $ */
+-/* $NetBSD: tty.c,v 1.7 1997/07/09 05:25:46 mikel Exp $ */
++/* $OpenBSD: tty.c,v 1.5 1996/06/08 19:48:43 christos Exp $ */
++/* $NetBSD: tty.c,v 1.5 1996/06/08 19:48:43 christos Exp $ */
+
+ /*
+ * Copyright (c) 1980, 1993
+@@ -36,9 +36,9 @@
+
+ #ifndef lint
+ #if 0
+-static const char sccsid[] = "@(#)tty.c 8.2 (Berkeley) 4/20/95";
++static char sccsid[] = "@(#)tty.c 8.1 (Berkeley) 6/6/93";
+ #else
+-static const char rcsid[] = "$OpenBSD: tty.c,v 1.16 2001/11/28 01:04:34 millert Exp $";
++static char rcsid[] = "$OpenBSD: tty.c,v 1.5 1996/06/08 19:48:43 christos Exp $";
+ #endif
+ #endif /* not lint */
+
+@@ -50,50 +50,54 @@
+
+ #include "rcv.h"
+ #include "extern.h"
+-#include <sys/ioctl.h>
+ #include <errno.h>
++#include <fcntl.h>
++#include <sys/ioctl.h>
+
+-static cc_t c_erase; /* Current erase char */
+-static cc_t c_kill; /* Current kill char */
++static cc_t c_erase; /* Current erase char */
++static cc_t c_kill; /* Current kill char */
++static jmp_buf rewrite; /* Place to go when continued */
++static jmp_buf intjmp; /* Place to go when interrupted */
+ #ifndef TIOCSTI
+-static int ttyset; /* We must now do erase/kill */
++static int ttyset; /* We must now do erase/kill */
++#endif
++
++#ifdef IOSAFE
++static int got_interrupt;
+ #endif
+-static volatile sig_atomic_t ttysignal; /* Interrupted by a signal? */
+
+ /*
+ * Read all relevant header fields.
+ */
++
+ int
+-grabh(struct header *hp, int gflags)
++grabh(hp, gflags)
++ struct header *hp;
++ int gflags;
+ {
+ struct termios ttybuf;
++ sig_t saveint;
+ #ifndef TIOCSTI
+- struct sigaction savequit;
+-#else
+-# ifdef TIOCEXT
+- int extproc;
+- int flag;
+-# endif /* TIOCEXT */
+-#endif
+- struct sigaction savetstp;
+- struct sigaction savettou;
+- struct sigaction savettin;
+- struct sigaction act;
+- char *s;
+- int error;
+-
+- sigemptyset(&act.sa_mask);
+- act.sa_flags = SA_RESTART;
+- act.sa_handler = SIG_DFL;
+- (void)sigaction(SIGTSTP, &act, &savetstp);
+- (void)sigaction(SIGTTOU, &act, &savettou);
+- (void)sigaction(SIGTTIN, &act, &savettin);
+- error = 1;
++ sig_t savequit;
++#endif
++ sig_t savetstp;
++ sig_t savettou;
++ sig_t savettin;
++ int errs;
++#ifdef __GNUC__
++ /* Avoid longjmp clobbering */
++ (void) &saveint;
++#endif
++
++ savetstp = signal(SIGTSTP, SIG_DFL);
++ savettou = signal(SIGTTOU, SIG_DFL);
++ savettin = signal(SIGTTIN, SIG_DFL);
++ errs = 0;
+ #ifndef TIOCSTI
+ ttyset = 0;
+ #endif
+ if (tcgetattr(fileno(stdin), &ttybuf) < 0) {
+- warn("tcgetattr");
++ perror("tcgetattr");
+ return(-1);
+ }
+ c_erase = ttybuf.c_cc[VERASE];
+@@ -101,81 +105,66 @@
+ #ifndef TIOCSTI
+ ttybuf.c_cc[VERASE] = 0;
+ ttybuf.c_cc[VKILL] = 0;
+- act.sa_handler = SIG_IGN;
+- if (sigaction(SIGQUIT, &act, &savequit) == 0 &&
+- savequit.sa_handler == SIG_DFL)
+- (void)sigaction(SIGQUIT, &savequit, NULL);
++ if ((saveint = signal(SIGINT, SIG_IGN)) == SIG_DFL)
++ signal(SIGINT, SIG_DFL);
++ if ((savequit = signal(SIGQUIT, SIG_IGN)) == SIG_DFL)
++ signal(SIGQUIT, SIG_DFL);
+ #else
+-# ifdef TIOCEXT
+- extproc = ((ttybuf.c_lflag & EXTPROC) ? 1 : 0);
+- if (extproc) {
+- flag = 0;
+- if (ioctl(fileno(stdin), TIOCEXT, &flag) < 0)
+- warn("TIOCEXT: off");
+- }
+-# endif /* TIOCEXT */
++#ifdef IOSAFE
++ got_interrupt = 0;
++#endif
++ if (setjmp(intjmp)) {
++ /* avoid garbled output with C-c */
++ printf("\n");
++ fflush(stdout);
++ goto out;
++ }
++ saveint = signal(SIGINT, ttyint);
+ #endif
+ if (gflags & GTO) {
+ #ifndef TIOCSTI
+- if (!ttyset && hp->h_to != NULL)
++ if (!ttyset && hp->h_to != NIL)
+ ttyset++, tcsetattr(fileno(stdin), TCSADRAIN, &ttybuf);
+ #endif
+- s = readtty("To: ", detract(hp->h_to, 0));
+- if (s == NULL)
+- goto out;
+- hp->h_to = extract(s, GTO);
++ hp->h_to =
++ extract(readtty("To: ", detract(hp->h_to, 0)), GTO);
+ }
+ if (gflags & GSUBJECT) {
+ #ifndef TIOCSTI
+- if (!ttyset && hp->h_subject != NULL)
++ if (!ttyset && hp->h_subject != NOSTR)
+ ttyset++, tcsetattr(fileno(stdin), TCSADRAIN, &ttybuf);
+ #endif
+- s = readtty("Subject: ", hp->h_subject);
+- if (s == NULL)
+- goto out;
+- hp->h_subject = s;
++ hp->h_subject = readtty("Subject: ", hp->h_subject);
+ }
+ if (gflags & GCC) {
+ #ifndef TIOCSTI
+- if (!ttyset && hp->h_cc != NULL)
++ if (!ttyset && hp->h_cc != NIL)
+ ttyset++, tcsetattr(fileno(stdin), TCSADRAIN, &ttybuf);
+ #endif
+- s = readtty("Cc: ", detract(hp->h_cc, 0));
+- if (s == NULL)
+- goto out;
+- hp->h_cc = extract(s, GCC);
++ hp->h_cc =
++ extract(readtty("Cc: ", detract(hp->h_cc, 0)), GCC);
+ }
+ if (gflags & GBCC) {
+ #ifndef TIOCSTI
+- if (!ttyset && hp->h_bcc != NULL)
++ if (!ttyset && hp->h_bcc != NIL)
+ ttyset++, tcsetattr(fileno(stdin), TCSADRAIN, &ttybuf);
+ #endif
+- s = readtty("Bcc: ", detract(hp->h_bcc, 0));
+- if (s == NULL)
+- goto out;
+- hp->h_bcc = extract(s, GBCC);
++ hp->h_bcc =
++ extract(readtty("Bcc: ", detract(hp->h_bcc, 0)), GBCC);
+ }
+- error = 0;
+ out:
+- (void)sigaction(SIGTSTP, &savetstp, NULL);
+- (void)sigaction(SIGTTOU, &savettou, NULL);
+- (void)sigaction(SIGTTIN, &savettin, NULL);
++ signal(SIGTSTP, savetstp);
++ signal(SIGTTOU, savettou);
++ signal(SIGTTIN, savettin);
+ #ifndef TIOCSTI
+ ttybuf.c_cc[VERASE] = c_erase;
+ ttybuf.c_cc[VKILL] = c_kill;
+ if (ttyset)
+ tcsetattr(fileno(stdin), TCSADRAIN, &ttybuf);
+- (void)sigaction(SIGQUIT, &savequit, NULL);
+-#else
+-# ifdef TIOCEXT
+- if (extproc) {
+- flag = 1;
+- if (ioctl(fileno(stdin), TIOCEXT, &flag) < 0)
+- warn("TIOCEXT: on");
+- }
+-# endif /* TIOCEXT */
++ signal(SIGQUIT, savequit);
+ #endif
+- return(error);
++ signal(SIGINT, saveint);
++ return(errs);
+ }
+
+ /*
+@@ -184,30 +173,35 @@
+ * be read.
+ *
+ */
++
+ char *
+-readtty(char *pr, char *src)
++readtty(pr, src)
++ char pr[], src[];
+ {
+- struct sigaction act, saveint;
+ char ch, canonb[BUFSIZ];
+- char *cp, *cp2;
+- sigset_t oset;
+ int c;
++ char *cp, *cp2;
++#if __GNUC__
++ /* Avoid longjmp clobbering */
++ (void) &c;
++ (void) &cp2;
++#endif
+
+ fputs(pr, stdout);
+ fflush(stdout);
+- if (src != NULL && strlen(src) > BUFSIZ - 2) {
+- puts("too long to edit");
++ if (src != NOSTR && strlen(src) > BUFSIZ - 2) {
++ printf("too long to edit\n");
+ return(src);
+ }
+ #ifndef TIOCSTI
+- if (src != NULL)
+- cp = copy(src, canonb); /* safe, bounds checked above */
++ if (src != NOSTR)
++ cp = copy(src, canonb);
+ else
+ cp = copy("", canonb);
+ fputs(canonb, stdout);
+ fflush(stdout);
+ #else
+- cp = src == NULL ? "" : src;
++ cp = src == NOSTR ? "" : src;
+ while ((c = *cp++) != '\0') {
+ if ((c_erase != _POSIX_VDISABLE && c == c_erase) ||
+ (c_kill != _POSIX_VDISABLE && c == c_kill)) {
+@@ -224,58 +218,46 @@
+ while (cp2 < canonb + BUFSIZ)
+ *cp2++ = 0;
+ cp2 = cp;
+- sigemptyset(&act.sa_mask);
+- act.sa_flags = 0; /* Note: will not restart syscalls */
+- act.sa_handler = ttyint;
+- (void)sigaction(SIGINT, &act, &saveint);
+- act.sa_handler = ttystop;
+- (void)sigaction(SIGTSTP, &act, NULL);
+- (void)sigaction(SIGTTOU, &act, NULL);
+- (void)sigaction(SIGTTIN, &act, NULL);
+- (void)sigprocmask(SIG_UNBLOCK, &intset, &oset);
++ if (setjmp(rewrite))
++ goto redo;
++#ifdef IOSAFE
++ got_interrupt = 0;
++#endif
++ signal(SIGTSTP, ttystop);
++ signal(SIGTTOU, ttystop);
++ signal(SIGTTIN, ttystop);
+ clearerr(stdin);
+ while (cp2 < canonb + BUFSIZ) {
++#ifdef IOSAFE
++ c = safegetc(stdin);
++ /* this is full of ACE but hopefully, interrupts will only occur in the above read */
++ if (got_interrupt == SIGINT)
++ longjmp(intjmp,1);
++ else if (got_interrupt)
++ longjmp(rewrite,1);
++#else
+ c = getc(stdin);
+- switch (ttysignal) {
+- case SIGINT:
+- ttysignal = 0;
+- cp2 = NULL;
+- c = EOF;
+- /* FALLTHROUGH */
+- case 0:
+- break;
+- default:
+- ttysignal = 0;
+- goto redo;
+- }
++#endif
+ if (c == EOF || c == '\n')
+- break;
++ break;
+ *cp2++ = c;
+ }
+- act.sa_handler = SIG_DFL;
+- sigemptyset(&act.sa_mask);
+- act.sa_flags = SA_RESTART;
+- (void)sigprocmask(SIG_SETMASK, &oset, NULL);
+- (void)sigaction(SIGTSTP, &act, NULL);
+- (void)sigaction(SIGTTOU, &act, NULL);
+- (void)sigaction(SIGTTIN, &act, NULL);
+- (void)sigaction(SIGINT, &saveint, NULL);
+- if (cp2 == NULL)
+- return(NULL); /* user hit ^C */
+- *cp2 = '\0';
++ *cp2 = 0;
++ signal(SIGTSTP, SIG_DFL);
++ signal(SIGTTOU, SIG_DFL);
++ signal(SIGTTIN, SIG_DFL);
+ if (c == EOF && ferror(stdin)) {
+ redo:
+- cp = strlen(canonb) > 0 ? canonb : NULL;
++ cp = strlen(canonb) > 0 ? canonb : NOSTR;
+ clearerr(stdin);
+- /* XXX - make iterative, not recursive */
+ return(readtty(pr, cp));
+ }
+ #ifndef TIOCSTI
+- if (cp == NULL || *cp == '\0')
++ if (cp == NOSTR || *cp == '\0')
+ return(src);
+ cp2 = cp;
+ if (!ttyset)
+- return(strlen(canonb) > 0 ? savestr(canonb) : NULL);
++ return(strlen(canonb) > 0 ? savestr(canonb) : NOSTR);
+ while (*cp != '\0') {
+ c = *cp++;
+ if (c_erase != _POSIX_VDISABLE && c == c_erase) {
+@@ -303,7 +285,7 @@
+ *cp2 = '\0';
+ #endif
+ if (equal("", canonb))
+- return("");
++ return(NOSTR);
+ return(savestr(canonb));
+ }
+
+@@ -311,35 +293,63 @@
+ * Receipt continuation.
+ */
+ void
+-ttystop(int s)
++ttystop(s)
++ int s;
+ {
+- struct sigaction act, oact;
++ sig_t old_action = signal(s, SIG_DFL);
+ sigset_t nset;
+- int save_errno;
+
+- /*
+- * Save old handler and set to default.
+- * Unblock receipt of 's' and then resend it.
+- */
+- save_errno = errno;
+- (void)sigemptyset(&act.sa_mask);
+- act.sa_flags = SA_RESTART;
+- act.sa_handler = SIG_DFL;
+- (void)sigaction(s, &act, &oact);
+- (void)sigemptyset(&nset);
+- (void)sigaddset(&nset, s);
+- (void)sigprocmask(SIG_UNBLOCK, &nset, NULL);
+- (void)kill(0, s);
+- (void)sigprocmask(SIG_BLOCK, &nset, NULL);
+- (void)sigaction(s, &oact, NULL);
+- ttysignal = s;
+- errno = save_errno;
++ sigemptyset(&nset);
++ sigaddset(&nset, s);
++ sigprocmask(SIG_BLOCK, &nset, NULL);
++ kill(0, s);
++ sigprocmask(SIG_UNBLOCK, &nset, NULL);
++ signal(s, old_action);
++#ifdef IOSAFE
++ got_interrupt = s;
++#endif
++ longjmp(rewrite, 1);
+ }
+
+ /*ARGSUSED*/
+ void
+-ttyint(int s)
++ttyint(s)
++ int s;
+ {
++#ifdef IOSAFE
++ got_interrupt = s;
++#else
++ longjmp(intjmp, 1);
++#endif
++}
+
+- ttysignal = s;
++#ifdef IOSAFE
++/* it is very awful, but only way I see to be able to do a interruptable stdio call */
++int safegetc(FILE *ibuf)
++{
++ int oldfl;
++ int res;
++ while (1) {
++ errno = 0;
++ oldfl = fcntl(fileno(ibuf),F_GETFL);
++ fcntl(fileno(ibuf),F_SETFL,oldfl | O_NONBLOCK);
++ res = getc(ibuf);
++ fcntl(fileno(ibuf),F_SETFL,oldfl);
++ if (res != EOF)
++ return res;
++ else if (errno == EAGAIN || errno == EWOULDBLOCK) {
++ fd_set rds;
++ clearerr(ibuf);
++ FD_ZERO(&rds);
++ FD_SET(fileno(ibuf),&rds);
++ select(fileno(ibuf)+1,&rds,NULL,NULL,NULL);
++ /* if an interrupt occur drops the current line and returns */
++ if (got_interrupt)
++ return EOF;
++ } else {
++ /* probably EOF one the file descriptors */
++ return EOF;
++ }
++ }
+ }
++#endif
+diff -urN mailx-8.1.1.orig/v7.local.c mailx-8.1.1/v7.local.c
+--- mailx-8.1.1.orig/v7.local.c 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/v7.local.c 2003-03-26 13:03:40.000000000 -0800
+@@ -1,5 +1,5 @@
+-/* $OpenBSD: v7.local.c,v 1.13 2001/11/21 15:26:39 millert Exp $ */
+-/* $NetBSD: v7.local.c,v 1.8 1997/05/13 06:15:58 mikel Exp $ */
++/* $OpenBSD: v7.local.c,v 1.7 1996/06/08 19:48:44 christos Exp $ */
++/* $NetBSD: v7.local.c,v 1.7 1996/06/08 19:48:44 christos Exp $ */
+
+ /*
+ * Copyright (c) 1980, 1993
+@@ -36,9 +36,9 @@
+
+ #ifndef lint
+ #if 0
+-static const char sccsid[] = "@(#)v7.local.c 8.1 (Berkeley) 6/6/93";
++static char sccsid[] = "@(#)v7.local.c 8.1 (Berkeley) 6/6/93";
+ #else
+-static const char rcsid[] = "$OpenBSD: v7.local.c,v 1.13 2001/11/21 15:26:39 millert Exp $";
++static char rcsid[] = "$OpenBSD: v7.local.c,v 1.7 1996/06/08 19:48:44 christos Exp $";
+ #endif
+ #endif /* not lint */
+
+@@ -60,50 +60,52 @@
+ * mail is queued).
+ */
+ void
+-findmail(char *user, char *buf, int buflen)
++findmail(user, buf, size)
++ char *user, *buf;
++ int size;
+ {
+ char *mbox;
+- struct stat sb;
+
+- /* Ignore $MAIL if it is not owned by the invoking user */
+- if ((mbox = getenv("MAIL")) && stat(mbox, &sb) == 0 &&
+- sb.st_uid != getuid() && sb.st_uid != geteuid())
+- mbox = NULL;
+-
+- if (mbox)
+- (void)istrcpy(buf, mbox, buflen);
+- else
+- (void)snprintf(buf, buflen, "%s/%s", _PATH_MAILDIR, user);
++ if (!(mbox = getenv("MAIL"))) {
++ char safelist[] = _PATH_MAILDIR;
++ char *safepath, *p = safelist;
++ while ((safepath = strtok(p, ":"))) {
++ p = 0;
++ (void)snprintf(buf, size, "%s/%s", safepath, user);
++ if (access(buf, F_OK) == 0)
++ break;
++ }
++ } else {
++ (void)strncpy(buf, mbox, size);
++ buf[size-1]='\0';
++ }
++
+ }
+
+ /*
+ * Get rid of the queued mail.
+ */
+ void
+-demail(void)
++demail()
+ {
+
+- if (value("keep") != NULL || rm(mailname) < 0)
+- (void)close(creat(mailname, 0600));
++ if (value("keep") != NOSTR || rm(mailname) < 0)
++ close(creat(mailname, 0600));
+ }
+
+ /*
+ * Discover user login name.
+ */
+ char *
+-username(void)
++username()
+ {
+ char *np;
+ uid_t uid;
+
+- if ((np = getenv("USER")) != NULL)
+- return(np);
+- if ((np = getenv("LOGNAME")) != NULL)
+- return(np);
+- if ((np = getname(uid = getuid())) != NULL)
+- return(np);
+- if ((np = getlogin()) != NULL)
+- return(np);
+- printf("Cannot associate a name with uid %u\n", (unsigned)uid);
+- return(NULL);
++ if ((np = getenv("USER")) != NOSTR)
++ return np;
++ if ((np = getname(uid = getuid())) != NOSTR)
++ return np;
++ printf("Cannot associate a name with uid %d\n", uid);
++ return NOSTR;
+ }
+diff -urN mailx-8.1.1.orig/vars.c mailx-8.1.1/vars.c
+--- mailx-8.1.1.orig/vars.c 2003-03-26 12:58:12.000000000 -0800
++++ mailx-8.1.1/vars.c 2003-03-26 13:03:40.000000000 -0800
+@@ -1,4 +1,4 @@
+-/* $OpenBSD: vars.c,v 1.9 2002/08/12 00:42:56 aaron Exp $ */
++/* $OpenBSD: vars.c,v 1.4 1996/06/08 19:48:45 christos Exp $ */
+ /* $NetBSD: vars.c,v 1.4 1996/06/08 19:48:45 christos Exp $ */
+
+ /*
+@@ -36,9 +36,9 @@
+
+ #ifndef lint
+ #if 0
+-static const char sccsid[] = "@(#)vars.c 8.1 (Berkeley) 6/6/93";
++static char sccsid[] = "@(#)vars.c 8.1 (Berkeley) 6/6/93";
+ #else
+-static const char rcsid[] = "$OpenBSD: vars.c,v 1.9 2002/08/12 00:42:56 aaron Exp $";
++static char rcsid[] = "$OpenBSD: vars.c,v 1.4 1996/06/08 19:48:45 christos Exp $";
+ #endif
+ #endif /* not lint */
+
+@@ -55,16 +55,16 @@
+ * Assign a value to a variable.
+ */
+ void
+-assign(char *name, char *value)
++assign(name, value)
++ char name[], value[];
+ {
+- struct var *vp;
+- int h;
++ register struct var *vp;
++ register int h;
+
+ h = hash(name);
+ vp = lookup(name);
+- if (vp == NULL) {
+- if ((vp = (struct var *)calloc(1, sizeof(*vp))) == NULL)
+- errx(1, "Out of memory");
++ if (vp == NOVAR) {
++ vp = (struct var *) calloc(sizeof *vp, 1);
+ vp->v_name = vcopy(name);
+ vp->v_link = variables[h];
+ variables[h] = vp;
+@@ -80,27 +80,34 @@
+ * Thus, we cannot free same!
+ */
+ void
+-vfree(char *cp)
++vfree(cp)
++ char *cp;
+ {
+-
+- if (*cp)
+- (void)free(cp);
++ if (cp && *cp)
++ free(cp);
+ }
+
+ /*
+ * Copy a variable value into permanent (ie, not collected after each
+ * command) space. Do not bother to alloc space for ""
+ */
++
+ char *
+-vcopy(char *str)
++vcopy(str)
++ char str[];
+ {
+ char *new;
++ unsigned len;
+
++ if (str == NULL)
++ return NULL;
+ if (*str == '\0')
+- return("");
+- if ((new = strdup(str)) == NULL)
+- errx(1, "Out of memory");
+- return(new);
++ return "";
++ len = strlen(str) + 1;
++ if ((new = malloc(len)) == NULL)
++ panic("Out of memory");
++ bcopy(str, new, (int) len);
++ return new;
+ }
+
+ /*
+@@ -109,70 +116,65 @@
+ */
+
+ char *
+-value(char *name)
++value(name)
++ char name[];
+ {
+- struct var *vp;
+- char *env;
++ register struct var *vp;
+
+- if ((vp = lookup(name)) != NULL)
+- return(vp->v_value);
+- else if ((env = getenv(name)))
+- return(env);
+- /* not set, see if we can provide a default */
+- else if (strcmp(name, "SHELL") == 0)
+- return(_PATH_CSHELL);
+- else if (strcmp(name, "LISTER") == 0)
+- return(_PATH_LS);
+- else if (strcmp(name, "PAGER") == 0)
+- return(_PATH_MORE);
+- else
+- return(NULL);
++ if ((vp = lookup(name)) == NOVAR)
++ return NULL;
++ return(vp->v_value);
+ }
+
+ /*
+ * Locate a variable and return its variable
+ * node.
+ */
++
+ struct var *
+-lookup(char *name)
++lookup(name)
++ register char name[];
+ {
+- struct var *vp;
++ register struct var *vp;
+
+- for (vp = variables[hash(name)]; vp != NULL; vp = vp->v_link)
++ for (vp = variables[hash(name)]; vp != NOVAR; vp = vp->v_link)
+ if (*vp->v_name == *name && equal(vp->v_name, name))
+ return(vp);
+- return(NULL);
++ return(NOVAR);
+ }
+
+ /*
+ * Locate a group name and return it.
+ */
++
+ struct grouphead *
+-findgroup(char *name)
++findgroup(name)
++ register char name[];
+ {
+- struct grouphead *gh;
++ register struct grouphead *gh;
+
+- for (gh = groups[hash(name)]; gh != NULL; gh = gh->g_link)
++ for (gh = groups[hash(name)]; gh != NOGRP; gh = gh->g_link)
+ if (*gh->g_name == *name && equal(gh->g_name, name))
+ return(gh);
+- return(NULL);
++ return(NOGRP);
+ }
+
+ /*
+ * Print a group out on stdout
+ */
+ void
+-printgroup(char *name)
++printgroup(name)
++ char name[];
+ {
+- struct grouphead *gh;
+- struct group *gp;
++ register struct grouphead *gh;
++ register struct group *gp;
+
+- if ((gh = findgroup(name)) == NULL) {
++ if ((gh = findgroup(name)) == NOGRP) {
+ printf("\"%s\": not a group\n", name);
+ return;
+ }
+ printf("%s\t", gh->g_name);
+- for (gp = gh->g_list; gp != NULL; gp = gp->ge_link)
++ for (gp = gh->g_list; gp != NOGE; gp = gp->ge_link)
+ printf(" %s", gp->ge_name);
+ putchar('\n');
+ }
+@@ -182,9 +184,10 @@
+ * the variable or group hash table.
+ */
+ int
+-hash(char *name)
++hash(name)
++ register char *name;
+ {
+- int h = 0;
++ register h = 0;
+
+ while (*name) {
+ h <<= 2;
+@@ -192,5 +195,5 @@
+ }
+ if (h < 0 && (h = -h) < 0)
+ h = 0;
+- return(h % HSHSIZE);
++ return (h % HSHSIZE);
+ }
+diff -urN mailx-8.1.1.orig/version.c mailx-8.1.1/version.c
+--- mailx-8.1.1.orig/version.c 2003-03-26 12:58:13.000000000 -0800
++++ mailx-8.1.1/version.c 1996-06-14 01:27:09.000000000 -0700
+@@ -1,4 +1,4 @@
+-/* $OpenBSD: version.c,v 1.5 2001/11/21 15:26:39 millert Exp $ */
++/* $OpenBSD: version.c,v 1.4 1996/06/08 19:48:46 christos Exp $ */
+ /* $NetBSD: version.c,v 1.4 1996/06/08 19:48:46 christos Exp $ */
+
+ /*
+@@ -36,9 +36,9 @@
+
+ #ifndef lint
+ #if 0
+-static const char sccsid[] = "@(#)version.c 8.1 (Berkeley) 6/6/93";
++static char sccsid[] = "@(#)version.c 8.1 (Berkeley) 6/6/93";
+ #else
+-static const char rcsid[] = "$OpenBSD: version.c,v 1.5 2001/11/21 15:26:39 millert Exp $";
++static char rcsid[] = "$OpenBSD: version.c,v 1.4 1996/06/08 19:48:46 christos Exp $";
+ #endif
+ #endif /* not lint */
+
+@@ -46,4 +46,4 @@
+ * Just keep track of the date/sid of this version of Mail.
+ * Load this file first to get a "total" Mail version.
+ */
+-const char version[] = "8.1.2 01/15/2001";
++char *version = "8.1 6/6/93";
diff --git a/net-mail/mailx/mailx-8.1.2.20021129-r1.ebuild b/net-mail/mailx/mailx-8.1.2.20021129-r1.ebuild
new file mode 100644
index 000000000000..c12c513be95b
--- /dev/null
+++ b/net-mail/mailx/mailx-8.1.2.20021129-r1.ebuild
@@ -0,0 +1,60 @@
+# Copyright 1999-2003 Gentoo Technologies, Inc.
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/net-mail/mailx/mailx-8.1.2.20021129-r1.ebuild,v 1.1 2003/03/28 21:46:40 avenj Exp $
+
+MX_VER="8.1.1"
+S=${WORKDIR}/mailx-${MX_VER}.orig
+
+DESCRIPTION="The /bin/mail program, which is used to send mail via shell scripts."
+SRC_URI="ftp://ftp.debian.org/debian/pool/main/m/mailx/mailx_${MX_VER}.orig.tar.gz"
+HOMEPAGE="http://www.debian.org"
+
+DEPEND=">=net-libs/liblockfile-1.03
+ virtual/mta
+ !net-mail/mailutils"
+
+SLOT="0"
+LICENSE="GPL-2"
+KEYWORDS="x86 ppc sparc alpha"
+
+src_unpack() {
+
+ unpack ${A}
+ cd ${S}
+ bzcat ${FILESDIR}/20021129-cvs.diff.bz2 | patch -p1 \
+ || die "patch failed"
+ epatch ${FILESDIR}/multifix.diff || die "patch failed"
+}
+
+src_compile() {
+
+ # Can't compile mailx with optimizations
+ _CFLAGS=$(echo $CFLAGS|sed 's/-O.//g')
+
+ make CFLAGS="$_CFLAGS" || die "make failed"
+
+}
+
+src_install() {
+
+ dodir /bin /usr/share/man/man1 /etc /usr/lib
+
+ insinto /bin
+ insopts -m 755
+ doins mail
+
+ doman mail.1
+
+ dosym mail /bin/Mail
+ dosym mail /bin/mailx
+ dosym mail.1 /usr/share/man/man1/Mail.1
+
+ cd ${S}/misc
+ insinto /usr/lib
+ insopts -m 644
+ doins mail.help mail.tildehelp
+ insinto /etc
+ insopts -m 644
+ doins mail.rc
+
+}