xref: /illumos-gate/usr/src/cmd/bnu/mailst.c (revision 374858d291554c199353841e2900bc130463934a)
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  * Copyright (c) 2000 by Sun Microsystems, Inc.
27  * All rights reserved.
28  */
29 
30 #ident	"%Z%%M%	%I%	%E% SMI"	/* from SVR4 bnu:mailst.c 2.7 */
31 
32 #include "uucp.h"
33 
34 extern int xfappend();
35 
36 /*
37  * fork and execute a mail command sending
38  * string (str) to user (user).
39  * If file is non-null, the file is also sent.
40  * (this is used for mail returned to sender.)
41  *	user	 -> user to send mail to
42  *	subj	 -> subject for the mail
43  *	str	 -> string mailed to user
44  *	infile	 -> optional stdin mailed to user
45  *	errfile	 -> optional stderr mailed to user
46  */
47 void
48 mailst(user, subj, str, infile, errfile)
49 char *user, *subj, *str, *infile, *errfile;
50 {
51 	register FILE *fp, *fi;
52 	char cmd[BUFSIZ];
53 	char subject[BUFSIZ];
54 	char *c;
55 
56 	/* get rid of some stuff that could be dangerous */
57 	if ( (c = strpbrk(user, Shchar)) != NULL) {
58 		*c = NULLCHAR;
59 	}
60 
61 	/* limit subject to one line */
62 	if ((c = strchr(subj, '\n')) != NULL) {
63 		strncpy(subject, subj, c-subj);
64 		subject[c-subj] = NULLCHAR;
65 		subj = subject;
66 	}
67 
68 	(void) snprintf(cmd, sizeof (cmd), "%s %s '%s'", PATH, MAIL, user);
69 	if ((fp = popen(cmd, "w")) == NULL)
70 		return;
71 	(void) fprintf(fp, "To: %s\nSubject: %s\n\n%s\n", user, subj, str);
72 
73 	/* copy back stderr */
74 	if (*errfile != '\0' && NOTEMPTY(errfile) && (fi = fopen(errfile, "r")) != NULL) {
75 		fputs(gettext("\n\t===== stderr was =====\n"), fp);
76 		if (xfappend(fi, fp) != SUCCESS)
77 			fputs(gettext("\n\t===== well, i tried =====\n"), fp);
78 		(void) fclose(fi);
79 		fputc('\n', fp);
80 	}
81 
82 	/* copy back stdin */
83  	if (*infile) {
84  		if (!NOTEMPTY(infile))
85  			fputs(gettext("\n\t===== stdin was empty =====\n"), fp);
86  		else if (chkpth(infile, CK_READ) == FAIL) {
87  			fputs(gettext( "\n\t===== stdin was"
88 			    " denied read permission =====\n"), fp);
89 			snprintf(cmd, sizeof (cmd),
90 				"user %s, stdin %s", user, infile);
91 			logent(cmd, "DENIED");
92 		}
93  		else if ((fi = fopen(infile, "r")) == NULL) {
94  			fputs(gettext(
95 			    "\n\t===== stdin was unreadable =====\n"), fp);
96 			snprintf(cmd, sizeof (cmd),
97 				"user %s, stdin %s", user, infile);
98 			logent(cmd, "UNREADABLE");
99 		}
100  		else {
101  			fputs(gettext("\n\t===== stdin was =====\n"), fp);
102  			if (xfappend(fi, fp) != SUCCESS)
103  				fputs(gettext(
104 				    "\n\t===== well, i tried =====\n"), fp);
105  			(void) fclose(fi);
106  		}
107 		fputc('\n', fp);
108 	}
109 
110 	(void) pclose(fp);
111 	return;
112 }
113 #ifndef	V7
114 static char un[2*NAMESIZE];
115 void
116 setuucp(p)
117 char *p;
118 {
119    char **envp;
120 
121     envp = Env;
122     for ( ; *envp; envp++) {
123 	if(PREFIX("LOGNAME", *envp)) {
124 	    (void) snprintf(un, sizeof (un), "LOGNAME=%s",p);
125 	    envp[0] = &un[0];
126 	}
127     }
128    return;
129 }
130 #else
131 /*ARGSUSED*/
132 void
133 setuucp(p) char	*p; {}
134 #endif
135