diff options
author | Jon Portnoy <avenj@gentoo.org> | 2003-03-30 08:11:37 +0000 |
---|---|---|
committer | Jon Portnoy <avenj@gentoo.org> | 2003-03-30 08:11:37 +0000 |
commit | e12ad22a28de9005e5749150938e5bb761a4c277 (patch) | |
tree | d699a9995cc918b255bcb4dc874c9d4f7a8228ca /net-mail | |
parent | Initial import. #17599 (diff) | |
download | gentoo-2-e12ad22a28de9005e5749150938e5bb761a4c277.tar.gz gentoo-2-e12ad22a28de9005e5749150938e5bb761a4c277.tar.bz2 gentoo-2-e12ad22a28de9005e5749150938e5bb761a4c277.zip |
Moved huge patch out of FILESDIR
Diffstat (limited to 'net-mail')
-rw-r--r-- | net-mail/mailx/files/digest-mailx-8.1.2.20021129-r1 | 1 | ||||
-rw-r--r-- | net-mail/mailx/files/multifix.diff | 13303 | ||||
-rw-r--r-- | net-mail/mailx/mailx-8.1.2.20021129-r1.ebuild | 7 |
3 files changed, 5 insertions, 13306 deletions
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 index ab658e38e44a..c316d02fa631 100644 --- a/net-mail/mailx/files/digest-mailx-8.1.2.20021129-r1 +++ b/net-mail/mailx/files/digest-mailx-8.1.2.20021129-r1 @@ -1 +1,2 @@ MD5 c779002cb043b57fd5198ec2032cacb0 mailx_8.1.1.orig.tar.gz 89069 +MD5 49a4dbee10b9997127dd4d3001bd5b04 multifix.diff.gz 91955 diff --git a/net-mail/mailx/files/multifix.diff b/net-mail/mailx/files/multifix.diff deleted file mode 100644 index 6ccc25406f1f..000000000000 --- a/net-mail/mailx/files/multifix.diff +++ /dev/null @@ -1,13303 +0,0 @@ -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 index c12c513be95b..795c65541fd1 100644 --- a/net-mail/mailx/mailx-8.1.2.20021129-r1.ebuild +++ b/net-mail/mailx/mailx-8.1.2.20021129-r1.ebuild @@ -1,12 +1,13 @@ # 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 $ +# $Header: /var/cvsroot/gentoo-x86/net-mail/mailx/mailx-8.1.2.20021129-r1.ebuild,v 1.2 2003/03/30 08:11:37 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" +SRC_URI="ftp://ftp.debian.org/debian/pool/main/m/mailx/mailx_${MX_VER}.orig.tar.gz + mirror://gentoo/multifix.diff.gz" HOMEPAGE="http://www.debian.org" DEPEND=">=net-libs/liblockfile-1.03 @@ -23,7 +24,7 @@ src_unpack() { cd ${S} bzcat ${FILESDIR}/20021129-cvs.diff.bz2 | patch -p1 \ || die "patch failed" - epatch ${FILESDIR}/multifix.diff || die "patch failed" + epatch ${DISTDIR}/multifix.diff.gz || die "patch failed" } src_compile() { |