/* MailServer by Juha Tuominen && Pasi Ojala */

#include <exec/types.h>
#include <libraries/dos.h>
#include <proto/dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#include "/lib/users.h"
#include "mail.h"

#define VERSION 		"mailserver 1.16"
#define COPYRIGHT 		"Copyright 1991 Digital Design, Inc.\n"
#define UPDATED 		"2.12.95"
#define MAXMSGS			128


char *vers="\0$VER: "VERSION" ("UPDATED")\n";

char	thismachine[80]="test.fuu.bar",
		passwdfile[80]="AXsh:etc/passwd",
		mailhome[80]="AXsh:usr/spool/mail",
		organization[80]="AXsh test system",
		Routetable[MAXLINELEN]="AXsh:usr/spool/mail/Routetable",
		Aliasfile[MAXLINELEN]="AXsh:usr/spool/mail/Mailaliases",
		Spooldir[MAXLINELEN]="AXsh:usr/spool/outgoing/%s/",
		Timezone[10]="GMT";

void parsefrom(char *emailaddr,char *str);
void parsefrom(char *emailaddr,char *str)
{
	int i=0,j=0,lmode=1;

	while(str[i])
	{
		switch(str[i])
		{
		case '\"':
			break;
		case '(':
			lmode=0;
			break;
		case ')':
			lmode=1;
			break;
		case '<':
			j=0;
			break;
		case '>':
			emailaddr[j]='\0';
			return;
		default:
			if(lmode)
				emailaddr[j++]=str[i];
		}
		i++;
	}
	emailaddr[j]='\0';
	i=0;
	while(emailaddr[i] && emailaddr[i]==' ')
		i++;
	if(i)
		strcpy(emailaddr,emailaddr+i);	/* remove leading spaces */
	i=0;
	while(emailaddr[i] && emailaddr[i]!=' ')
		i++;
	emailaddr[i]='\0';			/* take only first word */
}

void ReadConfig(void);

void ReadConfig(void)
{	FILE	*fp;
	char	thisline[80],nextline[80];

	if(!(fp=fopen("AXsh:etc/rc","r")))
	{
		printf("\aUnable to find configuration file AXsh:etc/rc\n");
		exit(0);
	}
	while(!feof(fp))
	{
		if(fgets(thisline,80,fp)==0)
			break;
		if(strlen(thisline)>1)
			thisline[strlen(thisline)-1]=0;
		if(thisline[0]=='%')
		{
			fgets(nextline,80,fp);
			nextline[strlen(nextline)-1]=0;
			if(!strnicmp("%passwdfile:",thisline,12))
				strncpy(passwdfile,nextline,80);
			if(!strnicmp("%organization:",thisline,14))
				strcpy(organization,nextline);
			if(!strnicmp("%thismachine:",thisline,13))
				strcpy(thismachine,nextline);
			if(!strnicmp("%spooldir:",thisline,10))
				strcpy(Spooldir,nextline);
			if(!strnicmp("%timezone:",thisline,10))
			{
				strncpy(Timezone,nextline,9);
				Timezone[9]=0;
			}
		}
	}
	fclose(fp);
	if(fp=fopen("AXsh:etc/rc.mail","rb"))
	{
		while(!feof(fp))
		{
			if(fgets(thisline,80,fp)==0)
				break;
			if(thisline[0]=='%')
			{
				fgets(nextline,80,fp);
				nextline[strlen(nextline)-1]=0;

				if(!strnicmp("%mailhome:",thisline,10))
					strcpy(mailhome,nextline);
				if(!strnicmp("%routetable:",thisline,12))
					strcpy(Routetable,nextline);
				if(!strnicmp("%aliasfile:",thisline,11))
					strcpy(Aliasfile,nextline);
			}
		}
		fclose(fp);
	}
}


void main(int argc, char *argv[])
{	FILE	*fp,*fp2;
	char	thisline[MAXLINELEN],temp[MAXLINELEN],mailfile[MAXNAMELEN],aika[MAXNAMELEN],
			sender[MAXNAMELEN],receiver[MAXNAMELEN],realname[MAXNAMELEN],cc[MAXLINELEN];
	int		count=0,i,j,mode;

	setvbuf(stdout,NULL,_IONBF,0);
	ReadConfig();
	if(argc==2)
		strcpy(mailfile,argv[1]);
	else
		sprintf(mailfile,"%s%s",mailhome,thismachine);

	if(fp=fopen(mailfile,"r"))
	{
		sprintf(temp,"T:mailserver-message");
		fp2=fopen(temp,"wb");
		mode=1;	/* search for end of the header */
		sender[0]=0;
		receiver[0]=0;
		realname[0]=0;
		cc[0]=0;

		while(!feof(fp))
		{
			if(fgets(thisline,MAXNAMELEN-1,fp)==0)
				break;
			if(feof(fp))
				break;

			count++;
			if(mode==0)	/* message body or between :-) */
			{
				if( !strnicmp(thisline,"From ",5))
				{
					if(fp2)
					{
						fclose(fp2);
printf("%s -> %s,%s\n",sender,receiver,cc);

						delivermessage(temp,sender,realname,receiver,cc,-1,0);

						DeleteFile(temp);
						count=0;
					}

					fp2=fopen(temp,"wb");
					sender[0]=0;
					realname[0]=0;
					receiver[0]=0;
					cc[0]=0;
					mode=1;

					if(!strnicmp(thisline,"From ",5))
					{
						if(fp2)
						{
							fputs(thisline,fp2);
							get_time(aika);
							fprintf(fp2,"Received: by %s at %s",thismachine,aika);
						}
					}
					else
						if(fp2)
							fputs(thisline,fp2);
				}
				else
					if(fp2)
						fputs(thisline,fp2);
			}
			else
			if(mode==1)
			{
				if(thisline[0]=='\n' || !strcmp(thisline,"."))	/* end of header/message */
					mode=0;

				if(!strnicmp("From: ",thisline,6))
				{
					strncpy(sender,thisline+6,79);
					j=6;
					while(thisline[j]==' ' || thisline[j]=='\t')
						j++;
					if(thisline[j]=='\"')
					{
						/*  "Real Name" <account@host.domain> */
						i=0;
						j++;
						while(thisline[j] && thisline[j]!='\"')
						{
							realname[i++] = thisline[j++];
						}
						realname[i] = '\0';
						while(thisline[j] && thisline[j]!='<')
							j++;
						i=0;
						j++;
						while(thisline[j] && thisline[j]!='>')
						{
							sender[i++] = thisline[j++];
						}
						sender[i] = '\0';
					}
					else
					{
						/* account@host.domain (Real Name) */

						while(sender[j] && sender[j]!=' ' && sender[j]!='\t' && sender[j]!='\n')
							j++;
						if(sender[j])
						{
							sender[j]=0;
							strcpy(realname,sender+j+1);
							if(realname[strlen(realname)-1]=='\n')
								realname[strlen(realname)-1]=0;
						}
					}
					if(fp2)
						fputs(thisline,fp2);
				}
				else
				if(!strnicmp("To: ",thisline,4) && !receiver[0])
				{
					parsefrom(receiver,thisline+4);
					/* we take only the login name of the receiver */
					if(fp2)
						fputs(thisline,fp2);
				}
				else
				if(!strnicmp("Cc: ",thisline,4))
				{
					strcpy(cc,thisline+4);
					if(cc[strlen(cc)-1]=='\n')
						cc[strlen(cc)-1]=0;
					if(fp2)
						fputs(thisline,fp2);
				}
				else
				if(!strnicmp(thisline,"From ",5))
				{
					if(fp2)
					{
						fputs(thisline,fp2);
						get_time(aika);
						fprintf(fp2,"Received: by %s at %s",thismachine,aika);
					}
				}
				else
					if(fp2)
						fputs(thisline,fp2);
			}
		}
		if(fp2)
		{
			fclose(fp2);
			if(count)
				delivermessage(temp,sender,realname,receiver,cc,-1,0);
			DeleteFile(temp);
		}
		fclose(fp);

		DeleteFile(mailfile);
	}
	else
		printf("No mail to process\n");
}

