240 lines
8.7 KiB
C
Executable File
240 lines
8.7 KiB
C
Executable File
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
|
|
/* All Rights Reserved */
|
|
|
|
/* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */
|
|
/* The copyright notice above does not evidence any */
|
|
/* actual or intended publication of such source code. */
|
|
|
|
#ident "@(#)init.c 1.10 95/10/19 SMI" /* SVr4.0 1.11 */
|
|
|
|
/*
|
|
* All global externs defined in mail.h. All variables are initialized
|
|
* here!
|
|
*
|
|
* !!!!!IF YOU CHANGE (OR ADD) IT HERE, DO IT THERE ALSO !!!!!!!!
|
|
*
|
|
*/
|
|
#include "mail.h"
|
|
|
|
int ac; /* argument list count */
|
|
char **av; /* argument list */
|
|
int affbytecnt; /* Total bytes of Auto-Fwd. info in msg. */
|
|
int affcnt; /* Number of Auto-Fwd.-From: lines in msg. */
|
|
int Daffbytecnt; /* Hold affbytecnt when sending Delivery Notification */
|
|
int Daffcnt; /* Hold affcnt when sending Delivery Notification */
|
|
char binmsg[] = "*** Message content is not printable: delete, write or save it to a file ***";
|
|
int changed; /* > 0 says mailfile has changed */
|
|
char datestring[60]; /* Today's date and time */
|
|
char dbgfname[20];
|
|
FILE *dbgfp;
|
|
char dead[] = "/dead.letter"; /* name of dead.letter */
|
|
int debug; /* Controls debugging level. 0 ==> no debugging */
|
|
int delflg = 1;
|
|
int dflag = 0; /* 1 says returning unsendable mail */
|
|
char *errlist[]= {
|
|
"",
|
|
"Unknown system",
|
|
"Problem with mailfile",
|
|
"Space problem",
|
|
"Unable to forward mail, check permissions and group",
|
|
"Syntax error",
|
|
"Forwarding loop",
|
|
"Invalid sender",
|
|
"Invalid recipient",
|
|
"Too many From lines",
|
|
"Invalid permissions",
|
|
"Cannot open mbox",
|
|
"Temporary file problem",
|
|
"Cannot create dead.letter",
|
|
"Unbounded forwarding",
|
|
"Cannot create lock file",
|
|
"No group id of 'mail'",
|
|
"Problem allocating memory",
|
|
"Could not fork",
|
|
"Cannot pipe",
|
|
"Must be owner to modify mailfile",
|
|
"Permission denied by /etc/mail/mailsurr file",
|
|
"Surrogate command failed"
|
|
};
|
|
int error = 0; /* Local value for error */
|
|
char *failsafe; /* $FAILSAFE */
|
|
int file_size;
|
|
int flge = 0; /* 1 ==> 'e' option specified */
|
|
int flgE = 0; /* 1 ==> 'E' option specified */
|
|
int flgF = 0; /* 1 ==> Installing/Removing Forwarding */
|
|
int flgf = 0; /* 1 ==> 'f' option specified */
|
|
int flgh = 0; /* 1 ==> 'h' option specified */
|
|
int flgm;
|
|
int flgp = 0; /* 1 ==> 'p' option specified */
|
|
int flgP = 0; /* 1 ==> 'P' option specified */
|
|
int flgr = 0; /* 1 ==> 'r' option -- print in fifo order */
|
|
int flgt = 0; /* 1 ==> 't' option -- add To: line to letter */
|
|
int flgT = 0; /* 1 ==> 'T' option specified */
|
|
int flgw = 0; /* 1 ==> 'w' option specified */
|
|
int fnuhdrtype = 0; /* type of first non-UNIX header line */
|
|
char forwmsg[] = " forwarded by %s\n";
|
|
char fromS[1024]; /* stored here by sendmail for sendsurg */
|
|
char fromU[1024]; /* stored here by sendmail for sendsurg */
|
|
char frwlmsg[] = " %s: Forwarding loop detected in %s's mailfile.\n";
|
|
char frwrd[] = "Forward to "; /* forwarding sentinel */
|
|
char fwdFrom[1024];
|
|
int goerr = 0; /* counts parsing errors */
|
|
struct group *grpptr; /* pointer to struct group */
|
|
struct hdrlines hdrlines[H_CONT];
|
|
/* Default_display indicates whether to display this header line to the TTY */
|
|
/* when in default mode. Can be overridden via 'P' command at ? prompt */
|
|
struct hdr header[] = {
|
|
"", FALSE,
|
|
"Auto-Forward-Count:", FALSE,
|
|
"Auto-Forwarded-From:", FALSE,
|
|
"Content-Length:", TRUE,
|
|
"Content-Type:", FALSE,
|
|
"Date:", TRUE,
|
|
"Default-Options:", FALSE,
|
|
"End-of-Header:", FALSE,
|
|
"From ", TRUE,
|
|
">From ", TRUE,
|
|
"From:", TRUE,
|
|
"MTS-Message-ID:", FALSE,
|
|
"Message-Type:", FALSE,
|
|
"Message-Version:", FALSE,
|
|
"Message-Service:", TRUE,
|
|
"Received:", FALSE,
|
|
"Report-Version:", FALSE,
|
|
"Subject:", TRUE,
|
|
"To:", TRUE,
|
|
">To:", FALSE,
|
|
"Transport-Options:", FALSE,
|
|
"UA-Content-ID:", FALSE,
|
|
|
|
/*Dummy place holders for H_DAFWDFROM,*/
|
|
/*H_DTCOPY and H_RECEIVED. Should */
|
|
/* match above first...*/
|
|
"Hold-Auto-Forwarded-From:", FALSE,
|
|
"Hold->To:", FALSE,
|
|
"Hold-Received:", FALSE,
|
|
"Continue:", FALSE,
|
|
"Name-Value:", FALSE,
|
|
};
|
|
char *help[] = {
|
|
"?\t\tprint this help message\n",
|
|
"#\t\tdisplay message number #\n",
|
|
"-\t\tprint previous\n",
|
|
"+\t\tnext (no delete)\n",
|
|
"! cmd\t\texecute cmd\n",
|
|
"<CR>\t\tnext (no delete)\n",
|
|
"a\t\tposition at and read newly arrived mail\n",
|
|
"d [#]\t\tdelete message # (default current message)\n",
|
|
"dp\t\tdelete current message and print the next\n",
|
|
"dq\t\tdelete current message and exit\n",
|
|
"h a\t\tdisplay all headers\n",
|
|
"h d\t\tdisplay headers of letters scheduled for deletion\n",
|
|
"h [#]\t\tdisplay headers around # (default current message)\n",
|
|
"m user \tmail (and delete) current message to user\n",
|
|
"n\t\tnext (no delete)\n",
|
|
"p\t\tprint (override any warnings of binary content)\n",
|
|
"P\t\toverride default 'brief' mode and display ALL header lines\n",
|
|
"q, ^D\t\tquit\n",
|
|
"r [args]\treply to (and delete) current letter via mail [args]\n",
|
|
"s [files]\tsave (and delete) current message (default mbox)\n",
|
|
"u [#]\t\tundelete message # (default current message)\n",
|
|
"w [files]\tsave (and delete) current message without header\n",
|
|
"x\t\texit without changing mail\n",
|
|
"y [files]\tsave (and delete) current message (default mbox)\n",
|
|
0
|
|
};
|
|
char *hmbox; /* pointer to $HOME/mbox */
|
|
char *hmdead; /* pointer to $HOME/dead.letter */
|
|
char *home; /* pointer to $HOME */
|
|
long iop;
|
|
int interactive = 0; /* 1 says user is interactive */
|
|
int ismail = TRUE; /* default to program=mail */
|
|
int deliverflag = FALSE; /* -d flag, skip sendmail
|
|
* deliver directly to mailbox
|
|
*/
|
|
int fromflag = FALSE; /* -f from_user, set a user
|
|
* when going into a mailbox
|
|
*/
|
|
int keepdbgfile;
|
|
struct let let[MAXLET];
|
|
char *lettmp; /* pointer to tmp filename */
|
|
char lfil[MAXFILENAME];
|
|
char line[LSIZE]; /* holds a line of a letter in many places */
|
|
char *mailfile; /* pointer to mailfile */
|
|
char mailcnfg[] = MAILCNFG; /* configuration file */
|
|
char maildir[] = MAILDIR; /* directory for mail files */
|
|
gid_t mailgrp; /* numeric id of group 'mail' */
|
|
char mailsave[] = SAVEDIR; /* dir for save files */
|
|
char *mailsurr = MAILSURR; /* surrogate file name */
|
|
FILE *malf; /* File pointer for mailfile */
|
|
int maxerr = 0; /* largest value of error */
|
|
char mbox[] = "/mbox"; /* name for mbox */
|
|
uid_t mf_uid; /* uid of users mailfile */
|
|
gid_t mf_gid; /* gid of users mailfile */
|
|
char *msgtype;
|
|
char my_name[1024]; /* user's name who invoked this command */
|
|
char from_user[1024]; /* user's name specified w/ -f when sending */
|
|
uid_t my_euid; /* user's euid */
|
|
gid_t my_egid; /* user's egid */
|
|
uid_t my_uid; /* user's uid */
|
|
gid_t my_gid; /* user's gid */
|
|
int nlet = 0; /* current number of letters in mailfile */
|
|
int onlet = 0; /* number of letters in mailfile at startup*/
|
|
int optcnt = 0; /* Number of options specified */
|
|
int orig_aff = 0; /* orig. msg. contained H_AFWDFROM lines */
|
|
int orig_dbglvl; /* argument to -x invocation option */
|
|
int orig_rcv = 0; /* orig. msg. contained H_RECEIVED lines */
|
|
int orig_tcopy = 0; /* orig. msg. contained H_TCOPY lines */
|
|
struct passwd *pwd; /* holds passwd entry for this user */
|
|
int pflg = 0; /* binary message display override flag */
|
|
int Pflg = 0; /* Selective display flag; 1 ==> display all */
|
|
char *program; /* program name */
|
|
int rcvbytecnt; /* Total bytes of Received: info in msg. */
|
|
int Drcvbytecnt; /* Hold rcvbytecnt when sending Delivery Notification */
|
|
char *recipname; /* full recipient name/address */
|
|
int replying = 0; /* 1 says we are replying to a letter */
|
|
char RFC822datestring[60];/* Date in RFC822 date format */
|
|
char Rpath[1024]; /* return path to sender of message */
|
|
char rmtmsg[] = " remote from %s\n";
|
|
char rtrnmsg[] = "***** UNDELIVERABLE MAIL sent to %s, being returned by %s *****\n";
|
|
int sav_errno;
|
|
char savefile[MAXFILENAME]; /* holds filename of save file */
|
|
void (*saveint)();
|
|
/* Any header line prefixes listed here WILL be displayed in default mode */
|
|
/* If it's not here, it won't be shown. Can be overridden via 'P' command */
|
|
/* at ? prompt */
|
|
char *seldisp[] = {
|
|
"Cc:",
|
|
"Bcc:",
|
|
"Paper-",
|
|
"Phone:",
|
|
"Message-",
|
|
"Original-",
|
|
"Confirming-",
|
|
"Delivered-",
|
|
"Deliverable-",
|
|
"Not-",
|
|
"En-Route-To:",
|
|
0
|
|
};
|
|
int sending; /* TRUE==>sending mail; FALSE==>printing mail */
|
|
char m_sendto[1024];
|
|
jmp_buf sjbuf;
|
|
int surg_rc = 0; /* exit code of surrogate command */
|
|
int surr_len = 0;
|
|
char *SURRcmdstr = (char *)NULL; /* save in case of FAILURE */
|
|
FILE *SURRerrfile; /* stderr from surrogate in case of FAILURE */
|
|
char *thissys; /* Holds name of the system we are on */
|
|
FILE *tmpf; /* file pointer for temporary files */
|
|
mode_t umsave;
|
|
struct utsname utsn;
|
|
static struct utimbuf utims;
|
|
struct utimbuf *utimep = &utims;
|
|
char uval[1024];
|
|
|
|
int init()
|
|
{
|
|
utims.actime = utims.modtime = -1;
|
|
return (xsetenv(mailcnfg));
|
|
}
|