Copy original revs 1.2,1.3 - nofsync/nobiff support, usage update.

This commit is contained in:
Peter Wemm 1998-08-04 13:14:21 +00:00
parent e3de8dc3d1
commit d615a19295
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=38084

View File

@ -220,9 +220,9 @@ int eval = EX_OK; /* sysexits.h error value. */
int lmtpmode = 0;
u_char tTdvect[100];
void deliver __P((int, char *));
void deliver __P((int, char *, int, int));
void e_to_sys __P((int));
__dead void err __P((const char *, ...));
void err __P((const char *, ...)) __dead2;
void notifybiff __P((char *));
int store __P((char *, int));
void usage __P((void));
@ -231,6 +231,7 @@ void warn __P((const char *, ...));
void lockmbox __P((char *));
void unlockmbox __P((void));
void mailerr __P((const char *, const char *, ...));
void dolmtp __P((int, int));
int
main(argc, argv)
@ -238,12 +239,11 @@ main(argc, argv)
char *argv[];
{
struct passwd *pw;
int ch, fd;
int ch, fd, nobiff, nofsync;
uid_t uid;
char *from;
extern char *optarg;
extern int optind;
extern void dolmtp __P((void));
/* make sure we have some open file descriptors */
for (fd = 10; fd < 30; fd++)
@ -259,8 +259,13 @@ main(argc, argv)
#endif
from = NULL;
while ((ch = getopt(argc, argv, "df:r:l")) != -1)
nobiff = 0;
nofsync = 0;
while ((ch = getopt(argc, argv, "bdf:r:ls")) != -1)
switch(ch) {
case 'b':
nobiff++;
break;
case 'd': /* Backward compatible. */
break;
case 'f':
@ -274,6 +279,9 @@ main(argc, argv)
case 'l':
lmtpmode++;
break;
case 's':
nofsync++;
break;
case '?':
default:
usage();
@ -282,7 +290,7 @@ main(argc, argv)
argv += optind;
if (lmtpmode)
dolmtp();
dolmtp(nobiff, nofsync);
if (!*argv)
usage();
@ -307,7 +315,7 @@ main(argc, argv)
* at the expense of repeated failures and multiple deliveries.
*/
for (fd = store(from, 0); *argv; ++argv)
deliver(fd, *argv);
deliver(fd, *argv, nobiff, nofsync);
exit(eval);
}
@ -423,7 +431,8 @@ process_recipient(addr)
#define RCPT_GROW 30
void
dolmtp()
dolmtp(nobiff, nofsync)
int nobiff, nofsync;
{
char *return_path = NULL;
char **rcpt_addr = NULL;
@ -467,7 +476,8 @@ dolmtp()
p = strchr(rcpt_addr[i], '+');
if (p != NULL)
*p++ = '\0';
deliver(msgfd, rcpt_addr[i]);
deliver(msgfd, rcpt_addr[i], nobiff,
nofsync);
}
close(msgfd);
goto rset;
@ -670,9 +680,10 @@ store(from, lmtprcpts)
}
void
deliver(fd, name)
deliver(fd, name, nobiff, nofsync)
int fd;
char *name;
int nobiff, nofsync;
{
struct stat fsb, sb;
struct passwd *pw;
@ -801,14 +812,16 @@ deliver(fd, name)
goto err1;
}
/* Get the starting offset of the new message for biff. */
curoff = lseek(mbfd, (off_t)0, SEEK_END);
if (sizeof curoff > sizeof(long))
(void)snprintf(biffmsg, sizeof(biffmsg), "%s@%s\n",
name, quad_to_string(curoff));
else
(void)snprintf(biffmsg, sizeof(biffmsg), "%s@%ld\n",
name, curoff);
if (!nobiff) {
/* Get the starting offset of the new message for biff. */
curoff = lseek(mbfd, (off_t)0, SEEK_END);
if (sizeof curoff > sizeof(long))
(void)snprintf(biffmsg, sizeof(biffmsg), "%s@%s\n",
name, quad_to_string(curoff));
else
(void)snprintf(biffmsg, sizeof(biffmsg), "%s@%ld\n",
name, curoff);
}
/* Copy the message into the file. */
if (lseek(fd, (off_t)0, SEEK_SET) == (off_t)-1) {
@ -838,7 +851,7 @@ deliver(fd, name)
}
/* Flush to disk, don't wait for update. */
if (fsync(mbfd)) {
if (!nofsync && fsync(mbfd)) {
mailerr("450 4.2.0", "%s: %s", path, strerror(errno));
err3:
if (setreuid(0, 0) < 0) {
@ -859,7 +872,7 @@ err0: unlockmbox();
if (close(mbfd)) {
mailerr("450 4.2.0", "%s: %s", path, strerror(errno));
truncate(path, curoff);
} else
} else if (!nobiff)
notifybiff(biffmsg);
if (setreuid(0, 0) < 0) {
@ -968,7 +981,7 @@ void
usage()
{
eval = EX_USAGE;
err("usage: mail.local [-l] [-f from] user ...");
err("usage: mail.local [-b] [-l] [-f from] [-s] user ...");
}
void