mkdead.c revision 7c478bd95313f5f23a4c958a745db2134aa03244
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
23/*	  All Rights Reserved  	*/
24
25
26#ident	"%Z%%M%	%I%	%E% SMI"        /* SVr4.0 1.6 */
27
28#include "mail.h"
29/*
30	Routine creates dead.letter
31*/
32void mkdead()
33{
34	static char pn[] = "mkdead";
35	int aret;
36	char *dotdead = &dead[1];
37	gid_t egid = getegid();
38	struct stat st;
39
40	malf = (FILE *)NULL;
41
42	/*
43		Make certain that there's something to copy.
44	*/
45	if (!tmpf)
46		return;
47
48	/*
49		Try to create dead letter in current directory
50		or in home directory
51	*/
52	umask(umsave);
53	setgid(getgid());
54	if ((aret = legal(dotdead)) && stat(dotdead, &st) == 0)
55		malf = fopen(dotdead, "a");
56	if ((malf == NULL) || (aret == 0)) {
57		/*
58			try to create in $HOME
59		*/
60		if((hmdead = malloc(strlen(home) + strlen(dead) + 1)) == NULL) {
61			fprintf(stderr, "%s: Can't malloc\n",program);
62			Dout(pn, 0, "Cannot malloc.\n");
63			goto out;
64		}
65		cat(hmdead, home, dead);
66		if ((aret=legal(hmdead)) && !(stat(hmdead, &st) < 0 &&
67			errno == EOVERFLOW))
68			malf = fopen(hmdead, "a");
69		if ((malf == NULL) || (aret == 0)) {
70			fprintf(stderr,
71				"%s: Cannot create %s\n",
72				program,dotdead);
73			Dout(pn, 0, "Cannot create %s\n", dotdead);
74		out:
75			fclose(tmpf);
76			error = E_FILE;
77			Dout(pn, 0, "error set to %d\n", error);
78			umask(7);
79			setegid(egid);
80			return;
81		}  else {
82			chmod(hmdead, DEADPERM);
83			fprintf(stderr,"%s: Mail saved in %s\n",program,hmdead);
84		}
85	} else {
86		chmod(dotdead, DEADPERM);
87		fprintf(stderr,"%s: Mail saved in %s\n",program,dotdead);
88	}
89
90	/*
91		Copy letter into dead letter box
92	*/
93	umask(7);
94	aret = fseek(tmpf,0L,0);
95	if (aret)
96		errmsg(E_DEAD,"");
97	if (!copystream(tmpf, malf))
98		errmsg(E_DEAD,"");
99	fclose(malf);
100	setegid(egid);
101}
102
103void savdead()
104{
105	static char pn[] = "savdead";
106	setsig(SIGINT, saveint);
107	dflag = 2;	/* do not send back letter on interrupt */
108	Dout(pn, 0, "dflag set to 2\n");
109	if (!error) {
110		error = E_REMOTE;
111		Dout(pn, 0, "error set to %d\n", error);
112	}
113	maxerr = error;
114	Dout(pn, 0, "maxerr set to %d\n", maxerr);
115}
116