root/usr/src/cmd/mail/cksaved.c
/*
 * 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   */

/*
 *  NAME
 *      cksaved - check for an orphaned save file
 *
 *  SYNOPSIS
 *      void cksaved(char *user)
 *
 *  DESCRIPTION
 *      cksaved() looks to see if there is a saved-mail file sitting
 *      around which should be reinstated. These files should be sitting
 *      around only in the case of a crash during rewriting a mail message.
 *
 *      The strategy is simple: if the file exists it is appended to
 *      the end of $MAIL.  It is better that a user potentially sees the
 *      mail twice than to lose it.
 *
 *      If $MAIL doesn't exist, then a simple rename() will suffice.
 */

#include "mail.h"
void
cksaved(user)
char    *user;
{
        struct stat stbuf;
        char command[512];
        char save[MAXFILENAME], mail[MAXFILENAME];

        cat(mail, maildir, user);
        cat(save, mailsave, user);

        /*
         *      If no save file, or size is 0, return.
         */
        if ((stat(save, &stbuf) != 0) || (stbuf.st_size == 0))
                return;

        /*
         *      Ok, we have a savefile. If no mailfile exists,
         *      then we want to restore to the mailfile,
         *      else we append to the mailfile.
         */
        lock(user);
        if (stat(mail, &stbuf) != 0) {
                /*
                 *      Restore from the save file by linking
                 *      it to $MAIL then unlinking save file
                 */
                chmod(save, MFMODE);
#ifdef SVR3
                if (link(save, mail) != 0) {
                        unlock();
                        perror("Restore failed to link to mailfile");
                        return;
                }

                if (unlink(save) != 0) {
                        unlock();
                        perror("Cannot unlink saved file");
                        return;
                }
#else
                if (rename(save, mail) != 0) {
                        unlock();
                        perror("Cannot rename saved file");
                        return;
                }
#endif

                (void) snprintf(command, sizeof (command),
                    "echo \"Your mailfile was just restored by the mail "
                    "program.\nPermissions of your mailfile are set "
                    "to 0660.\"| mail %s", user);
        }

        else {
                FILE *Istream, *Ostream;
                if ((Ostream = fopen(mail, "a")) == NULL) {
                        (void) fprintf(stderr,
                            "%s: Cannot open file '%s' for output\n",
                        program, mail);
                        unlock();
                        return;
                }
                if ((Istream = fopen(save, "r")) == NULL) {
                        (void) fprintf(stderr, "%s: Cannot open saved "
                            "file '%s' for reading\n", program, save);
                        fclose(Ostream);
                        unlock();
                        return;
                }
                copystream(Istream, Ostream);
                fclose(Istream);
                fclose(Ostream);

                if (unlink(save) != 0) {
                        perror("Unlink of save file failed");
                        return;
                }

                (void) snprintf(command, sizeof (command),
                    "echo \"Your mail save file has just been appended "
                    "to your mail box by the mail program.\" | mail %s", user);
        }

        /*
         *      Try to send mail to the user whose file
         *      is being restored.
         */
        unlock();
        systm(command);
}