root/usr/src/cmd/mail/copymt.c
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (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) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
 */

/*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/*        All Rights Reserved   */

/*
    NAME
        copymt - copy mail (f1) to temp (f2)

    SYNOPSIS
        void copymt(FILE *f1, FILE *f2)

    DESCRIPTION
        The mail messages in /var/mail are copied into
        the temp file. The file pointers f1 and f2 point
        to the files, respectively.
*/
#include "mail.h"

void copymt(f1, f2)
register FILE *f1, *f2;
{
        static char pn[] = "copymt";
        long nextadr;
        int n, newline = 1;
        int StartNewMsg = TRUE;
        int ToldUser = FALSE;
        int mesg = 0;
        int ctf = FALSE;                /* header continuation flag */
        long clen = (long)0;
        int hdr = 0;
        int cflg = 0;                   /* found Content-length in header */

        Dout(pn, 0,"entered\n");
        if (!let[1].adr) {
                nlet = nextadr = 0;
                let[0].adr = 0;
                let[0].text = TRUE;     /* until proven otherwise.... */
                let[0].change = ' ';
        } else {
                nextadr = let[nlet].adr;
        }

        while ((n = getaline(line, sizeof line, f1)) > 0) {
                if (!newline) {
                        goto putout;
                } else if ((hdr = isheader (line, &ctf)) == FALSE) {
                        ctf = FALSE;    /* next line can't be cont. */
                }
                if (!hdr && cflg) {     /* nonheader, Content-length seen */
                        if (clen < n) { /* read too much */
                                /* NB: this only can happen if the content-length
                                 * says a smaller number than what's seen on the
                                 * first non-header line.
                                 */
                                if (let[nlet-1].text == TRUE) {
                                        let[nlet-1].text = istext((unsigned char*)line,clen);
                                    Dout(pn, 0, "1, let[%d].text = %s\n",
                                           nlet-1,
                                           (let[nlet-1].text ? "TRUE":"FALSE"));
                                }
                                if (fwrite(line,1,(int)clen,f2) != clen) {
                                        fclose(f1); fclose(f2);
                                        errmsg(E_FILE,
                                                "Write error in copymt()");
                                        done(0);
                                }
                                nextadr += clen;
                                n -= clen;
                                strmove (line, line+clen);
                                cflg = 0;
                                ctf = FALSE;
                                hdr = isheader(line, &ctf);
                                goto dohdr;
                        }
                        /* here, clen >= n */
                        if (n == 1 && line[0] == '\n'){ /* leading empty line */
                                clen++;         /* cheat */
                        }
                        nextadr += clen;
                        for (;;) {
                                if (let[nlet-1].text == TRUE) {
                                        let[nlet-1].text = istext((unsigned char*)line,n);
                                  Dout(pn, 0, "2, let[%d].text = %s\n",
                                        nlet-1,
                                        (let[nlet-1].text ? "TRUE" : "FALSE"));
                                }
                                if (fwrite(line,1,n,f2) != n) {
                                        fclose(f1); fclose(f2);
                                        errmsg(E_FILE,
                                                "Write error in copymt()");
                                        done(0);
                                }
                                clen -= n;
                                if (clen <= 0) {
                                        break;
                                }
                                n = clen < sizeof line ? clen : sizeof line;
                                if ((n = fread (line, 1, n, f1)) <= 0) {
                                    fprintf(stderr,
                "%c%s:\tYour mailfile was found to be corrupted.\n",
                                                BELL, program);
                                    fprintf(stderr,
                                        "\t(Unexpected end-of-file).\n");
                                    fprintf(stderr,
                                        "\tMessage #%d may be truncated.%c\n\n",
                                                nlet, BELL);
                                        nextadr -= clen;
                                        clen = 0; /* stop the loop */
                                }
                        }
                        /* All done, go to top for next message */
                        cflg = 0;
                        StartNewMsg = TRUE;
                        continue;
                }

dohdr:
                switch (hdr) {
                case H_FROM:
                        if(nlet >= (MAXLET-2)) {
                                if (!mesg) {
                                        fprintf(stderr,"%s: Too many letters, overflowing letters concatenated\n\n",program);
                                        mesg++;
                                }
                        } else {
                                let[nlet++].adr = nextadr;
                                let[nlet].text = TRUE;
                                let[nlet].change = ' ';
                        }
                        Dout(pn, 5, "setting StartNewMsg to FALSE\n");
                        StartNewMsg = FALSE;
                        ToldUser = FALSE;
                        break;
                case H_CLEN:
                        if (cflg) {
                                break;
                        }
                        cflg = TRUE;    /* mark for clen processing */
                        clen = atol (strpbrk (line, ":")+1);
                        break;
                default:
                        break;
                }

putout:
                if (nlet == 0) {
                        fclose(f1);
                        fclose(f2);
                        errmsg(E_FILE,"mailfile does not begin with a 'From' line");
                        done(0);
                }
                nextadr += n;
                if (let[nlet-1].text == TRUE) {
                        let[nlet-1].text = istext((unsigned char*)line,n);
                        Dout(pn, 5,"3, let[%d].text = %s\n",
                                nlet-1, (let[nlet-1].text ? "TRUE" : "FALSE"));
                }
                if (fwrite(line,1,n,f2) != n) {
                        fclose(f1);
                        fclose(f2);
                        errmsg(E_FILE,"Write error in copymt()");
                        done(0);
                }
                if (line[n-1] == '\n') {
                        newline = 1;
                        if (n == 1) { /* Blank line. Skip StartNewMsg */
                                      /* check below                  */
                                continue;
                        }
                } else {
                        newline = 0;
                }
                if (StartNewMsg == TRUE && ToldUser == FALSE) {
                        fprintf(stderr,
                             "%c%s:\tYour mailfile was found to be corrupted\n",
                             BELL, program);
                        fprintf(stderr, "\t(Content-length mismatch).\n");
                        fprintf(stderr,"\tMessage #%d may be truncated,\n",
                             nlet);
                        fprintf(stderr,
                            "\twith another message concatenated to it.%c\n\n",
                            BELL);
                        ToldUser = TRUE;
                }
        }

        /*
                last plus 1
        */
        let[nlet].adr = nextadr;
        let[nlet].change = ' ';
        let[nlet].text = TRUE;
}