mailst.c revision 7c478bd95313f5f23a4c958a745db2134aa03244
/*
* 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 (c) 2000 by Sun Microsystems, Inc.
* All rights reserved.
*/
#ident "%Z%%M% %I% %E% SMI" /* from SVR4 bnu:mailst.c 2.7 */
#include "uucp.h"
extern int xfappend();
/*
* fork and execute a mail command sending
* string (str) to user (user).
* If file is non-null, the file is also sent.
* (this is used for mail returned to sender.)
* user -> user to send mail to
* subj -> subject for the mail
* str -> string mailed to user
* infile -> optional stdin mailed to user
* errfile -> optional stderr mailed to user
*/
void
mailst(user, subj, str, infile, errfile)
char *user, *subj, *str, *infile, *errfile;
{
register FILE *fp, *fi;
char cmd[BUFSIZ];
char subject[BUFSIZ];
char *c;
/* get rid of some stuff that could be dangerous */
if ( (c = strpbrk(user, Shchar)) != NULL) {
*c = NULLCHAR;
}
/* limit subject to one line */
if ((c = strchr(subj, '\n')) != NULL) {
strncpy(subject, subj, c-subj);
subject[c-subj] = NULLCHAR;
subj = subject;
}
(void) snprintf(cmd, sizeof (cmd), "%s %s '%s'", PATH, MAIL, user);
if ((fp = popen(cmd, "w")) == NULL)
return;
(void) fprintf(fp, "To: %s\nSubject: %s\n\n%s\n", user, subj, str);
/* copy back stderr */
if (*errfile != '\0' && NOTEMPTY(errfile) && (fi = fopen(errfile, "r")) != NULL) {
fputs(gettext("\n\t===== stderr was =====\n"), fp);
if (xfappend(fi, fp) != SUCCESS)
fputs(gettext("\n\t===== well, i tried =====\n"), fp);
(void) fclose(fi);
fputc('\n', fp);
}
/* copy back stdin */
if (*infile) {
if (!NOTEMPTY(infile))
fputs(gettext("\n\t===== stdin was empty =====\n"), fp);
else if (chkpth(infile, CK_READ) == FAIL) {
fputs(gettext( "\n\t===== stdin was"
" denied read permission =====\n"), fp);
snprintf(cmd, sizeof (cmd),
"user %s, stdin %s", user, infile);
logent(cmd, "DENIED");
}
else if ((fi = fopen(infile, "r")) == NULL) {
fputs(gettext(
"\n\t===== stdin was unreadable =====\n"), fp);
snprintf(cmd, sizeof (cmd),
"user %s, stdin %s", user, infile);
logent(cmd, "UNREADABLE");
}
else {
fputs(gettext("\n\t===== stdin was =====\n"), fp);
if (xfappend(fi, fp) != SUCCESS)
fputs(gettext(
"\n\t===== well, i tried =====\n"), fp);
(void) fclose(fi);
}
fputc('\n', fp);
}
(void) pclose(fp);
return;
}
#ifndef V7
static char un[2*NAMESIZE];
void
setuucp(p)
char *p;
{
char **envp;
envp = Env;
for ( ; *envp; envp++) {
if(PREFIX("LOGNAME", *envp)) {
(void) snprintf(un, sizeof (un), "LOGNAME=%s",p);
envp[0] = &un[0];
}
}
return;
}
#else
/*ARGSUSED*/
void
setuucp(p) char *p; {}
#endif