/*
 *	Copyright (C) 1988  TGV, Incorporated
 *	Deliver mail (system independent)
 *
 */
#include "address.h"
#include <stdio.h>
#include <signal.h>
#include <ctype.h>
#include "vax-mm.h"


/*
 *	Deliver to a file
 */
Deliver_File(Address,Header,Header_Length,Text,Text_Length)
register struct Address *Address;
char *Header;
int Header_Length;
char *Text;
int Text_Length;
{
	register char *cp;
	register int i;
	int Text_FD,Header_FD;
	struct Msg Msg;
	struct Header_File_Header Header_File_Header;
	char Header_Line[128];
	char Header_Name[128];

	/*
	 *	Set the message arrival date (now)
	 */
	Msg.Date = time(0);
	/*
	 *	Set the flags (all 0)
	 */
	Msg.Flags = 0;
	Msg.Keyword_Flags = 0;
	/*
	 *	Calculate the message size and REAL size
	 *	(newlines count as 2 characters for TOPS-20 message size!)
	 */
	Msg.Real_Size = Header_Length + Text_Length;
	Msg.Size = Msg.Real_Size;
	i = Header_Length;
	cp = Header;
	while(--i >= 0) if (*cp++ == '\n') Msg.Size++;
	i = Text_Length;
	cp = Text;
	while(--i >= 0) if (*cp++ == '\n') Msg.Size++;
	/*
	 *	Header pointer is zero (used at run time only)
	 */
	Msg.Header = 0;
	/*
	 *	Generate the MM header line
	 */
	cp = (char *)ctime(&Msg.Date);
	sprintf(Header_Line,
		"%2.2s-%3.3s-%2.2s %8.8s-%s,%d;000000000000\n",
		cp+8,
		cp+4,
		cp+22,
		cp+11,
		Timezone_String(0),
		Msg.Size);
	Msg.Header_Size = strlen(Header_Line);
	Msg.Real_Size += Msg.Header_Size;
	/*
	 *	Get the body offset
	 */
	Msg.Body_Offset = Msg.Header_Size + Header_Length;
	/*
	 *	Get the From: offset
	 */
	i = Header_Length;
	cp = Header;
	while(i > 0) {
		/*
		 *	Is this "From:" ??
		 */
		if ((cp[0] == 'F') &&
		    (cp[1] == 'r') &&
		    (cp[2] == 'o') &&
		    (cp[3] == 'm') &&
		    (cp[4] == ':')) {cp += 6; break;}
		/*
		 *	No skip to beyond the next '\n'
		 */
		while(--i > 0)
			if (*cp++ == '\n') break;
	}
	Msg.From_Offset = Msg.Header_Size + (cp - Header);
	Msg.From_Size = 0;
	while(--i >= 0) {
		if (*cp++ == '\n')
			if ((*cp != ' ') && (*cp != '\t')) break;
		Msg.From_Size++;
	}
	/*
	 *	Get the Subject: offset
	 */
	i = Header_Length;
	cp = Header;
	while(i > 0) {
		/*
		 *	Is this "Subject:" ??
		 */
		if ((cp[0] == 'S') &&
		    (cp[1] == 'u') &&
		    (cp[2] == 'b') &&
		    (cp[3] == 'j') &&
		    (cp[4] == 'e') &&
		    (cp[5] == 'c') &&
		    (cp[6] == 't') &&
		    (cp[7] == ':')) {cp += 9; break;}
		/*
		 *	No skip to beyond the next '\n'
		 */
		while(--i > 0)
			if (*cp++ == '\n') break;
	}
	Msg.Subj_Offset = Msg.Header_Size + (cp - Header);
	Msg.Subj_Size = 0;
	while(--i >= 0) {
		if (*cp++ == '\n')
			if ((*cp != ' ') && (*cp != '\t')) break;
		Msg.Subj_Size++;
	}
	/*
	 *	Now we can deliver the message to all the files
	 */
	while(Address) {
		Text_FD = -1;
		Header_FD = -1;
		/*
		 *	Print the 1st part of the delivery message
		 */
		printf(" %s --",Address->User);
		fflush(stdout);
		/*
		 *	Construct the header file filename
		 */
		Header_File_Name(Address->User,Header_Name);
		/*
		 *	Try to open the text file
		 */
		Text_FD = Xopen(Address->User,2);
		if (Text_FD < 0) {
			/*
			 *	Create it
			 */
			Text_FD = Xcreat(Address->User,Mail_File_Mode,0);
			if (Text_FD < 0) {
				printf("Couldn't create text file\n");
				goto Next;
			}
			Header_FD = Xcreat(Header_Name,Mail_File_Mode,0);
			if (Header_FD >= 0) {
				Header_File_Header.Last_Read = 0;
				Header_File_Header.Number_Of_Messages = 0;
				Header_File_Header.Size_Of_Text_File = 0;
				write(Header_FD,
				      &Header_File_Header,
				      sizeof(Header_File_Header));
			}
		} else {
			lseek(Text_FD,0,2);
		}
		/*
		 *	Try to open the header file
		 */
		if (Header_FD < 0) {
			Header_FD = open(Header_Name,2);
			read(Header_FD,
			     &Header_File_Header,
			     sizeof(Header_File_Header));
			lseek(Header_FD,0,2);
		}
		/*
		 *	Append to the text and header files
		 */
		write(Text_FD,Header_Line,Msg.Header_Size);
		write(Text_FD,Header,Header_Length);
		write(Text_FD,Text,Text_Length);
		if (Header_FD >= 0) {
			write(Header_FD,&Msg,sizeof(Msg));
			/*
			 *	Update the header
			 */
			Header_File_Header.Number_Of_Messages++;
			Header_File_Header.Size_Of_Text_File += Msg.Real_Size;
			lseek(Header_FD,0,0);
			write(Header_FD,
			      &Header_File_Header,
			      sizeof(Header_File_Header));
			close(Header_FD);
		}
		close(Text_FD);
		/*
		 *	OK
		 */
		printf(" ok\n");
		/*
		 *	Next file
		 */
Next:		Address = Address->Next_Address;
	}
}
