1*7c478bd9Sstevel@tonic-gate /* 2*7c478bd9Sstevel@tonic-gate * CDDL HEADER START 3*7c478bd9Sstevel@tonic-gate * 4*7c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5*7c478bd9Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 6*7c478bd9Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 7*7c478bd9Sstevel@tonic-gate * with the License. 8*7c478bd9Sstevel@tonic-gate * 9*7c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*7c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 11*7c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 12*7c478bd9Sstevel@tonic-gate * and limitations under the License. 13*7c478bd9Sstevel@tonic-gate * 14*7c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 15*7c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*7c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 17*7c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 18*7c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 19*7c478bd9Sstevel@tonic-gate * 20*7c478bd9Sstevel@tonic-gate * CDDL HEADER END 21*7c478bd9Sstevel@tonic-gate */ 22*7c478bd9Sstevel@tonic-gate /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 23*7c478bd9Sstevel@tonic-gate /* All Rights Reserved */ 24*7c478bd9Sstevel@tonic-gate 25*7c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 26*7c478bd9Sstevel@tonic-gate 27*7c478bd9Sstevel@tonic-gate /* 28*7c478bd9Sstevel@tonic-gate * NAME 29*7c478bd9Sstevel@tonic-gate * copyback - copy temp or whatever back to /var/mail 30*7c478bd9Sstevel@tonic-gate * 31*7c478bd9Sstevel@tonic-gate * SYNOPSIS 32*7c478bd9Sstevel@tonic-gate * void copyback() 33*7c478bd9Sstevel@tonic-gate * 34*7c478bd9Sstevel@tonic-gate * DESCRIPTION 35*7c478bd9Sstevel@tonic-gate * Copy the reduced contents of lettmp back to 36*7c478bd9Sstevel@tonic-gate * the mail file. First copy any new mail from 37*7c478bd9Sstevel@tonic-gate * the mail file to the end of lettmp. 38*7c478bd9Sstevel@tonic-gate */ 39*7c478bd9Sstevel@tonic-gate 40*7c478bd9Sstevel@tonic-gate #include "mail.h" 41*7c478bd9Sstevel@tonic-gate void 42*7c478bd9Sstevel@tonic-gate copyback() 43*7c478bd9Sstevel@tonic-gate { 44*7c478bd9Sstevel@tonic-gate register int i, n; 45*7c478bd9Sstevel@tonic-gate int new = 0; 46*7c478bd9Sstevel@tonic-gate mode_t mailmode, omask; 47*7c478bd9Sstevel@tonic-gate struct stat stbuf; 48*7c478bd9Sstevel@tonic-gate void (*hstat)(), (*istat)(), (*qstat)(); 49*7c478bd9Sstevel@tonic-gate 50*7c478bd9Sstevel@tonic-gate istat = signal(SIGINT, SIG_IGN); 51*7c478bd9Sstevel@tonic-gate qstat = signal(SIGQUIT, SIG_IGN); 52*7c478bd9Sstevel@tonic-gate hstat = signal(SIGHUP, SIG_IGN); 53*7c478bd9Sstevel@tonic-gate lock(my_name); 54*7c478bd9Sstevel@tonic-gate stat(mailfile, &stbuf); 55*7c478bd9Sstevel@tonic-gate mailmode = stbuf.st_mode; 56*7c478bd9Sstevel@tonic-gate 57*7c478bd9Sstevel@tonic-gate /* 58*7c478bd9Sstevel@tonic-gate * Has new mail arrived? 59*7c478bd9Sstevel@tonic-gate */ 60*7c478bd9Sstevel@tonic-gate if (stbuf.st_size != let[nlet].adr) { 61*7c478bd9Sstevel@tonic-gate malf = doopen(mailfile, "r", E_FILE); 62*7c478bd9Sstevel@tonic-gate fseek(malf, let[nlet].adr, 0); 63*7c478bd9Sstevel@tonic-gate fclose(tmpf); 64*7c478bd9Sstevel@tonic-gate tmpf = doopen(lettmp, "a", E_TMP); 65*7c478bd9Sstevel@tonic-gate /* 66*7c478bd9Sstevel@tonic-gate * Append new mail assume only one new letter 67*7c478bd9Sstevel@tonic-gate */ 68*7c478bd9Sstevel@tonic-gate if (!copystream(malf, tmpf)) { 69*7c478bd9Sstevel@tonic-gate fclose(malf); 70*7c478bd9Sstevel@tonic-gate tmperr(); 71*7c478bd9Sstevel@tonic-gate done(0); 72*7c478bd9Sstevel@tonic-gate } 73*7c478bd9Sstevel@tonic-gate fclose(malf); 74*7c478bd9Sstevel@tonic-gate fclose(tmpf); 75*7c478bd9Sstevel@tonic-gate tmpf = doopen(lettmp, "r+", E_TMP); 76*7c478bd9Sstevel@tonic-gate if (nlet == (MAXLET-2)) { 77*7c478bd9Sstevel@tonic-gate errmsg(E_SPACE, ""); 78*7c478bd9Sstevel@tonic-gate done(0); 79*7c478bd9Sstevel@tonic-gate } 80*7c478bd9Sstevel@tonic-gate let[++nlet].adr = stbuf.st_size; 81*7c478bd9Sstevel@tonic-gate new = 1; 82*7c478bd9Sstevel@tonic-gate } 83*7c478bd9Sstevel@tonic-gate 84*7c478bd9Sstevel@tonic-gate /* 85*7c478bd9Sstevel@tonic-gate * Copy mail back to mail file 86*7c478bd9Sstevel@tonic-gate */ 87*7c478bd9Sstevel@tonic-gate omask = umask(0117); 88*7c478bd9Sstevel@tonic-gate 89*7c478bd9Sstevel@tonic-gate /* 90*7c478bd9Sstevel@tonic-gate * The invoker must own the mailfile being copied to 91*7c478bd9Sstevel@tonic-gate */ 92*7c478bd9Sstevel@tonic-gate if ((stbuf.st_uid != my_euid) && (stbuf.st_uid != my_uid)) { 93*7c478bd9Sstevel@tonic-gate errmsg(E_OWNR, ""); 94*7c478bd9Sstevel@tonic-gate done(0); 95*7c478bd9Sstevel@tonic-gate } 96*7c478bd9Sstevel@tonic-gate 97*7c478bd9Sstevel@tonic-gate /* 98*7c478bd9Sstevel@tonic-gate * If user specified the '-f' option we dont do 99*7c478bd9Sstevel@tonic-gate * the routines to handle :saved files. 100*7c478bd9Sstevel@tonic-gate * As we would(incorrectly) restore to the user's 101*7c478bd9Sstevel@tonic-gate * mailfile upon next execution! 102*7c478bd9Sstevel@tonic-gate */ 103*7c478bd9Sstevel@tonic-gate if (flgf) { 104*7c478bd9Sstevel@tonic-gate (void) strlcpy(savefile, mailfile, sizeof (savefile)); 105*7c478bd9Sstevel@tonic-gate } else { 106*7c478bd9Sstevel@tonic-gate cat(savefile, mailsave, my_name); 107*7c478bd9Sstevel@tonic-gate } 108*7c478bd9Sstevel@tonic-gate 109*7c478bd9Sstevel@tonic-gate if ((malf = fopen(savefile, "w")) == NULL) { 110*7c478bd9Sstevel@tonic-gate if (!flgf) { 111*7c478bd9Sstevel@tonic-gate errmsg(E_FILE, "Cannot open savefile"); 112*7c478bd9Sstevel@tonic-gate } else { 113*7c478bd9Sstevel@tonic-gate errmsg(E_FILE, "Cannot re-write the alternate file"); 114*7c478bd9Sstevel@tonic-gate } 115*7c478bd9Sstevel@tonic-gate done(0); 116*7c478bd9Sstevel@tonic-gate } 117*7c478bd9Sstevel@tonic-gate 118*7c478bd9Sstevel@tonic-gate if (chown(savefile, mf_uid, mf_gid) == -1) { 119*7c478bd9Sstevel@tonic-gate errmsg(E_FILE, "Cannot chown savefile"); 120*7c478bd9Sstevel@tonic-gate done(0); 121*7c478bd9Sstevel@tonic-gate } 122*7c478bd9Sstevel@tonic-gate umask(omask); 123*7c478bd9Sstevel@tonic-gate n = 0; 124*7c478bd9Sstevel@tonic-gate 125*7c478bd9Sstevel@tonic-gate for (i = 0; i < nlet; i++) { 126*7c478bd9Sstevel@tonic-gate /* 127*7c478bd9Sstevel@tonic-gate * Note: any action other than an undelete, or a 128*7c478bd9Sstevel@tonic-gate * plain read causes the letter acted upon to be 129*7c478bd9Sstevel@tonic-gate * deleted 130*7c478bd9Sstevel@tonic-gate */ 131*7c478bd9Sstevel@tonic-gate if (let[i].change == ' ') { 132*7c478bd9Sstevel@tonic-gate if (copylet(i, malf, ORDINARY) == FALSE) { 133*7c478bd9Sstevel@tonic-gate errmsg(E_FILE, "Cannot copy mail to savefile"); 134*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "%s: A copy of your " 135*7c478bd9Sstevel@tonic-gate "mailfile is in '%s'\n", program, lettmp); 136*7c478bd9Sstevel@tonic-gate done(1); /* keep temp file */ 137*7c478bd9Sstevel@tonic-gate } 138*7c478bd9Sstevel@tonic-gate n++; 139*7c478bd9Sstevel@tonic-gate } 140*7c478bd9Sstevel@tonic-gate } 141*7c478bd9Sstevel@tonic-gate fclose(malf); 142*7c478bd9Sstevel@tonic-gate 143*7c478bd9Sstevel@tonic-gate if (!flgf) { 144*7c478bd9Sstevel@tonic-gate if (unlink(mailfile) != 0) { 145*7c478bd9Sstevel@tonic-gate errmsg(E_FILE, "Cannot unlink mailfile"); 146*7c478bd9Sstevel@tonic-gate done(0); 147*7c478bd9Sstevel@tonic-gate } 148*7c478bd9Sstevel@tonic-gate chmod(savefile, mailmode); 149*7c478bd9Sstevel@tonic-gate #ifdef SVR4 150*7c478bd9Sstevel@tonic-gate if (rename(savefile, mailfile) != 0) { 151*7c478bd9Sstevel@tonic-gate errmsg(E_FILE, "Cannot rename savefile to mailfile"); 152*7c478bd9Sstevel@tonic-gate done(0); 153*7c478bd9Sstevel@tonic-gate } 154*7c478bd9Sstevel@tonic-gate #else 155*7c478bd9Sstevel@tonic-gate if (link(savefile, mailfile) != 0) { 156*7c478bd9Sstevel@tonic-gate errmsg(E_FILE, "Cannot link savefile to mailfile"); 157*7c478bd9Sstevel@tonic-gate done(0); 158*7c478bd9Sstevel@tonic-gate } 159*7c478bd9Sstevel@tonic-gate if (unlink(savefile) != 0) { 160*7c478bd9Sstevel@tonic-gate errmsg(E_FILE, "Cannot unlink save file"); 161*7c478bd9Sstevel@tonic-gate done(0); 162*7c478bd9Sstevel@tonic-gate } 163*7c478bd9Sstevel@tonic-gate #endif 164*7c478bd9Sstevel@tonic-gate } 165*7c478bd9Sstevel@tonic-gate 166*7c478bd9Sstevel@tonic-gate /* 167*7c478bd9Sstevel@tonic-gate * Empty mailbox? 168*7c478bd9Sstevel@tonic-gate */ 169*7c478bd9Sstevel@tonic-gate if (n == 0) { 170*7c478bd9Sstevel@tonic-gate delempty(stbuf.st_mode, mailfile); 171*7c478bd9Sstevel@tonic-gate } 172*7c478bd9Sstevel@tonic-gate 173*7c478bd9Sstevel@tonic-gate if (new && !flgf) { 174*7c478bd9Sstevel@tonic-gate printf("New mail arrived\n"); 175*7c478bd9Sstevel@tonic-gate } 176*7c478bd9Sstevel@tonic-gate 177*7c478bd9Sstevel@tonic-gate unlock(); 178*7c478bd9Sstevel@tonic-gate (void) signal(SIGINT, istat); 179*7c478bd9Sstevel@tonic-gate (void) signal(SIGQUIT, qstat); 180*7c478bd9Sstevel@tonic-gate (void) signal(SIGHUP, hstat); 181*7c478bd9Sstevel@tonic-gate } 182