/* * 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; }