/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
/*	  All Rights Reserved  	*/


/*
 * Copyright 2003 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*	from OpenSolaris "init.c	1.14	05/06/08 SMI"	*/

/*
 * Portions Copyright (c) 2005 Gunnar Ritter, Freiburg i. Br., Germany
 *
 * Sccsid @(#)init.c	1.8 (gritter) 7/3/05
 */

 /*
  * 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;		/* stored here by sendmail for sendsurg */
size_t		fromSsize;
char		*fromU;		/* stored here by sendmail for sendsurg */
size_t		fromUsize;
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:" /* unused */,	TRUE,	},
	{	"Content-Type:",		FALSE,	},
	{	"Date:",			TRUE,	},
	{	"Default-Options:",		FALSE,	},
	{	"End-of-Header:",		FALSE,	},
	{	"From ",			TRUE,	},
	{	">From ",			TRUE,	},
	{	"From:",			TRUE,	},
	{	"MIME-Version:" /* unused */,	FALSE,	},
	{	"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 */
size_t		hmboxsize;
char		*hmdead;	/* pointer to $HOME/dead.letter */
size_t		hmdeadsize;
char		*home;		/* pointer to $HOME */
time_t		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;		/* holds a line of a letter in many places */
size_t		linesize;
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 */
int		mb_cur_max;	/* MB_CUR_MAX */
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;	/* user's name who invoked this command */
size_t		my_namesize;
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;		/* return path to sender of message */
size_t		Rpathsize;
char		rmtmsg[] =	" remote from %s\n";
char		rtrnmsg[] =	"***** UNDELIVERABLE MAIL sent to %s, being returned by %s *****\n";
int		sav_errno;
void		(*saveint)(int);
/* 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;
size_t		m_sendtosize;
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];
char		*savefile;
size_t		savefilesize;

int 
init(void)
{
	utims.actime = utims.modtime = -1;
	return (xsetenv(mailcnfg));
}
