summaryrefslogtreecommitdiffstats
path: root/usr.bin/mail
diff options
context:
space:
mode:
authormikeh <mikeh@FreeBSD.org>2001-03-25 04:57:05 +0000
committermikeh <mikeh@FreeBSD.org>2001-03-25 04:57:05 +0000
commite51e7e067d9cfc20e2881f888c5f45046c153df8 (patch)
treeb1ac3afa472ab794d2a7118bc10ebee16c55812f /usr.bin/mail
parentafd190c2240ce9ef47e8180f3d48af53f636952f (diff)
downloadFreeBSD-src-e51e7e067d9cfc20e2881f888c5f45046c153df8.zip
FreeBSD-src-e51e7e067d9cfc20e2881f888c5f45046c153df8.tar.gz
Merge various changes from OpenBSD and NetBSD.
o remove panic() in favor of err(3) and use err(3) functions consistently throughout o use stat(2)'s S_IS* macros rather than S_IF* o [r]index -> str[r]chr o convert some static buffers to dynamic ones o use real tempfiles rather than reopening the same templates o rename some functions that clash with libc o convert wait_status from union to int and use wait(2) status macros o fix multiple potential buffer overflows o fix a few comments o add $FreeBSD$ Reviewed by: nra, nectar (earlier version)
Diffstat (limited to 'usr.bin/mail')
-rw-r--r--usr.bin/mail/aux.c145
-rw-r--r--usr.bin/mail/cmd1.c16
-rw-r--r--usr.bin/mail/cmd2.c22
-rw-r--r--usr.bin/mail/cmd3.c44
-rw-r--r--usr.bin/mail/cmdtab.c4
-rw-r--r--usr.bin/mail/collect.c57
-rw-r--r--usr.bin/mail/def.h1
-rw-r--r--usr.bin/mail/edit.c49
-rw-r--r--usr.bin/mail/extern.h22
-rw-r--r--usr.bin/mail/fio.c89
-rw-r--r--usr.bin/mail/getname.c8
-rw-r--r--usr.bin/mail/glob.h2
-rw-r--r--usr.bin/mail/head.c9
-rw-r--r--usr.bin/mail/lex.c59
-rw-r--r--usr.bin/mail/list.c36
-rw-r--r--usr.bin/mail/main.c41
-rw-r--r--usr.bin/mail/names.c57
-rw-r--r--usr.bin/mail/pathnames.h2
-rw-r--r--usr.bin/mail/popen.c30
-rw-r--r--usr.bin/mail/quit.c79
-rw-r--r--usr.bin/mail/rcv.h2
-rw-r--r--usr.bin/mail/send.c47
-rw-r--r--usr.bin/mail/strings.c13
-rw-r--r--usr.bin/mail/temp.c69
-rw-r--r--usr.bin/mail/tty.c14
-rw-r--r--usr.bin/mail/v7.local.c21
-rw-r--r--usr.bin/mail/vars.c6
-rw-r--r--usr.bin/mail/version.c4
28 files changed, 478 insertions, 470 deletions
diff --git a/usr.bin/mail/aux.c b/usr.bin/mail/aux.c
index d8d385a..baeaa51 100644
--- a/usr.bin/mail/aux.c
+++ b/usr.bin/mail/aux.c
@@ -32,7 +32,11 @@
*/
#ifndef lint
+#if 0
static char sccsid[] = "@(#)aux.c 8.1 (Berkeley) 6/6/93";
+#endif
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
#include "rcv.h"
@@ -81,38 +85,6 @@ save2str(str, old)
}
/*
- * 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();
-}
-
-/*
* Touch the named message by setting its MTOUCH flag.
* Touched messages have the effect of not being sent
* back to the system mailbox on exit.
@@ -139,7 +111,7 @@ isdir(name)
if (stat(name, &sbuf) < 0)
return(0);
- return((sbuf.st_mode & S_IFMT) == S_IFDIR);
+ return(S_ISDIR(sbuf.st_mode));
}
/*
@@ -269,19 +241,18 @@ ishfield(linebuf, colon, field)
}
/*
- * Copy a string, lowercasing it as we go.
+ * Copy a string and lowercase the result.
+ * dsize: space left in buffer (including space for NULL)
*/
void
-istrcpy(dest, src)
+istrncpy(dest, src, dsize)
register char *dest, *src;
+ size_t dsize;
{
- do {
- if (isupper(*src))
- *dest++ = tolower(*src);
- else
- *dest++ = *src;
- } while (*src++ != 0);
+ strlcpy(dest, src, dsize);
+ while (*dest)
+ *dest++ = tolower(*dest);
}
/*
@@ -314,7 +285,7 @@ source(arglist)
if ((cp = expand(*arglist)) == NOSTR)
return(1);
if ((fi = Fopen(cp, "r")) == NULL) {
- perror(cp);
+ warn("%s", cp);
return(1);
}
if (ssp >= SSTACK_SIZE - 1) {
@@ -378,22 +349,6 @@ alter(name)
}
/*
- * Examine the passed line buffer and
- * return true if it is all blanks and tabs.
- */
-int
-blankline(linebuf)
- char linebuf[];
-{
- register char *cp;
-
- for (cp = linebuf; *cp; cp++)
- if (*cp != ' ' && *cp != '\t')
- return(0);
- return(1);
-}
-
-/*
* Get sender's name from this message. If the message has
* a bunch of arpanet stuff in it, we may have to skin the name
* before returning it.
@@ -408,7 +363,7 @@ nameof(mp, reptype)
cp = skin(name1(mp, reptype));
if (reptype != 0 || charcount(cp, '!') < 2)
return(cp);
- cp2 = rindex(cp, '!');
+ cp2 = strrchr(cp, '!');
cp2--;
while (cp2 > cp && *cp2 != '!')
cp2--;
@@ -454,15 +409,18 @@ skin(name)
{
register int c;
register char *cp, *cp2;
- char *bufend;
+ char *bufend, *nbuf;
int gotlt, lastsp;
- char nbuf[BUFSIZ];
if (name == NOSTR)
return(NOSTR);
- if (index(name, '(') == NOSTR && index(name, '<') == NOSTR
- && index(name, ' ') == NOSTR)
+ if (strchr(name, '(') == NOSTR && strchr(name, '<') == NOSTR
+ && strchr(name, ' ') == NOSTR)
return(name);
+
+ /* We assume that length(input) <= length(output) */
+ if ((nbuf = (char *)malloc(strlen(name) + 1)) == NULL)
+ err(1, "Out of memory");
gotlt = 0;
lastsp = 0;
bufend = nbuf;
@@ -546,7 +504,9 @@ skin(name)
}
*cp2 = 0;
- return(savestr(nbuf));
+ if ((nbuf = (char *)realloc(nbuf, strlen(nbuf) + 1)) == NULL)
+ err(1, "Out of memory");
+ return(nbuf);
}
/*
@@ -586,24 +546,25 @@ newname:
*cp2 = '\0';
if (readline(ibuf, linebuf, LINESIZE) < 0)
return(savestr(namebuf));
- if ((cp = index(linebuf, 'F')) == NULL)
+ if ((cp = strchr(linebuf, 'F')) == NULL)
return(savestr(namebuf));
if (strncmp(cp, "From", 4) != 0)
return(savestr(namebuf));
- while ((cp = index(cp, 'r')) != NULL) {
+ while ((cp = strchr(cp, 'r')) != NULL) {
if (strncmp(cp, "remote", 6) == 0) {
- if ((cp = index(cp, 'f')) == NULL)
+ if ((cp = strchr(cp, 'f')) == NULL)
break;
if (strncmp(cp, "from", 4) != 0)
break;
- if ((cp = index(cp, ' ')) == NULL)
+ if ((cp = strchr(cp, ' ')) == NULL)
break;
cp++;
if (first) {
- strcpy(namebuf, cp);
+ cp2 = namebuf;
first = 0;
} else
- strcpy(rindex(namebuf, '!')+1, cp);
+ cp2 = strrchr(namebuf, '!') + 1;
+ strlcpy(cp2, cp, sizeof(namebuf) - (cp2 - namebuf) - 1);
strcat(namebuf, "!");
goto newname;
}
@@ -630,46 +591,6 @@ charcount(str, c)
}
/*
- * 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(c)
- register int c;
-{
-
- if (islower(c))
- return toupper(c);
- return c;
-}
-
-/*
- * Copy s1 to s2, return pointer to null in s2.
- */
-char *
-copy(s1, s2)
- register char *s1, *s2;
-{
-
- while (*s2++ = *s1++)
- ;
- return s2 - 1;
-}
-
-/*
* See if the given header field is supposed to be ignored.
*/
int
@@ -677,7 +598,7 @@ isign(field, ignore)
char *field;
struct ignoretab ignore[2];
{
- char realfld[BUFSIZ];
+ char realfld[LINESIZE];
if (ignore == ignoreall)
return 1;
@@ -685,7 +606,7 @@ isign(field, ignore)
* Lower-case the string, so that "Status" and "status"
* will hash to the same place.
*/
- istrcpy(realfld, field);
+ istrncpy(realfld, field, sizeof(realfld));
if (ignore[1].i_count > 0)
return (!member(realfld, ignore + 1));
else
diff --git a/usr.bin/mail/cmd1.c b/usr.bin/mail/cmd1.c
index 25c08fa..0800d0a 100644
--- a/usr.bin/mail/cmd1.c
+++ b/usr.bin/mail/cmd1.c
@@ -32,7 +32,11 @@
*/
#ifndef lint
+#if 0
static char sccsid[] = "@(#)cmd1.c 8.1 (Berkeley) 6/6/93";
+#endif
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
#include "rcv.h"
@@ -316,7 +320,7 @@ type1(msgvec, doign, page)
cp = _PATH_MORE;
obuf = Popen(cp, "w");
if (obuf == NULL) {
- perror(cp);
+ warnx("%s", cp);
obuf = stdout;
} else
signal(SIGPIPE, brokpipe);
@@ -328,7 +332,7 @@ type1(msgvec, doign, page)
dot = mp;
if (value("quiet") == NOSTR)
fprintf(obuf, "Message %d:\n", *ip);
- (void) send(mp, obuf, doign ? ignore : 0, NOSTR);
+ (void) sendmessage(mp, obuf, doign ? ignore : 0, NOSTR);
}
close_pipe:
if (obuf != stdout) {
@@ -387,10 +391,10 @@ top(msgvec)
if (!lineb)
printf("\n");
for (lines = 0; lines < c && lines <= topl; lines++) {
- if (readline(ibuf, linebuf, LINESIZE) < 0)
+ if (readline(ibuf, linebuf, sizeof(linebuf)) < 0)
break;
puts(linebuf);
- lineb = blankline(linebuf);
+ lineb = strspn(linebuf, " \t") == strlen(linebuf);
}
}
return(0);
@@ -437,10 +441,10 @@ mboxit(msgvec)
int
folders()
{
- char dirname[BUFSIZ];
+ char dirname[PATHSIZE];
char *cmd;
- if (getfold(dirname) < 0) {
+ if (getfold(dirname, sizeof(dirname)) < 0) {
printf("No value set for \"folder\"\n");
return 1;
}
diff --git a/usr.bin/mail/cmd2.c b/usr.bin/mail/cmd2.c
index 3ad78a8..f74a06e 100644
--- a/usr.bin/mail/cmd2.c
+++ b/usr.bin/mail/cmd2.c
@@ -32,7 +32,11 @@
*/
#ifndef lint
+#if 0
static char sccsid[] = "@(#)cmd2.c 8.1 (Berkeley) 6/6/93";
+#endif
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
#include "rcv.h"
@@ -187,14 +191,14 @@ save1(str, mark, cmd, ignore)
else
disp = "[New file]";
if ((obuf = Fopen(file, "a")) == NULL) {
- perror(NOSTR);
+ warn(NOSTR);
return(1);
}
for (ip = msgvec; *ip && ip-msgvec < msgCount; ip++) {
mp = &message[*ip - 1];
touch(mp);
- if (send(mp, obuf, ignore, NOSTR) < 0) {
- perror(file);
+ if (sendmessage(mp, obuf, ignore, NOSTR) < 0) {
+ warnx("%s", file);
Fclose(obuf);
return(1);
}
@@ -203,7 +207,7 @@ save1(str, mark, cmd, ignore)
}
fflush(obuf);
if (ferror(obuf))
- perror(file);
+ warn("%s", file);
Fclose(obuf);
printf("%s\n", disp);
return(0);
@@ -367,11 +371,11 @@ int
core()
{
int pid;
- extern union wait wait_status;
+ extern int wait_status;
switch (pid = fork()) {
case -1:
- perror("fork");
+ warn("fork");
return(1);
case 0:
abort();
@@ -380,7 +384,7 @@ core()
printf("Okie dokie");
fflush(stdout);
wait_child(pid);
- if (wait_status.w_coredump)
+ if (WIFSIGNALED(wait_status) && WCOREDUMP(wait_status))
printf(" -- Core dumped.\n");
else
printf(" -- Can't dump core.\n");
@@ -467,7 +471,7 @@ ignore1(list, tab, which)
struct ignoretab *tab;
char *which;
{
- char field[BUFSIZ];
+ char field[LINESIZE];
register int h;
register struct ignore *igp;
char **ap;
@@ -475,7 +479,7 @@ ignore1(list, tab, which)
if (*list == NOSTR)
return igshow(tab, which);
for (ap = list; *ap != 0; ap++) {
- istrcpy(field, *ap);
+ istrncpy(field, *ap, sizeof(field));
if (member(field, tab))
continue;
h = hash(field);
diff --git a/usr.bin/mail/cmd3.c b/usr.bin/mail/cmd3.c
index 04cecf6..36e42674 100644
--- a/usr.bin/mail/cmd3.c
+++ b/usr.bin/mail/cmd3.c
@@ -32,7 +32,11 @@
*/
#ifndef lint
+#if 0
static char sccsid[] = "@(#)cmd3.c 8.1 (Berkeley) 6/6/93";
+#endif
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
#include "rcv.h"
@@ -56,8 +60,9 @@ shell(str)
char *shell;
char cmd[BUFSIZ];
- (void) strcpy(cmd, str);
- if (bangexp(cmd) < 0)
+ if (strlcpy(cmd, str, sizeof(cmd)) >= sizeof(cmd))
+ return 1;
+ if (bangexp(cmd, sizeof(cmd)) < 0)
return 1;
if ((shell = value("SHELL")) == NOSTR)
shell = _PATH_CSHELL;
@@ -90,21 +95,20 @@ dosh(str)
* Expand the shell escape by expanding unescaped !'s into the
* last issued command where possible.
*/
-
-char lastbang[128];
-
int
-bangexp(str)
+bangexp(str, strsize)
char *str;
+ size_t strsize;
{
char bangbuf[BUFSIZ];
+ static char lastbang[BUFSIZ];
register char *cp, *cp2;
register int n;
int changed = 0;
cp = str;
cp2 = bangbuf;
- n = BUFSIZ;
+ n = sizeof(bangbuf);
while (*cp) {
if (*cp == '!') {
if (n < strlen(lastbang)) {
@@ -113,7 +117,9 @@ overf:
return(-1);
}
changed++;
- strcpy(cp2, lastbang);
+ if (strlcpy(cp2, lastbang, sizeof(bangbuf) - (cp2 - bangbuf))
+ >= sizeof(bangbuf) - (cp2 - bangbuf))
+ goto overf;
cp2 += strlen(lastbang);
n -= strlen(lastbang);
cp++;
@@ -135,9 +141,10 @@ overf:
printf("!%s\n", bangbuf);
fflush(stdout);
}
- strcpy(str, bangbuf);
- strncpy(lastbang, bangbuf, 128);
- lastbang[127] = 0;
+ if (strlcpy(str, bangbuf, strsize) >= strsize)
+ goto overf;
+ if (strlcpy(lastbang, bangbuf, sizeof(lastbang)) >= sizeof(lastbang))
+ goto overf;
return(0);
}
@@ -152,7 +159,7 @@ help()
register FILE *f;
if ((f = Fopen(_PATH_HELP, "r")) == NULL) {
- perror(_PATH_HELP);
+ warn("%s", _PATH_HELP);
return(1);
}
while ((c = getc(f)) != EOF)
@@ -170,13 +177,15 @@ schdir(arglist)
{
char *cp;
- if (*arglist == NOSTR)
+ if (*arglist == NOSTR) {
+ if (homedir == NOSTR)
+ return(1);
cp = homedir;
- else
+ } else
if ((cp = expand(*arglist)) == NOSTR)
return(1);
if (chdir(cp) < 0) {
- perror(cp);
+ warn("%s", cp);
return(1);
}
return 0;
@@ -276,8 +285,7 @@ reedit(subj)
subj[2] == ':')
return subj;
newsubj = salloc(strlen(subj) + 5);
- strcpy(newsubj, "Re: ");
- strcpy(newsubj + 4, subj);
+ sprintf(newsubj, "Re: %s", subj);
return newsubj;
}
@@ -386,7 +394,7 @@ set(arglist)
for (ap = arglist; *ap != NOSTR; ap++) {
cp = *ap;
cp2 = varbuf;
- while (*cp != '=' && *cp != '\0')
+ while (cp2 < varbuf + sizeof(varbuf) - 1 && *cp != '=' && *cp != '\0')
*cp2++ = *cp++;
*cp2 = '\0';
if (*cp == '\0')
diff --git a/usr.bin/mail/cmdtab.c b/usr.bin/mail/cmdtab.c
index 47fb3c6..237bc98 100644
--- a/usr.bin/mail/cmdtab.c
+++ b/usr.bin/mail/cmdtab.c
@@ -32,7 +32,11 @@
*/
#ifndef lint
+#if 0
static char sccsid[] = "@(#)cmdtab.c 8.1 (Berkeley) 6/6/93";
+#endif
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
#include "def.h"
diff --git a/usr.bin/mail/collect.c b/usr.bin/mail/collect.c
index 7e959ef..88c66dc 100644
--- a/usr.bin/mail/collect.c
+++ b/usr.bin/mail/collect.c
@@ -32,7 +32,11 @@
*/
#ifndef lint
+#if 0
static char sccsid[] = "@(#)collect.c 8.2 (Berkeley) 4/19/94";
+#endif
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
/*
@@ -74,10 +78,9 @@ collect(hp, printheaders)
int printheaders;
{
FILE *fbuf;
- int lc, cc, escape, eofcount;
+ int lc, cc, escape, eofcount, fd;
register int c, t;
- char linebuf[LINESIZE], *cp;
- extern char *tempMail;
+ char linebuf[LINESIZE], tempname[PATHSIZE], *cp;
char getsub;
int omask;
void collint(), collhup(), collstop();
@@ -96,17 +99,19 @@ collect(hp, printheaders)
savettou = signal(SIGTTOU, collstop);
savettin = signal(SIGTTIN, collstop);
if (setjmp(collabort) || setjmp(colljmp)) {
- rm(tempMail);
+ rm(tempname);
goto err;
}
sigsetmask(omask & ~(sigmask(SIGINT) | sigmask(SIGHUP)));
noreset++;
- if ((collf = Fopen(tempMail, "w+")) == NULL) {
- perror(tempMail);
+ snprintf(tempname, sizeof(tempname), "%s/mail.RsXXXXXXXXXX", tmpdir);
+ if ((fd = mkstemp(tempname)) == -1 ||
+ (collf = Fdopen(fd, "w+")) == NULL) {
+ warn("%s", tempname);
goto err;
}
- unlink(tempMail);
+ rm(tempname);
/*
* If we are going to prompt for a subject,
@@ -261,7 +266,11 @@ cont:
hp->h_bcc = cat(hp->h_bcc, extract(&linebuf[2], GBCC));
break;
case 'd':
- strcpy(linebuf + 2, getdeadletter());
+ if (strlcpy(linebuf + 2, getdeadletter(), sizeof(linebuf) - 2)
+ >= sizeof(linebuf) - 2) {
+ printf("Line buffer overflow\n");
+ break;
+ }
/* fall into . . . */
case 'r':
/*
@@ -284,7 +293,7 @@ cont:
break;
}
if ((fbuf = Fopen(cp, "r")) == NULL) {
- perror(cp);
+ warn("%s", cp);
break;
}
printf("\"%s\" ", cp);
@@ -328,12 +337,12 @@ cont:
* standard list processing garbage.
* If ~f is given, we don't shift over.
*/
- if (forward(linebuf + 2, collf, c) < 0)
+ if (forward(linebuf + 2, collf, tempname, c) < 0)
goto err;
goto cont;
case '?':
if ((fbuf = Fopen(_PATH_TILDE, "r")) == NULL) {
- perror(_PATH_TILDE);
+ warn("%s", _PATH_TILDE);
break;
}
while ((t = getc(fbuf)) != EOF)
@@ -410,14 +419,14 @@ exwrite(name, fp, f)
printf("\"%s\" ", name);
fflush(stdout);
}
- if (stat(name, &junk) >= 0 && (junk.st_mode & S_IFMT) == S_IFREG) {
+ if (stat(name, &junk) >= 0 && S_ISREG(junk.st_mode)) {
if (!f)
fprintf(stderr, "%s: ", name);
fprintf(stderr, "File exists\n");
return(-1);
}
if ((of = Fopen(name, "w")) == NULL) {
- perror(NOSTR);
+ warn(NOSTR);
return(-1);
}
lc = 0;
@@ -428,7 +437,7 @@ exwrite(name, fp, f)
lc++;
(void) putc(c, of);
if (ferror(of)) {
- perror(name);
+ warnx("%s", name);
Fclose(of);
return(-1);
}
@@ -471,15 +480,17 @@ mespipe(fp, cmd)
char cmd[];
{
FILE *nf;
+ int fd;
sig_t sigint = signal(SIGINT, SIG_IGN);
- extern char *tempEdit;
- char *shell;
+ char *shell, tempname[PATHSIZE];
- if ((nf = Fopen(tempEdit, "w+")) == NULL) {
- perror(tempEdit);
+ snprintf(tempname, sizeof(tempname), "%s/mail.ReXXXXXXXXXX", tmpdir);
+ if ((fd = mkstemp(tempname)) == -1 ||
+ (nf = Fdopen(fd, "w+")) == NULL) {
+ warn("%s", tempname);
goto out;
}
- (void) unlink(tempEdit);
+ (void) rm(tempname);
/*
* stdin = current message.
* stdout = new message.
@@ -515,13 +526,13 @@ out:
* should shift over and 'f' if not.
*/
int
-forward(ms, fp, f)
+forward(ms, fp, fn, f)
char ms[];
FILE *fp;
+ char *fn;
int f;
{
register int *msgvec;
- extern char *tempMail;
struct ignoretab *ig;
char *tabst;
@@ -549,8 +560,8 @@ forward(ms, fp, f)
touch(mp);
printf(" %d", *msgvec);
- if (send(mp, fp, ig, tabst) < 0) {
- perror(tempMail);
+ if (sendmessage(mp, fp, ig, tabst) < 0) {
+ warnx("%s", fn);
return(-1);
}
}
diff --git a/usr.bin/mail/def.h b/usr.bin/mail/def.h
index c81cdd6..feb71eb 100644
--- a/usr.bin/mail/def.h
+++ b/usr.bin/mail/def.h
@@ -51,6 +51,7 @@
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
+#include <err.h>
#include <string.h>
#include "pathnames.h"
diff --git a/usr.bin/mail/edit.c b/usr.bin/mail/edit.c
index c341441..62103ad 100644
--- a/usr.bin/mail/edit.c
+++ b/usr.bin/mail/edit.c
@@ -34,7 +34,11 @@
*/
#ifndef lint
+#if 0
static char sccsid[] = "@(#)edit.c 8.1 (Berkeley) 6/6/93";
+#endif
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
#include "rcv.h"
@@ -125,7 +129,7 @@ edit1(msgvec, type)
break;
}
if (ferror(otf))
- perror("/tmp");
+ warnx("/tmp");
(void) Fclose(fp);
}
(void) signal(SIGINT, sigint);
@@ -148,17 +152,18 @@ run_editor(fp, size, type, readonly)
register FILE *nf = NULL;
register int t;
time_t modtime;
- char *edit;
+ char *edit, tempname[PATHSIZE];
struct stat statb;
- extern char *tempEdit;
- if ((t = creat(tempEdit, readonly ? 0400 : 0600)) < 0) {
- perror(tempEdit);
+ snprintf(tempname, sizeof(tempname), "%s/mail.ReXXXXXXXXXX", tmpdir);
+ if ((t = mkstemp(tempname)) == -1 ||
+ (nf = Fdopen(t, "w")) == NULL) {
+ warn("%s", tempname);
goto out;
}
- if ((nf = Fdopen(t, "w")) == NULL) {
- perror(tempEdit);
- (void) unlink(tempEdit);
+ if (readonly && fchmod(t, 0400) == -1) {
+ warn("%s", tempname);
+ (void) rm(tempname);
goto out;
}
if (size >= 0)
@@ -174,22 +179,22 @@ run_editor(fp, size, type, readonly)
modtime = statb.st_mtime;
if (ferror(nf)) {
(void) Fclose(nf);
- perror(tempEdit);
- (void) unlink(tempEdit);
+ warnx("%s", tempname);
+ (void) rm(tempname);
nf = NULL;
goto out;
}
if (Fclose(nf) < 0) {
- perror(tempEdit);
- (void) unlink(tempEdit);
+ warn("%s", tempname);
+ (void) rm(tempname);
nf = NULL;
goto out;
}
nf = NULL;
if ((edit = value(type == 'e' ? "EDITOR" : "VISUAL")) == NOSTR)
edit = type == 'e' ? _PATH_EX : _PATH_VI;
- if (run_command(edit, 0, -1, -1, tempEdit, NOSTR, NOSTR) < 0) {
- (void) unlink(tempEdit);
+ if (run_command(edit, 0, -1, -1, tempname, NOSTR, NOSTR) < 0) {
+ (void) rm(tempname);
goto out;
}
/*
@@ -197,26 +202,26 @@ run_editor(fp, size, type, readonly)
* temporary and return.
*/
if (readonly) {
- (void) unlink(tempEdit);
+ (void) rm(tempname);
goto out;
}
- if (stat(tempEdit, &statb) < 0) {
- perror(tempEdit);
+ if (stat(tempname, &statb) < 0) {
+ warn("%s", tempname);
goto out;
}
if (modtime == statb.st_mtime) {
- (void) unlink(tempEdit);
+ (void) rm(tempname);
goto out;
}
/*
* Now switch to new file.
*/
- if ((nf = Fopen(tempEdit, "a+")) == NULL) {
- perror(tempEdit);
- (void) unlink(tempEdit);
+ if ((nf = Fopen(tempname, "a+")) == NULL) {
+ warn("%s", tempname);
+ (void) rm(tempname);
goto out;
}
- (void) unlink(tempEdit);
+ (void) rm(tempname);
out:
return nf;
}
diff --git a/usr.bin/mail/extern.h b/usr.bin/mail/extern.h
index 24b7608..62de161 100644
--- a/usr.bin/mail/extern.h
+++ b/usr.bin/mail/extern.h
@@ -31,6 +31,8 @@
* SUCH DAMAGE.
*
* @(#)extern.h 8.1 (Berkeley) 6/6/93
+ *
+ * $FreeBSD$
*/
struct name *cat __P((struct name *, struct name *));
@@ -47,7 +49,6 @@ 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 *));
@@ -82,12 +83,10 @@ int dorespond __P((int *));
void alter __P((char *));
int alternates __P((char **));
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 blankline __P((char []));
+int bangexp __P((char *, size_t));
void brokpipe __P((int));
int charcount __P((char *, int));
int check __P((int, int));
@@ -121,16 +120,16 @@ void fail __P((char [], char []));
int file __P((char **));
struct grouphead *
findgroup __P((char []));
-void findmail __P((char *, 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));
+int forward __P((char [], FILE *, char *, int));
void free_child __P((int));
int from __P((int *));
off_t fsize __P((FILE *));
-int getfold __P((char *));
+int getfold __P((char *, int));
int gethfield __P((FILE *, char [], int, char **));
int getmsglist __P((char *, int *, int));
int getrawlist __P((char [], char **, int));
@@ -155,7 +154,7 @@ int isfileaddr __P((char *));
int ishead __P((char []));
int isign __P((char *, struct ignoretab []));
int isprefix __P((char *, char *));
-void istrcpy __P((char *, char *));
+void istrncpy __P((char *, char *, size_t));
struct cmd *
lex __P((char []));
void load __P((char *));
@@ -179,7 +178,6 @@ int more __P((int *));
int newfileinfo __P((void));
int next __P((int *));
int null __P((int));
-void panic __P((const char *, ...));
void parse __P((char [], struct headline *, char []));
int pcmdlist __P((void));
int pdot __P((void));
@@ -193,7 +191,6 @@ int putline __P((FILE *, char *));
int pversion __P((int));
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));
@@ -214,7 +211,7 @@ void scaninit __P((void));
int schdir __P((char **));
int screensize __P((void));
int scroll __P((char []));
-int send __P((struct message *, FILE *, struct ignoretab *, char *));
+int sendmessage __P((struct message *, FILE *, struct ignoretab *, char *));
int sendmail __P((char *));
int set __P((char **));
int setfile __P((char *));
@@ -251,3 +248,6 @@ int visual __P((int *));
int wait_child __P((int));
int wait_command __P((int));
int writeback __P((FILE *));
+
+extern char *__progname;
+extern char *tmpdir;
diff --git a/usr.bin/mail/fio.c b/usr.bin/mail/fio.c
index ee95bc6..2bf9963 100644
--- a/usr.bin/mail/fio.c
+++ b/usr.bin/mail/fio.c
@@ -34,7 +34,11 @@
*/
#ifndef lint
+#if 0
static char sccsid[] = "@(#)fio.c 8.1 (Berkeley) 6/6/93";
+#endif
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
#include "rcv.h"
@@ -59,22 +63,19 @@ void
setptr(ibuf)
register FILE *ibuf;
{
- extern char *tmpdir;
register int c, count;
register char *cp, *cp2;
struct message this;
FILE *mestmp;
off_t offset;
int maybe, inhead;
- char linebuf[LINESIZE];
+ char linebuf[LINESIZE], pathbuf[PATHSIZE];
/* Get temporary file. */
- (void)sprintf(linebuf, "%s/mail.XXXXXX", tmpdir);
- if ((c = mkstemp(linebuf)) == -1 ||
- (mestmp = Fdopen(c, "r+")) == NULL) {
- errx(1, "can't open %s", linebuf);
- }
- (void)unlink(linebuf);
+ (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);
msgCount = 0;
maybe = 1;
@@ -86,27 +87,22 @@ setptr(ibuf)
this.m_block = 0;
this.m_offset = 0;
for (;;) {
- if (fgets(linebuf, LINESIZE, ibuf) == NULL) {
- if (append(&this, mestmp)) {
- perror("temporary file");
- exit(1);
- }
+ if (fgets(linebuf, sizeof(linebuf), ibuf) == NULL) {
+ if (append(&this, mestmp))
+ errx(1, "temporary file");
makemessage(mestmp);
return;
}
count = strlen(linebuf);
(void) fwrite(linebuf, sizeof *linebuf, count, otf);
- if (ferror(otf)) {
- perror("/tmp");
- exit(1);
- }
- linebuf[count - 1] = 0;
+ if (ferror(otf))
+ errx(1, "/tmp");
+ if (count)
+ linebuf[count - 1] = '\0';
if (maybe && linebuf[0] == 'F' && ishead(linebuf)) {
msgCount++;
- if (append(&this, mestmp)) {
- perror("temporary file");
- exit(1);
- }
+ if (append(&this, mestmp))
+ errx(1, "temporary file");
this.m_flag = MUSED|MNEW;
this.m_size = 0;
this.m_lines = 0;
@@ -193,10 +189,8 @@ setinput(mp)
{
fflush(otf);
- if (fseek(itf, (long)positionof(mp->m_block, mp->m_offset), 0) < 0) {
- perror("fseek");
- panic("Temporary file seek");
- }
+ if (fseek(itf, (long)positionof(mp->m_block, mp->m_offset), 0) < 0)
+ err(1, "fseek");
return (itf);
}
@@ -213,13 +207,13 @@ makemessage(f)
if (message != 0)
free((char *) message);
if ((message = (struct message *) malloc((unsigned) size)) == 0)
- panic("Insufficient memory for %d messages", msgCount);
+ err(1, "Out of memory");
dot = message;
size -= sizeof (struct message);
fflush(f);
(void) lseek(fileno(f), (off_t)sizeof *message, 0);
if (read(fileno(f), (char *) message, size) != size)
- panic("Message temporary file corrupted");
+ errx(1, "Message temporary file corrupted");
message[msgCount].m_size = 0;
message[msgCount].m_lines = 0;
Fclose(f);
@@ -315,7 +309,7 @@ expand(name)
register char *cp, *shell;
int pivec[2];
struct stat sbuf;
- extern union wait wait_status;
+ extern int wait_status;
/*
* The order of evaluation is "%" and "#" expand into constants.
@@ -325,7 +319,7 @@ expand(name)
*/
switch (*name) {
case '%':
- findmail(name[1] ? name + 1 : myname, xname);
+ findmail(name[1] ? name + 1 : myname, xname, sizeof(xname));
return savestr(xname);
case '#':
if (name[1] != 0)
@@ -340,22 +334,23 @@ expand(name)
name = "~/mbox";
/* fall through */
}
- if (name[0] == '+' && getfold(cmdbuf) >= 0) {
- sprintf(xname, "%s/%s", cmdbuf, name + 1);
+ if (name[0] == '+' && getfold(cmdbuf, sizeof(cmdbuf)) >= 0) {
+ snprintf(xname, sizeof(xname), "%s/%s", cmdbuf, name + 1);
name = savestr(xname);
}
/* catch the most common shell meta character */
- if (name[0] == '~' && (name[1] == '/' || name[1] == '\0')) {
- sprintf(xname, "%s%s", homedir, name + 1);
+ if (name[0] == '~' && homedir != NULL &&
+ (name[1] == '/' || name[1] == '\0')) {
+ snprintf(xname, sizeof(xname), "%s%s", homedir, name + 1);
name = savestr(xname);
}
- if (!anyof(name, "~{[*?$`'\"\\"))
+ if (!strpbrk(name, "~{[*?$`'\"\\"))
return name;
if (pipe(pivec) < 0) {
- perror("pipe");
+ warn("pipe");
return name;
}
- sprintf(cmdbuf, "echo %s", name);
+ snprintf(cmdbuf, sizeof(cmdbuf), "echo %s", name);
if ((shell = value("SHELL")) == NOSTR)
shell = _PATH_CSHELL;
pid = start_command(shell, 0, -1, pivec[1], "-c", cmdbuf, NOSTR);
@@ -367,12 +362,12 @@ expand(name)
close(pivec[1]);
l = read(pivec[0], xname, BUFSIZ);
close(pivec[0]);
- if (wait_child(pid) < 0 && wait_status.w_termsig != SIGPIPE) {
+ if (wait_child(pid) < 0 && WIFSIGNALED(wait_status) && WTERMSIG(wait_status) != SIGPIPE) {
fprintf(stderr, "\"%s\": Expansion failed.\n", name);
return NOSTR;
}
if (l < 0) {
- perror("read");
+ warn("read");
return NOSTR;
}
if (l == 0) {
@@ -383,11 +378,11 @@ expand(name)
fprintf(stderr, "\"%s\": Expansion buffer overflow.\n", name);
return NOSTR;
}
- xname[l] = 0;
+ xname[l] = '\0';
for (cp = &xname[l-1]; *cp == '\n' && cp > xname; cp--)
;
cp[1] = '\0';
- if (index(xname, ' ') && stat(xname, &sbuf) < 0) {
+ if (strchr(xname, ' ') && stat(xname, &sbuf) < 0) {
fprintf(stderr, "\"%s\": Ambiguous.\n", name);
return NOSTR;
}
@@ -398,18 +393,20 @@ expand(name)
* Determine the current folder directory name.
*/
int
-getfold(name)
+getfold(name, namelen)
char *name;
+ int namelen;
{
char *folder;
+ int copylen;
if ((folder = value("folder")) == NOSTR)
return (-1);
if (*folder == '/')
- strcpy(name, folder);
+ copylen = strlcpy(name, folder, namelen);
else
- sprintf(name, "%s/%s", homedir, folder);
- return (0);
+ copylen = snprintf(name, namelen, "%s/%s", homedir ? homedir : ".", folder);
+ return copylen >= namelen ? (-1) : (0);
}
/*
@@ -425,7 +422,7 @@ getdeadletter()
else if (*cp != '/') {
char buf[PATHSIZE];
- (void) sprintf(buf, "~/%s", cp);
+ (void) snprintf(buf, sizeof(buf), "~/%s", cp);
cp = expand(buf);
}
return cp;
diff --git a/usr.bin/mail/getname.c b/usr.bin/mail/getname.c
index 02a4131..dc812d5 100644
--- a/usr.bin/mail/getname.c
+++ b/usr.bin/mail/getname.c
@@ -32,7 +32,11 @@
*/
#ifndef lint
+#if 0
static char sccsid[] = "@(#)getname.c 8.1 (Berkeley) 6/6/93";
+#endif
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
#include "rcv.h"
@@ -42,8 +46,8 @@ static char sccsid[] = "@(#)getname.c 8.1 (Berkeley) 6/6/93";
/* Getname / getuserid for those with hashed passwd data base). */
/*
- * Search the passwd file for a uid. Return name through ref parameter
- * if found, indicating success with 0 return. Return -1 on error.
+ * Search the passwd file for a uid. Return name on success,
+ * NOSTR on failure
*/
char *
getname(uid)
diff --git a/usr.bin/mail/glob.h b/usr.bin/mail/glob.h
index a159aca..5f1812a 100644
--- a/usr.bin/mail/glob.h
+++ b/usr.bin/mail/glob.h
@@ -31,6 +31,8 @@
* SUCH DAMAGE.
*
* @(#)glob.h 8.1 (Berkeley) 6/6/93
+ *
+ * $FreeBSD$
*/
/*
diff --git a/usr.bin/mail/head.c b/usr.bin/mail/head.c
index ca31ae1..41b0e23 100644
--- a/usr.bin/mail/head.c
+++ b/usr.bin/mail/head.c
@@ -32,7 +32,11 @@
*/
#ifndef lint
+#if 0
static char sccsid[] = "@(#)head.c 8.1 (Berkeley) 6/6/93";
+#endif
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
#include "rcv.h"
@@ -53,13 +57,10 @@ int
ishead(linebuf)
char linebuf[];
{
- register char *cp;
struct headline hl;
char parbuf[BUFSIZ];
- cp = linebuf;
- if (*cp++ != 'F' || *cp++ != 'r' || *cp++ != 'o' || *cp++ != 'm' ||
- *cp++ != ' ')
+ if (strncmp(linebuf, "From ", 5))
return (0);
parse(linebuf, &hl, parbuf);
if (hl.l_from == NOSTR || hl.l_date == NOSTR) {
diff --git a/usr.bin/mail/lex.c b/usr.bin/mail/lex.c
index c80b46b..6f89a69 100644
--- a/usr.bin/mail/lex.c
+++ b/usr.bin/mail/lex.c
@@ -34,7 +34,11 @@
*/
#ifndef lint
+#if 0
static char sccsid[] = "@(#)lex.c 8.1 (Berkeley) 6/6/93";
+#endif
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
#include "rcv.h"
@@ -61,12 +65,12 @@ setfile(name)
char *name;
{
FILE *ibuf;
- int i;
+ int i, fd;
struct stat stb;
char isedit = *name != '%';
char *who = name[1] ? name + 1 : myname;
+ char tempname[PATHSIZE];
static int shudclob;
- extern char *tempMesg;
if ((name = expand(name)) == NOSTR)
return -1;
@@ -74,30 +78,20 @@ setfile(name)
if ((ibuf = Fopen(name, "r")) == NULL) {
if (!isedit && errno == ENOENT)
goto nomail;
- perror(name);
+ warn("%s", name);
return(-1);
}
if (fstat(fileno(ibuf), &stb) < 0) {
- perror("fstat");
+ warn("fstat");
Fclose(ibuf);
return (-1);
}
- switch (stb.st_mode & S_IFMT) {
- case S_IFDIR:
+ if (S_ISDIR(stb.st_mode) || !S_ISREG(stb.st_mode)) {
Fclose(ibuf);
- errno = EISDIR;
- perror(name);
- return (-1);
-
- case S_IFREG:
- break;
-
- default:
- Fclose(ibuf);
- errno = EINVAL;
- perror(name);
+ errno = S_ISDIR(stb.st_mode) ? EISDIR : EINVAL;
+ warn("%s", name);
return (-1);
}
@@ -128,21 +122,18 @@ setfile(name)
}
shudclob = 1;
edit = isedit;
- strcpy(prevfile, mailname);
+ strlcpy(prevfile, mailname, sizeof(prevfile));
if (name != mailname)
- strcpy(mailname, name);
+ strlcpy(mailname, name, sizeof(mailname));
mailsize = fsize(ibuf);
- if ((otf = fopen(tempMesg, "w")) == NULL) {
- perror(tempMesg);
- exit(1);
- }
+ 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(tempMesg, "r")) == NULL) {
- perror(tempMesg);
- exit(1);
- }
+ if ((itf = fopen(tempname, "r")) == NULL)
+ err(1, "%s", tempname);
(void) fcntl(fileno(itf), F_SETFD, 1);
- rm(tempMesg);
+ rm(tempname);
setptr(ibuf);
setmsize(msgCount);
Fclose(ibuf);
@@ -273,7 +264,7 @@ execute(linebuf, contxt)
return(0);
}
cp2 = word;
- while (*cp && index(" \t0123456789$^.:/-+*'\"", *cp) == NOSTR)
+ while (*cp && strchr(" \t0123456789$^.:/-+*'\"", *cp) == NOSTR)
*cp2++ = *cp++;
*cp2 = '\0';
@@ -405,7 +396,7 @@ execute(linebuf, contxt)
break;
default:
- panic("Unknown argtype");
+ errx(1, "Unknown argtype");
}
out:
@@ -463,7 +454,7 @@ lex(word)
* ignore trailing chars after `#'
*
* lines with beginning `#' are comments
- * spaces befor `#' are ignored in execute()
+ * spaces before `#' are ignored in execute()
*/
if (*word == '#')
@@ -588,7 +579,7 @@ newfileinfo()
{
register struct message *mp;
register int u, n, mdot, d, s;
- char fname[BUFSIZ], zname[BUFSIZ], *ename;
+ char fname[PATHSIZE+1], zname[PATHSIZE+1], *ename;
for (mp = &message[0]; mp < &message[msgCount]; mp++)
if (mp->m_flag & MNEW)
@@ -613,10 +604,10 @@ newfileinfo()
s++;
}
ename = mailname;
- if (getfold(fname) >= 0) {
+ if (getfold(fname, sizeof(fname) - 1) >= 0) {
strcat(fname, "/");
if (strncmp(fname, mailname, strlen(fname)) == 0) {
- sprintf(zname, "+%s", mailname + strlen(fname));
+ snprintf(zname, sizeof(zname), "+%s", mailname + strlen(fname));
ename = zname;
}
}
diff --git a/usr.bin/mail/list.c b/usr.bin/mail/list.c
index 9759f2d..d5bd968 100644
--- a/usr.bin/mail/list.c
+++ b/usr.bin/mail/list.c
@@ -32,7 +32,11 @@
*/
#ifndef lint
+#if 0
static char sccsid[] = "@(#)list.c 8.2 (Berkeley) 4/19/94";
+#endif
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
#include "rcv.h"
@@ -391,7 +395,11 @@ getrawlist(line, argv, argc)
{
register char c, *cp, *cp2, quotec;
int argn;
- char linebuf[BUFSIZ];
+ char *linebuf;
+ size_t linebufsize = BUFSIZ;
+
+ if ((linebuf = (char *)malloc(linebufsize)) == NULL)
+ err(1, "Out of memory");
argn = 0;
cp = line;
@@ -408,6 +416,13 @@ getrawlist(line, argv, argc)
cp2 = linebuf;
quotec = '\0';
while ((c = *cp) != '\0') {
+ /* Allocate more space if necessary */
+ if (cp2 - linebuf == linebufsize - 1) {
+ linebufsize += BUFSIZ;
+ if ((linebuf = realloc(linebuf, linebufsize)) == NULL)
+ err(1, "Out of memory");
+ cp2 = linebuf + linebufsize - BUFSIZ - 1;
+ }
cp++;
if (quotec != '\0') {
if (c == quotec)
@@ -473,6 +488,7 @@ getrawlist(line, argv, argc)
argv[argn++] = savestr(linebuf);
}
argv[argn] = NOSTR;
+ free(linebuf);
return argn;
}
@@ -605,7 +621,7 @@ regret(token)
int token;
{
if (++regretp >= REGDEP)
- panic("Too many regrets");
+ errx(1, "Too many regrets");
regretstack[regretp] = token;
lexstring[STRINGLEN-1] = '\0';
string_stack[regretp] = savestr(lexstring);
@@ -662,7 +678,7 @@ matchsender(str, mesg)
while (*cp2) {
if (*cp == 0)
return(1);
- if (raise(*cp++) != raise(*cp2++)) {
+ if (toupper(*cp++) != toupper(*cp2++)) {
cp2 = ++backup;
cp = str;
}
@@ -678,7 +694,7 @@ matchsender(str, mesg)
* previous search string.
*/
-char lastscan[128];
+char lastscan[STRINGLEN];
int
matchsubj(str, mesg)
char *str;
@@ -688,17 +704,17 @@ matchsubj(str, mesg)
register char *cp, *cp2, *backup;
str++;
- if (strlen(str) == 0)
+ if (*str == '\0')
str = lastscan;
else
- strcpy(lastscan, str);
+ strlcpy(lastscan, str, sizeof(lastscan));
mp = &message[mesg-1];
/*
* Now look, ignoring case, for the word in the string.
*/
- if (value("searchheaders") && (cp = index(str, ':'))) {
+ if (value("searchheaders") && (cp = strchr(str, ':'))) {
*cp++ = '\0';
cp2 = hfield(str, mp);
cp[-1] = ':';
@@ -713,7 +729,7 @@ matchsubj(str, mesg)
while (*cp2) {
if (*cp == 0)
return(1);
- if (raise(*cp++) != raise(*cp2++)) {
+ if (toupper(*cp++) != toupper(*cp2++)) {
cp2 = ++backup;
cp = str;
}
@@ -732,7 +748,7 @@ mark(mesg)
i = mesg;
if (i < 1 || i > msgCount)
- panic("Bad message number to mark");
+ errx(1, "Bad message number to mark");
message[i-1].m_flag |= MMARK;
}
@@ -747,7 +763,7 @@ unmark(mesg)
i = mesg;
if (i < 1 || i > msgCount)
- panic("Bad message number to unmark");
+ errx(1, "Bad message number to unmark");
message[i-1].m_flag &= ~MMARK;
}
diff --git a/usr.bin/mail/main.c b/usr.bin/mail/main.c
index 6579093..97617ee 100644
--- a/usr.bin/mail/main.c
+++ b/usr.bin/mail/main.c
@@ -38,11 +38,14 @@ static char copyright[] =
#endif /* not lint */
#ifndef lint
+#if 0
static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 6/6/93";
+#endif
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
#include "rcv.h"
-#include <err.h>
#include <fcntl.h>
#include "extern.h"
@@ -99,10 +102,9 @@ main(argc, argv)
* articles have been read/deleted for netnews.
*/
Tflag = optarg;
- if ((i = creat(Tflag, 0600)) < 0) {
- perror(Tflag);
- exit(1);
- }
+ if ((i = open(Tflag, O_CREAT | O_TRUNC | O_WRONLY,
+ 0600)) < 0)
+ err(1, "%s", Tflag);
close(i);
break;
case 'u':
@@ -181,12 +183,12 @@ main(argc, argv)
bcc = cat(bcc, nalloc(optarg, GBCC));
break;
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);
+ fprintf(stderr, "\
+Usage: %s [-iInv] [-s subject] [-c cc-addr] [-b bcc-addr] to-addr ...\n\
+ %*s [- sendmail-options ...]\n\
+ %s [-iInNv] -f [name]\n\
+ %s [-iInNv] [-u user]\n",__progname, strlen(__progname), "", __progname,
+ __progname);
exit(1);
}
}
@@ -197,14 +199,10 @@ Usage: mail [-iInv] [-s subject] [-c cc-addr] [-b bcc-addr] to-addr ...\n\
/*
* Check for inconsistent arguments.
*/
- 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);
- }
+ if (to == NIL && (subject != NOSTR || cc != NIL || bcc != NIL))
+ errx(1, "You must specify direct recipients with -s, -c, or -b.");
+ if (ef != NOSTR && to != NIL)
+ errx(1, "Cannot give -f and people to send to.");
tinit();
setscreensize();
input = stdin;
@@ -213,9 +211,8 @@ Usage: mail [-iInv] [-s subject] [-c cc-addr] [-b bcc-addr] to-addr ...\n\
if (!nosrc) {
char *s, *path_rc;
- path_rc = malloc(sizeof(_PATH_MASTER_RC));
- if (path_rc == NULL)
- errx(1, "malloc(path_rc) failed");
+ if ((path_rc = malloc(sizeof(_PATH_MASTER_RC))) == NULL)
+ err(1, "malloc(path_rc) failed");
strcpy(path_rc, _PATH_MASTER_RC);
while ((s = strsep(&path_rc, ":")) != NULL)
diff --git a/usr.bin/mail/names.c b/usr.bin/mail/names.c
index ef8c1dd..1fca53c 100644
--- a/usr.bin/mail/names.c
+++ b/usr.bin/mail/names.c
@@ -32,7 +32,11 @@
*/
#ifndef lint
+#if 0
static char sccsid[] = "@(#)names.c 8.1 (Berkeley) 6/6/93";
+#endif
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
/*
@@ -94,10 +98,12 @@ extract(line, ntype)
{
register char *cp;
register struct name *top, *np, *t;
- char nbuf[BUFSIZ];
+ char *nbuf;
if (line == NOSTR || *line == '\0')
return NIL;
+ if ((nbuf = (char *)malloc(strlen(line) + 1)) == NULL)
+ err(1, "Out of memory");
top = NIL;
np = NIL;
cp = line;
@@ -110,6 +116,7 @@ extract(line, ntype)
t->n_blink = np;
np = t;
}
+ free(nbuf);
return top;
}
@@ -148,14 +155,14 @@ detract(np, ntype)
for (p = np; p != NIL; p = p->n_flink) {
if (ntype && (p->n_type & GMASK) != ntype)
continue;
- cp = copy(p->n_name, cp);
+ cp += strlcpy(cp, p->n_name, strlen(p->n_name) + 1);
if (comma && p->n_flink != NIL)
*cp++ = ',';
*cp++ = ' ';
}
- *--cp = 0;
+ *--cp = '\0';
if (comma && *--cp == ',')
- *cp = 0;
+ *cp = '\0';
return(top);
}
@@ -197,7 +204,7 @@ yankword(ap, wbuf)
for (cp2 = wbuf; *cp && (*cp2++ = *cp++) != '>';)
;
else
- for (cp2 = wbuf; *cp && !index(" \t,(", *cp); *cp2++ = *cp++)
+ for (cp2 = wbuf; *cp && !strchr(" \t,(", *cp); *cp2++ = *cp++)
;
*cp2 = '\0';
return cp;
@@ -223,7 +230,6 @@ outof(names, fo, hp)
char *date, *fname, *ctime();
FILE *fout, *fin;
int ispipe;
- extern char *tempEdit;
top = names;
np = names;
@@ -246,15 +252,21 @@ outof(names, fo, hp)
*/
if (image < 0) {
- if ((fout = Fopen(tempEdit, "a")) == NULL) {
- perror(tempEdit);
+ int fd;
+ char tempname[PATHSIZE];
+
+ snprintf(tempname, sizeof(tempname),
+ "%s/mail.ReXXXXXXXXXX", tmpdir);
+ if ((fd = mkstemp(tempname)) == -1 ||
+ (fout = Fdopen(fd, "a")) == NULL) {
+ warn("%s", tempname);
senderr++;
goto cant;
}
- image = open(tempEdit, 2);
- (void) unlink(tempEdit);
+ image = open(tempname, O_RDWR);
+ (void) rm(tempname);
if (image < 0) {
- perror(tempEdit);
+ warn("%s", tempname);
senderr++;
(void) Fclose(fout);
goto cant;
@@ -268,8 +280,12 @@ outof(names, fo, hp)
rewind(fo);
(void) putc('\n', fout);
(void) fflush(fout);
- if (ferror(fout))
- perror(tempEdit);
+ if (ferror(fout)) {
+ warn("%s", tempname);
+ senderr++;
+ Fclose(fout);
+ goto cant;
+ }
(void) Fclose(fout);
}
@@ -303,12 +319,12 @@ outof(names, fo, hp)
} else {
int f;
if ((fout = Fopen(fname, "a")) == NULL) {
- perror(fname);
+ warn("%s", fname);
senderr++;
goto cant;
}
if ((f = dup(image)) < 0) {
- perror("dup");
+ warn("dup");
fin = NULL;
} else
fin = Fdopen(f, "r");
@@ -321,8 +337,13 @@ outof(names, fo, hp)
rewind(fin);
while ((c = getc(fin)) != EOF)
(void) putc(c, fout);
- if (ferror(fout))
- senderr++, perror(fname);
+ if (ferror(fout)) {
+ warnx("%s", fname);
+ senderr++;
+ Fclose(fout);
+ Fclose(fin);
+ goto cant;
+ }
(void) Fclose(fout);
(void) Fclose(fin);
}
@@ -483,7 +504,7 @@ unpack(np)
n = np;
if ((t = count(n)) == 0)
- panic("No names to unpack");
+ errx(1, "No names to unpack");
/*
* Compute the number of extra arguments we will need.
* We need at least two extra -- one for "mail" and one for
diff --git a/usr.bin/mail/pathnames.h b/usr.bin/mail/pathnames.h
index 0b2586f..40f02fb 100644
--- a/usr.bin/mail/pathnames.h
+++ b/usr.bin/mail/pathnames.h
@@ -31,6 +31,8 @@
* SUCH DAMAGE.
*
* @(#)pathnames.h 8.1 (Berkeley) 6/6/93
+ *
+ * $FreeBSD$
*/
#include <paths.h>
diff --git a/usr.bin/mail/popen.c b/usr.bin/mail/popen.c
index 3d877fa..8ba870b 100644
--- a/usr.bin/mail/popen.c
+++ b/usr.bin/mail/popen.c
@@ -32,7 +32,11 @@
*/
#ifndef lint
+#if 0
static char sccsid[] = "@(#)popen.c 8.1 (Berkeley) 6/6/93";
+#endif
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
#include "rcv.h"
@@ -55,12 +59,13 @@ struct child {
int pid;
char done;
char free;
- union wait status;
+ int status;
struct child *link;
};
static struct child *child;
static struct child *findchild __P((int));
static void delchild __P((struct child *));
+static int file_pid __P((FILE *));
FILE *
Fopen(file, mode)
@@ -166,7 +171,7 @@ register_file(fp, pipe, pid)
struct fp *fpp;
if ((fpp = (struct fp *) malloc(sizeof *fpp)) == NULL)
- panic("Out of memory");
+ err(1, "Out of memory");
fpp->fp = fp;
fpp->pipe = pipe;
fpp->pid = pid;
@@ -186,9 +191,11 @@ unregister_file(fp)
free((char *) p);
return;
}
- panic("Invalid file pointer");
+ errx(1, "Invalid file pointer");
+ /*NOTREACHED*/
}
+int
file_pid(fp)
FILE *fp;
{
@@ -197,7 +204,7 @@ file_pid(fp)
for (p = fp_head; p; p = p->link)
if (p->fp == fp)
return (p->pid);
- panic("Invalid file pointer");
+ errx(1, "Invalid file pointer");
/*NOTREACHED*/
}
@@ -232,7 +239,7 @@ start_command(cmd, mask, infd, outfd, a0, a1, a2)
int pid;
if ((pid = fork()) < 0) {
- perror("fork");
+ warn("fork");
return -1;
}
if (pid == 0) {
@@ -245,7 +252,7 @@ start_command(cmd, mask, infd, outfd, a0, a1, a2)
argv[i] = NOSTR;
prepare_child(mask, infd, outfd);
execvp(argv[0], argv);
- perror(argv[0]);
+ warn("%s", argv[0]);
_exit(1);
}
return pid;
@@ -296,6 +303,8 @@ findchild(pid)
;
if (*cpp == NULL) {
*cpp = (struct child *) malloc(sizeof (struct child));
+ if (*cpp == NULL)
+ err(1, "Out of memory");
(*cpp)->pid = pid;
(*cpp)->done = (*cpp)->free = 0;
(*cpp)->link = NULL;
@@ -320,11 +329,10 @@ sigchild(signo)
int signo;
{
int pid;
- union wait status;
+ int status;
register struct child *cp;
- while ((pid =
- wait3((int *)&status, WNOHANG, (struct rusage *)0)) > 0) {
+ while ((pid = waitpid((pid_t)-1, &status, WNOHANG)) > 0) {
cp = findchild(pid);
if (cp->free)
delchild(cp);
@@ -335,7 +343,7 @@ sigchild(signo)
}
}
-union wait wait_status;
+int wait_status;
/*
* Wait for a specific child to die.
@@ -352,7 +360,7 @@ wait_child(pid)
wait_status = cp->status;
delchild(cp);
sigsetmask(mask);
- return wait_status.w_status ? -1 : 0;
+ return((WIFEXITED(wait_status) && WEXITSTATUS(wait_status)) ? -1 : 0);
}
/*
diff --git a/usr.bin/mail/quit.c b/usr.bin/mail/quit.c
index d6d8f68..66331fc 100644
--- a/usr.bin/mail/quit.c
+++ b/usr.bin/mail/quit.c
@@ -32,7 +32,11 @@
*/
#ifndef lint
+#if 0
static char sccsid[] = "@(#)quit.c 8.1 (Berkeley) 6/6/93";
+#endif
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
#include "rcv.h"
@@ -72,9 +76,9 @@ quit()
FILE *ibuf, *obuf, *fbuf, *rbuf, *readstat, *abuf;
register struct message *mp;
register int c;
- extern char *tempQuit, *tempResid;
+ int fd;
struct stat minfo;
- char *mbox;
+ char *mbox, tempname[PATHSIZE];
/*
* If we are read only, we can't do anything,
@@ -108,8 +112,9 @@ quit()
rbuf = NULL;
if (fstat(fileno(fbuf), &minfo) >= 0 && minfo.st_size > mailsize) {
printf("New mail has arrived.\n");
- rbuf = Fopen(tempResid, "w");
- if (rbuf == NULL || fbuf == NULL)
+ snprintf(tempname, sizeof(tempname), "%s/mail.RqXXXXXXXXXX", tmpdir);
+ if ((fd = mkstemp(tempname)) == -1 ||
+ (rbuf = Fdopen(fd, "w")) == NULL)
goto newmail;
#ifdef APPEND
fseek(fbuf, (long)mailsize, 0);
@@ -125,9 +130,9 @@ quit()
}
#endif
Fclose(rbuf);
- if ((rbuf = Fopen(tempResid, "r")) == NULL)
+ if ((rbuf = Fopen(tempname, "r")) == NULL)
goto newmail;
- rm(tempResid);
+ rm(tempname);
}
/*
@@ -198,35 +203,37 @@ quit()
mbox = expand("&");
mcount = c;
if (value("append") == NOSTR) {
- if ((obuf = Fopen(tempQuit, "w")) == NULL) {
- perror(tempQuit);
+ snprintf(tempname, sizeof(tempname), "%s/mail.RmXXXXXXXXXX", tmpdir);
+ if ((fd = mkstemp(tempname)) == -1 ||
+ (obuf = Fdopen(fd, "w")) == NULL) {
+ warn("%s", tempname);
Fclose(fbuf);
return;
}
- if ((ibuf = Fopen(tempQuit, "r")) == NULL) {
- perror(tempQuit);
- rm(tempQuit);
+ if ((ibuf = Fopen(tempname, "r")) == NULL) {
+ warn("%s", tempname);
+ rm(tempname);
Fclose(obuf);
Fclose(fbuf);
return;
}
- rm(tempQuit);
+ rm(tempname);
if ((abuf = Fopen(mbox, "r")) != NULL) {
while ((c = getc(abuf)) != EOF)
(void) putc(c, obuf);
Fclose(abuf);
}
if (ferror(obuf)) {
- perror(tempQuit);
+ warnx("%s", tempname);
Fclose(ibuf);
Fclose(obuf);
Fclose(fbuf);
return;
}
Fclose(obuf);
- close(creat(mbox, 0600));
+ close(open(mbox, O_CREAT | O_TRUNC | O_WRONLY, 0600));
if ((obuf = Fopen(mbox, "r+")) == NULL) {
- perror(mbox);
+ warn("%s", mbox);
Fclose(ibuf);
Fclose(fbuf);
return;
@@ -234,7 +241,7 @@ quit()
}
if (value("append") != NOSTR) {
if ((obuf = Fopen(mbox, "a")) == NULL) {
- perror(mbox);
+ warn("%s", mbox);
Fclose(fbuf);
return;
}
@@ -242,8 +249,8 @@ quit()
}
for (mp = &message[0]; mp < &message[msgCount]; mp++)
if (mp->m_flag & MBOX)
- if (send(mp, obuf, saveignore, NOSTR) < 0) {
- perror(mbox);
+ if (sendmessage(mp, obuf, saveignore, NOSTR) < 0) {
+ warnx("%s", mbox);
Fclose(ibuf);
Fclose(obuf);
Fclose(fbuf);
@@ -270,7 +277,7 @@ quit()
}
trunc(obuf);
if (ferror(obuf)) {
- perror(mbox);
+ warn("%s", mbox);
Fclose(obuf);
Fclose(fbuf);
return;
@@ -337,7 +344,7 @@ writeback(res)
p = 0;
if ((obuf = Fopen(mailname, "r+")) == NULL) {
- perror(mailname);
+ warn("%s", mailname);
return(-1);
}
#ifndef APPEND
@@ -348,8 +355,8 @@ writeback(res)
for (mp = &message[0]; mp < &message[msgCount]; mp++)
if ((mp->m_flag&MPRESERVE)||(mp->m_flag&MTOUCH)==0) {
p++;
- if (send(mp, obuf, (struct ignoretab *)0, NOSTR) < 0) {
- perror(mailname);
+ if (sendmessage(mp, obuf, (struct ignoretab *)0, NOSTR) < 0) {
+ warnx("%s", mailname);
Fclose(obuf);
return(-1);
}
@@ -362,7 +369,7 @@ writeback(res)
fflush(obuf);
trunc(obuf);
if (ferror(obuf)) {
- perror(mailname);
+ warn("%s", mailname);
Fclose(obuf);
return(-1);
}
@@ -384,13 +391,11 @@ writeback(res)
void
edstop()
{
- extern char *tmpdir;
register int gotcha, c;
register struct message *mp;
FILE *obuf, *ibuf, *readstat;
struct stat statb;
- char tempname[30];
- char *mktemp();
+ char tempname[PATHSIZE];
if (readonly)
return;
@@ -419,16 +424,16 @@ edstop()
goto done;
ibuf = NULL;
if (stat(mailname, &statb) >= 0 && statb.st_size > mailsize) {
- strcpy(tempname, tmpdir);
- strcat(tempname, "mboxXXXXXX");
- mktemp(tempname);
- if ((obuf = Fopen(tempname, "w")) == NULL) {
- perror(tempname);
+ int fd;
+
+ snprintf(tempname, sizeof(tempname), "%s/mbox.XXXXXXXXXX", tmpdir);
+ if ((fd = mkstemp(tempname)) == -1 || (obuf = Fdopen(fd, "w")) == NULL) {
+ warn("%s", tempname);
relsesigs();
reset(0);
}
if ((ibuf = Fopen(mailname, "r")) == NULL) {
- perror(mailname);
+ warn("%s", mailname);
Fclose(obuf);
rm(tempname);
relsesigs();
@@ -440,7 +445,7 @@ edstop()
Fclose(ibuf);
Fclose(obuf);
if ((ibuf = Fopen(tempname, "r")) == NULL) {
- perror(tempname);
+ warn("%s", tempname);
rm(tempname);
relsesigs();
reset(0);
@@ -450,7 +455,7 @@ edstop()
printf("\"%s\" ", mailname);
fflush(stdout);
if ((obuf = Fopen(mailname, "r+")) == NULL) {
- perror(mailname);
+ warn("%s", mailname);
relsesigs();
reset(0);
}
@@ -460,8 +465,8 @@ edstop()
if ((mp->m_flag & MDELETED) != 0)
continue;
c++;
- if (send(mp, obuf, (struct ignoretab *) NULL, NOSTR) < 0) {
- perror(mailname);
+ if (sendmessage(mp, obuf, (struct ignoretab *) NULL, NOSTR) < 0) {
+ warnx("%s", mailname);
relsesigs();
reset(0);
}
@@ -474,7 +479,7 @@ edstop()
}
fflush(obuf);
if (ferror(obuf)) {
- perror(mailname);
+ warn("%s", mailname);
relsesigs();
reset(0);
}
diff --git a/usr.bin/mail/rcv.h b/usr.bin/mail/rcv.h
index 6d78f36..44bb25e 100644
--- a/usr.bin/mail/rcv.h
+++ b/usr.bin/mail/rcv.h
@@ -31,6 +31,8 @@
* SUCH DAMAGE.
*
* @(#)rcv.h 8.1 (Berkeley) 6/6/93
+ *
+ * $FreeBSD$
*/
/*
diff --git a/usr.bin/mail/send.c b/usr.bin/mail/send.c
index 5d7e3e1..9ffc05b 100644
--- a/usr.bin/mail/send.c
+++ b/usr.bin/mail/send.c
@@ -32,7 +32,11 @@
*/
#ifndef lint
+#if 0
static char sccsid[] = "@(#)send.c 8.1 (Berkeley) 6/6/93";
+#endif
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
#include "rcv.h"
@@ -52,7 +56,7 @@ static char sccsid[] = "@(#)send.c 8.1 (Berkeley) 6/6/93";
* prefix is a string to prepend to each output line.
*/
int
-send(mp, obuf, doign, prefix)
+sendmessage(mp, obuf, doign, prefix)
register struct message *mp;
FILE *obuf;
struct ignoretab *doign;
@@ -87,7 +91,7 @@ send(mp, obuf, doign, prefix)
* Process headers first
*/
while (count > 0 && ishead) {
- if (fgets(line, LINESIZE, ibuf) == NULL)
+ if (fgets(line, sizeof(line), ibuf) == NULL)
break;
count -= length = strlen(line);
if (firstline) {
@@ -172,12 +176,13 @@ send(mp, obuf, doign, prefix)
* Strip trailing whitespace from prefix
* if line is blank.
*/
- if (prefix != NOSTR)
+ if (prefix != NOSTR) {
if (length > 1)
fputs(prefix, obuf);
else
(void) fwrite(prefix, sizeof *prefix,
prefixlen, obuf);
+ }
(void) fwrite(line, sizeof *line, length, obuf);
if (ferror(obuf))
return -1;
@@ -190,7 +195,7 @@ send(mp, obuf, doign, prefix)
count--; /* skip final blank line */
if (prefix != NOSTR)
while (count > 0) {
- if (fgets(line, LINESIZE, ibuf) == NULL) {
+ if (fgets(line, sizeof(line), ibuf) == NULL) {
c = 0;
break;
}
@@ -312,18 +317,20 @@ mail1(hp, printheaders)
*/
if ((mtf = collect(hp, printheaders)) == NULL)
return;
- if (value("interactive") != NOSTR)
+ if (value("interactive") != NOSTR) {
if (value("askcc") != NOSTR)
grabh(hp, GCC);
else {
printf("EOT\n");
(void) fflush(stdout);
}
- if (fsize(mtf) == 0)
+ }
+ if (fsize(mtf) == 0) {
if (hp->h_subject == NOSTR)
printf("No message, no subject; hope that's ok\n");
else
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
@@ -369,7 +376,7 @@ mail1(hp, printheaders)
*/
pid = fork();
if (pid == -1) {
- perror("fork");
+ warn("fork");
savedeadletter(mtf);
goto out;
}
@@ -382,7 +389,7 @@ mail1(hp, printheaders)
else
cp = _PATH_SENDMAIL;
execv(cp, namelist);
- perror(cp);
+ warn("%s", cp);
_exit(1);
}
if (value("verbose") != NOSTR)
@@ -428,20 +435,24 @@ infix(hp, fi)
struct header *hp;
FILE *fi;
{
- extern char *tempMail;
register FILE *nfo, *nfi;
register int c;
+ int fd;
+ char tempname[PATHSIZE];
- if ((nfo = Fopen(tempMail, "w")) == NULL) {
- perror(tempMail);
+ snprintf(tempname, sizeof(tempname), "%s/mail.RsXXXXXXXXXX", tmpdir);
+ if ((fd = mkstemp(tempname)) == -1 ||
+ (nfo = Fdopen(fd, "w")) == NULL) {
+ warn("%s", tempname);
return(fi);
}
- if ((nfi = Fopen(tempMail, "r")) == NULL) {
- perror(tempMail);
+ if ((nfi = Fopen(tempname, "r")) == NULL) {
+ warn("%s", tempname);
(void) Fclose(nfo);
+ (void) rm(tempname);
return(fi);
}
- (void) rm(tempMail);
+ (void) rm(tempname);
(void) puthead(hp, nfo,
GTO|GSUBJECT|GCC|GBCC|GREPLYTO|GINREPLYTO|GNL|GCOMMA);
c = getc(fi);
@@ -450,13 +461,13 @@ infix(hp, fi)
c = getc(fi);
}
if (ferror(fi)) {
- perror("read");
+ warnx("read");
rewind(fi);
return(fi);
}
(void) fflush(nfo);
if (ferror(nfo)) {
- perror(tempMail);
+ warn("%s", tempname);
(void) Fclose(nfo);
(void) Fclose(nfi);
rewind(fi);
@@ -549,7 +560,7 @@ savemail(name, fi)
char *ctime();
if ((fo = Fopen(name, "a")) == NULL) {
- perror(name);
+ warn("%s", name);
return (-1);
}
(void) time(&now);
@@ -559,7 +570,7 @@ savemail(name, fi)
(void) putc('\n', fo);
(void) fflush(fo);
if (ferror(fo))
- perror(name);
+ warn("%s", name);
(void) Fclose(fo);
rewind(fi);
return (0);
diff --git a/usr.bin/mail/strings.c b/usr.bin/mail/strings.c
index 2f24f31..08626d9 100644
--- a/usr.bin/mail/strings.c
+++ b/usr.bin/mail/strings.c
@@ -32,7 +32,11 @@
*/
#ifndef lint
+#if 0
static char sccsid[] = "@(#)strings.c 8.1 (Berkeley) 6/6/93";
+#endif
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
/*
@@ -75,14 +79,11 @@ salloc(size)
index++;
}
if (sp >= &stringdope[NSPACE])
- panic("String too large");
+ errx(1, "String too large");
if (sp->s_topFree == NOSTR) {
index = sp - &stringdope[0];
- sp->s_topFree = malloc(STRINGSIZE << index);
- if (sp->s_topFree == NOSTR) {
- fprintf(stderr, "No room for space %d\n", index);
- panic("Internal error");
- }
+ if ((sp->s_topFree = malloc(STRINGSIZE << index)) == NOSTR)
+ err(1, "No room for space %d", index);
sp->s_nextFree = sp->s_topFree;
sp->s_nleft = STRINGSIZE << index;
}
diff --git a/usr.bin/mail/temp.c b/usr.bin/mail/temp.c
index fd14c58..dc51c38 100644
--- a/usr.bin/mail/temp.c
+++ b/usr.bin/mail/temp.c
@@ -40,7 +40,6 @@ static const char rcsid[] =
#endif /* not lint */
#include "rcv.h"
-#include <err.h>
#include "extern.h"
/*
@@ -49,75 +48,45 @@ static const char rcsid[] =
* Give names to all the temporary files that we will need.
*/
-char *tempMail;
-char *tempQuit;
-char *tempEdit;
-char *tempResid;
-char *tempMesg;
char *tmpdir;
void
tinit()
{
register char *cp;
- int len;
- if ((tmpdir = getenv("TMPDIR")) == NULL)
+ if ((tmpdir = getenv("TMPDIR")) == NULL || *tmpdir == '\0')
tmpdir = _PATH_TMP;
- else {
- len = strlen(tmpdir);
- if ((cp = malloc(len + 2)) == NULL)
- panic("Out of memory");
- (void)strcpy(cp, tmpdir);
- cp[len] = '/';
- cp[len + 1] = '\0';
- tmpdir = cp;
+ 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--;
}
- len = strlen(tmpdir);
- if ((tempMail = malloc(len + sizeof("RsXXXXXX"))) == NULL)
- panic("Out of memory");
- strcpy(tempMail, tmpdir);
- mktemp(strcat(tempMail, "RsXXXXXX"));
- if ((tempResid = malloc(len + sizeof("RqXXXXXX"))) == NULL)
- panic("Out of memory");
- strcpy(tempResid, tmpdir);
- mktemp(strcat(tempResid, "RqXXXXXX"));
- if ((tempQuit = malloc(len + sizeof("RmXXXXXX"))) == NULL)
- panic("Out of memory");
- strcpy(tempQuit, tmpdir);
- mktemp(strcat(tempQuit, "RmXXXXXX"));
- if ((tempEdit = malloc(len + sizeof("ReXXXXXX"))) == NULL)
- panic("Out of memory");
- strcpy(tempEdit, tmpdir);
- mktemp(strcat(tempEdit, "ReXXXXXX"));
- if ((tempMesg = malloc(len + sizeof("RxXXXXXX"))) == NULL)
- panic("Out of memory");
- strcpy(tempMesg, tmpdir);
- mktemp(strcat(tempMesg, "RxXXXXXX"));
/*
* It's okay to call savestr in here because main will
* do a spreserve() after us.
*/
if (myname != NOSTR) {
- if (getuserid(myname) < 0) {
- printf("\"%s\" is not a user of this system\n",
- myname);
- exit(1);
- }
+ if (getuserid(myname) < 0)
+ errx(1, "\"%s\" is not a user of this system", myname);
} else {
if ((cp = username()) == NOSTR) {
myname = "ubluit";
- if (rcvmode) {
- printf("Who are you!?\n");
- exit(1);
- }
+ if (rcvmode)
+ errx(1, "Who are you!?");
} else
myname = savestr(cp);
}
- if ((cp = getenv("HOME")) == NOSTR)
- cp = ".";
- homedir = savestr(cp);
+ if ((cp = getenv("HOME")) == NOSTR || *cp == '\0' ||
+ strlen(cp) >= PATHSIZE)
+ homedir = NULL;
+ else
+ homedir = savestr(cp);
if (debug)
- printf("user = %s, homedir = %s\n", myname, homedir);
+ printf("user = %s, homedir = %s\n", myname,
+ homedir ? homedir : "NONE");
}
diff --git a/usr.bin/mail/tty.c b/usr.bin/mail/tty.c
index 53cb456..c4f37fe 100644
--- a/usr.bin/mail/tty.c
+++ b/usr.bin/mail/tty.c
@@ -32,7 +32,11 @@
*/
#ifndef lint
+#if 0
static char sccsid[] = "@(#)tty.c 8.1 (Berkeley) 6/6/93";
+#endif
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
/*
@@ -80,7 +84,7 @@ grabh(hp, gflags)
ttyset = 0;
#endif
if (tcgetattr(fileno(stdin), &tio) < 0) {
- perror("tcgetattr(stdin)");
+ warn("tcgetattr(stdin)");
return(-1);
}
c_erase = tio.c_cc[VERASE];
@@ -167,9 +171,9 @@ readtty(pr, src)
}
#ifndef TIOCSTI
if (src != NOSTR)
- cp = copy(src, canonb);
+ strlcpy(canonb, src, sizeof(canonb));
else
- cp = copy("", canonb);
+ *canonb = '\0';
fputs(canonb, stdout);
fflush(stdout);
#else
@@ -183,11 +187,11 @@ readtty(pr, src)
ioctl(0, TIOCSTI, &ch);
}
cp = canonb;
- *cp = 0;
+ *cp = '\0';
#endif
cp2 = cp;
while (cp2 < canonb + BUFSIZ)
- *cp2++ = 0;
+ *cp2++ = '\0';
cp2 = cp;
if (setjmp(rewrite))
goto redo;
diff --git a/usr.bin/mail/v7.local.c b/usr.bin/mail/v7.local.c
index ade3cbd..03f2775 100644
--- a/usr.bin/mail/v7.local.c
+++ b/usr.bin/mail/v7.local.c
@@ -32,7 +32,11 @@
*/
#ifndef lint
+#if 0
static char sccsid[] = "@(#)v7.local.c 8.1 (Berkeley) 6/6/93";
+#endif
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
/*
@@ -52,15 +56,16 @@ static char sccsid[] = "@(#)v7.local.c 8.1 (Berkeley) 6/6/93";
* mail is queued).
*/
void
-findmail(user, buf)
+findmail(user, buf, buflen)
char *user, *buf;
+ int buflen;
{
char *tmp = getenv("MAIL");
if (tmp == NULL)
- (void)sprintf(buf, "%s/%s", _PATH_MAILDIR, user);
+ (void)snprintf(buf, buflen, "%s/%s", _PATH_MAILDIR, user);
else
- (void)strcpy(buf, tmp);
+ (void)strlcpy(buf, tmp, buflen);
}
/*
@@ -71,7 +76,7 @@ demail()
{
if (value("keep") != NOSTR || rm(mailname) < 0)
- close(creat(mailname, 0600));
+ close(open(mailname, O_CREAT | O_TRUNC | O_WRONLY, 0600));
}
/*
@@ -81,8 +86,14 @@ char *
username()
{
char *np;
+ uid_t uid;
if ((np = getenv("USER")) != NOSTR)
return np;
- return getname(getuid());
+ if ((np = getenv("LOGNAME")) != NOSTR)
+ return np;
+ if ((np = getname(uid = getuid())) != NOSTR)
+ return np;
+ printf("Cannot associate a name with uid %u\n", (unsigned)uid);
+ return NOSTR;
}
diff --git a/usr.bin/mail/vars.c b/usr.bin/mail/vars.c
index 2a90442..5d09d0f 100644
--- a/usr.bin/mail/vars.c
+++ b/usr.bin/mail/vars.c
@@ -32,7 +32,11 @@
*/
#ifndef lint
+#if 0
static char sccsid[] = "@(#)vars.c 8.1 (Berkeley) 6/6/93";
+#endif
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
#include "rcv.h"
@@ -96,7 +100,7 @@ vcopy(str)
return "";
len = strlen(str) + 1;
if ((new = malloc(len)) == NULL)
- panic("Out of memory");
+ err(1, "Out of memory");
bcopy(str, new, (int) len);
return new;
}
diff --git a/usr.bin/mail/version.c b/usr.bin/mail/version.c
index c7d39c3..f3d9ab8 100644
--- a/usr.bin/mail/version.c
+++ b/usr.bin/mail/version.c
@@ -32,7 +32,11 @@
*/
#ifndef lint
+#if 0
static char sccsid[] = "@(#)version.c 8.1 (Berkeley) 6/6/93";
+#endif
+static const char rcsid[] =
+ "$FreeBSD$";
#endif /* not lint */
/*
OpenPOWER on IntegriCloud