#include "/Mailbox.h"
#include "/protos.h"
#include <libraries/zbbs.h>

enum { ARG_CONFIG, ARG_FILE, ARG_NAME, ARG_POINT, ARG_SCREEN, ARG_PRI, ARGS };
#define ARGTEMPLATE "C=CONFIG/K,F=FILE/K,N=NAME/K/A,POINT/S,S=SCREEN/N,PRI/N"
#define NAME "Z-SORT v1.22  © 1992 by Michael Neuweiler"

#define LEFT 114
#define RIGHT 424
#define MESSAGE 92
#define ERR_MSG 102

struct	ExecBase	*SysBase;
struct	DOSBase	*DOSBase;
struct	Library	*ZBBSBase;
struct	IntuitionBase	*IntuitionBase;
struct	Library	*GadToolsBase;
struct	Library	*GfxBase;
struct	Process	*ThisProcess;
struct	Screen	*Scr;
struct	Window	*Win;

struct	Config	Config;
struct	User		User;
struct	List		BrettDataList;
struct	List		NetzDataList;
struct	List		PointDataList;

APTR	VisualInfo;

VOID SortIn(STRPTR config, STRPTR netfile, STRPTR name, BOOL point_flag);
VOID SortPuffer(STRPTR pufferfile , STRPTR name, BOOL point_flag);
VOID PufferError(STRPTR comment, struct Mail *mail);
VOID PreArc();
VOID WriteHeader(BPTR FH, struct Mail *mail);
VOID WriteMail(BPTR FH, STRPTR mail_buffer, LONG size);
VOID error(STRPTR meldung);
VOID wprintf(struct RastPort *rp, UWORD x, UWORD y, UBYTE *string, ...);
VOID Maps(struct Mail *mail, STRPTR mail_buffer, STRPTR name);

LONG __saveds main()
{
	SysBase = *(struct ExecBase **)4;
	ThisProcess = (struct Process *)SysBase->ThisTask;

	if(!(DOSBase = OpenLibrary("dos.library", 36)))					error("dos.library");
	if(!(ZBBSBase = OpenLibrary("zbbs.library", 0)))				error("zbbs.library");
	if(!(IntuitionBase = OpenLibrary("intuition.library", 36)))	error("intuition.library");
	if(!(GfxBase = OpenLibrary("graphics.library", 0)))			error("graphics.library");
	if(!(GadToolsBase = OpenLibrary("gadtools.library", 0)))		error("gadtools.library");

	if(ThisProcess->pr_CLI)
	{
		UBYTE **ArgArray;

		if(ArgArray = AllocVec(sizeof(UBYTE *) * ARGS, MEMF_ANY | MEMF_CLEAR))
		{
			struct RDArgs *ArgsPtr;

			if(ArgsPtr = AllocVec(sizeof(struct RDArgs), MEMF_ANY | MEMF_CLEAR))
			{
				if(ReadArgs(ARGTEMPLATE, (LONG *)ArgArray, ArgsPtr))
				{
					if(ArgArray[ARG_PRI])	SetTaskPri(FindTask(NULL), *((LONG *)ArgArray[ARG_PRI]));
					if(ArgArray[ARG_SCREEN])	Scr = (struct Screen *)*((LONG *)ArgArray[ARG_SCREEN]);

					if(!Scr)
					{
						ULONG lock;

						lock = LockIBase(0);
						Scr = IntuitionBase->ActiveScreen;
						UnlockIBase(lock);
					}

					if(!(Win = OpenWindowTags(NULL,
						WA_Left,				(Scr->Width - 640) >> 1,
						WA_Top,				(Scr->Height - 158) >> 1,
						WA_Width,			640,
						WA_Height,			158,
						WA_SmartRefresh,	TRUE,
						WA_AutoAdjust,		TRUE,
						WA_Title,			NAME,
						WA_Activate,		TRUE,
						WA_CustomScreen,	Scr,
						TAG_DONE)))	error("Window");

					VisualInfo = (APTR)GetVisualInfo(Scr, TAG_DONE);

					SortIn(ArgArray[ARG_CONFIG], ArgArray[ARG_FILE], ArgArray[ARG_NAME], (BOOL)ArgArray[ARG_POINT]);
				}
				else
				{
					PrintFault(IoErr(), "ZSort");
				}
				FreeArgs(ArgsPtr);
				FreeVec(ArgsPtr);
			}
			FreeVec(ArgArray);
		}
	}

	if(Win)	wprintf(Win->RPort, LEFT, MESSAGE, "%-63.63ls", "Z-Sort beendet");
	Delay(50);

	error(NULL);
}

VOID wprintf(struct RastPort *rp, UWORD x, UWORD y, UBYTE *string, ...)
{
	UBYTE buff[256];

	VSPrintf(buff, string, (STRPTR)(&string + 1));

	Move(rp, x, y+6);
	Text(rp, buff, strlen(buff));
}

VOID error(STRPTR meldung)
{
	if(meldung)	Printf("\33[0m\33[1mERROR: \33[0mKonnte %ls nicht öffnen !\n", meldung);

	if(Win)						CloseWindow(Win);
	if(VisualInfo)				FreeVisualInfo(VisualInfo);
	if(GfxBase)					CloseLibrary(GfxBase);
   if(GadToolsBase)			CloseLibrary(GadToolsBase);
	if(IntuitionBase)			CloseLibrary(IntuitionBase);
	if(ZBBSBase)				CloseLibrary(ZBBSBase);
	if(DOSBase)					CloseLibrary(DOSBase);

	Exit(NULL);
}

VOID SortIn(STRPTR config, STRPTR netfile, STRPTR name, BOOL point_flag)
{
	struct FileInfoBlock *finfo;
	BPTR FH, oldlock, newlock;
	char file[256];

	SetAPen(Win->RPort, 2);
	wprintf(Win->RPort, 15, 18, "Absender..:");
	wprintf(Win->RPort, 15, 28, "Empfänger.:");
	wprintf(Win->RPort, 15, 41, "Betreff...:");
	wprintf(Win->RPort, 15, 51, "Pfad......:");
	wprintf(Win->RPort, 15, 65, "Datum.....:");
	wprintf(Win->RPort, 320, 65, "MsgID.....:");
	wprintf(Win->RPort, 15, 75, "Länge.....:");
	wprintf(Win->RPort, 320, 75, "Typ.......:");

	wprintf(Win->RPort, 15, MESSAGE, "Message...:");
	wprintf(Win->RPort, 15, ERR_MSG, "Last Err..:");
	wprintf(Win->RPort, 15, 116, "Errors....:");
	wprintf(Win->RPort, 320, 116, "Size......:");
	wprintf(Win->RPort, 15, 126, "File......:");
	wprintf(Win->RPort, 320, 126, "Completed.:");
	SetAPen(Win->RPort, 7);

	DrawBevelBox(Win->RPort, LEFT - 8, 15, 520, 45,
			GTBB_Recessed,	TRUE,
			GT_VisualInfo,	VisualInfo,
			TAG_DONE );

	DrawBevelBox(Win->RPort, LEFT - 8, 62, 210, 22,
			GTBB_Recessed,	TRUE,
			GT_VisualInfo,	VisualInfo,
			TAG_DONE );
	DrawBevelBox(Win->RPort, RIGHT - 8, 62, 210, 22,
			GTBB_Recessed,	TRUE,
			GT_VisualInfo,	VisualInfo,
			TAG_DONE );

	DrawBevelBox(Win->RPort, LEFT - 8, MESSAGE - 3, 520, 22,
			GTBB_Recessed,	TRUE,
			GT_VisualInfo,	VisualInfo,
			TAG_DONE );

	DrawBevelBox(Win->RPort, LEFT - 8, 113, 210, 22,
			GTBB_Recessed,	TRUE,
			GT_VisualInfo,	VisualInfo,
			TAG_DONE );
	DrawBevelBox(Win->RPort, RIGHT - 8, 113, 210, 22,
			GTBB_Recessed,	TRUE,
			GT_VisualInfo,	VisualInfo,
			TAG_DONE );

	DrawBevelBox(Win->RPort, 15, 140, 610, 12,
			GTBB_Recessed,	TRUE,
			GT_VisualInfo,	VisualInfo,
			TAG_DONE );

	strupr(name);

	if(!(GetConfig((config ? config : "BBS:Config"), &Config, NULL))) return;

	SPrintf(file, "%lsPoints", Config.mail);
	MakePath(file);

	SPrintf(file, "%lsUnPack", Config.temp);
	MakePath(file);
	if(!(newlock = Lock(file, ACCESS_READ)))	return;
	oldlock = CurrentDir(newlock);

	NewList(&PointDataList);
	SPrintf(file, "%lsPointData", Config.mail);
	GetPointDataList(file, &PointDataList);

	if(!(FH = Open(netfile, MODE_OLDFILE)))
	{
		SPrintf(file, "Konnte %ls nicht öffnen !", netfile);
		wprintf(Win->RPort, LEFT, ERR_MSG, "%-63.63ls", file);
		goto exit;
	}

	FGets(FH, file, 20);
	Close(FH);

	if(iscntrl(file[0]) || iscntrl(file[1]) || iscntrl(file[2]) || iscntrl(file[3]) ||
		strstr(file, "-lh") || strstr(file, "ZOO") || strstr(file, "zoo"))
	{
		struct Point *point;

		wprintf(Win->RPort, LEFT, MESSAGE, "%-63.63ls", "Entpacke File...");

		if(point_flag)
		{
			point = GetHead(&PointDataList);
			while(point && !Compare(point->pointname, name))
			{
				point = GetSucc(point);
			}
		}
		else	point = FindName(&PointDataList, name);

		if(point)
		{
			SPrintf(file, "%ls %ls", point->entpacker, netfile);
			StartPrg(file);
		}
		else
		{
			wprintf(Win->RPort, LEFT, ERR_MSG, "%-63.63ls", "Point in PointData nicht gefunden. Benutze 'LHA x'.");
			DisplayBeep(NULL);
			SPrintf(file, "lha x %ls", netfile);
			StartPrg(file);
		}
	}
	else
	{
		wprintf(Win->RPort, LEFT, MESSAGE, "%-63.63ls", "File ist nicht gepackt");
		SPrintf(file, "copy %ls %lsUnPack", netfile, Config.temp);
		StartPrg(file);
	}

	wprintf(Win->RPort, LEFT, MESSAGE, "%-63.63ls", "Lade Datenfiles...");

	NewList(&BrettDataList);
	SPrintf(file, "%lsBrettData", Config.mail);
	GetBrettDataList(file, &BrettDataList, TRUE);

	NewList(&NetzDataList);
	SPrintf(file, "%lsNetzData", Config.mail);
	GetLineList(file, &NetzDataList);

	SPrintf(file, "%lsPreSort", Config.scripts);
	if(Exists(file))
	{
		SPrintf(file, "Execute %lsPreSort", Config.scripts);
		StartPrg(file);
	}

	if(finfo = AllocVec(sizeof(struct FileInfoBlock), MEMF_ANY | MEMF_CLEAR))
	{
		if(Examine(newlock, finfo) != DOSFALSE)
		{
			ExNext(newlock, finfo);
			while(!IoErr())
			{
				wprintf(Win->RPort, LEFT, 126, "%-25.25ls", finfo->fib_FileName);
				wprintf(Win->RPort, RIGHT, 116, "%-25.25ld", finfo->fib_Size);
				SortPuffer(finfo->fib_FileName, name, point_flag);
				DeleteFile(finfo->fib_FileName);

				Examine(newlock, finfo);
				ExNext(newlock, finfo);
			}
		}
		FreeVec(finfo);
	}

	exit:
	RemBrettDataList(&BrettDataList);
	RemList(&NetzDataList);

	SPrintf(file, "%lsPostSort", Config.scripts);
	if(Exists(file))
	{
		SPrintf(file, "Execute %lsPostSort", Config.scripts);
		StartPrg(file);
	}

	CurrentDir(oldlock);
	UnLock(newlock);
	SPrintf(file, "%lsUnPack", Config.temp);
	DeleteFile(file);
	DeleteFile(netfile);

	PreArc();
	RemList(&PointDataList);
}

VOID SortPuffer(STRPTR pufferfile , STRPTR name, BOOL point_flag)
{
	struct Brett	*brett;
	struct Line		*line;
	struct Mail		*mail;
	struct Point	*point;
	LONG puffer_pos, size, i;
	BOOL more, found;
	STRPTR ptr, mail_buffer, buffer, buf;
	char file[256], temp[256];
	BPTR FH, FH2;
	ULONG __chip Check = 0x5555AAAA;

	puffer_pos = 0;
	size = GetFileSize(pufferfile);

	if(!(FH = Open(pufferfile, MODE_OLDFILE)))
	{
		SPrintf(file, "Konnte %ls nicht öffnen ! Überspringe dieses File.\n", pufferfile);
		wprintf(Win->RPort, LEFT, ERR_MSG, "%-63.63ls", file);
		DisplayBeep(NULL);
		Delay(100);
		return;
	}
	if(!(mail = AllocVec(sizeof(struct Mail), MEMF_ANY | MEMF_CLEAR)))
	{
		Close(FH);
		return;
	}

	do
	{
		FGets(FH, mail->Empfaenger, 80);
label1:
		if(ptr = strchr(mail->Empfaenger, '\r'))	*ptr = 0;
		FGets(FH, mail->Betreff, 80);
		if(ptr = strchr(mail->Betreff, '\r'))		*ptr = 0;
		FGets(FH, mail->Absender, 80);
		if(ptr = strchr(mail->Absender, '\r'))		*ptr = 0;
		FGets(FH, mail->Datum, 20);
		if(ptr = strchr(mail->Datum, '\r'))			*ptr = 0;
		do
		{
			more = FGets(FH, mail->Pfad, 80);
			if(ptr = strchr(mail->Pfad, '\r'))		*ptr = 0;
		} while(!ptr && more);
		FGets(FH, mail->MsgId, 30);
		if(ptr = strchr(mail->MsgId, '\r'))			*ptr = 0;
		FGets(FH, mail->Typ, 40);
		if(ptr = strchr(mail->Typ, '\r'))			*ptr = 0;
		more = FGets(FH, mail->Laenge, 10);
		if(ptr = strchr(mail->Laenge, '\r'))		*ptr = 0;

		if(more)
		{
			puffer_pos += atol(mail->Laenge)	+ strlen(mail->Empfaenger) +
							strlen(mail->Betreff)+ strlen(mail->Absender) +
							strlen(mail->Datum)	+ strlen(mail->Pfad) +
							strlen(mail->MsgId)	+ strlen(mail->Typ) +
							strlen(mail->Laenge)	+ 16;

			wprintf(Win->RPort, RIGHT, 126, "%-25.25ld", puffer_pos);
			SetAfPt(Win->RPort, (UWORD *)&Check, 1);
			RectFill(Win->RPort, 17, 141, 17 + 605 * puffer_pos / size, 150);
			SetAfPt(Win->RPort, NULL, 0);

			wprintf(Win->RPort, LEFT, 18, "%-63.63ls", mail->Absender);
			wprintf(Win->RPort, LEFT, 28, "%-63.63ls", mail->Empfaenger);
			wprintf(Win->RPort, LEFT, 41, "%-63.63ls", mail->Betreff);
			wprintf(Win->RPort, LEFT, 51, "%-63.63ls", mail->Pfad);
			wprintf(Win->RPort, LEFT, 65, "%.2ls-%.2ls-%.2ls %.2ls:%.2ls", &mail->Datum[4], &mail->Datum[2], mail->Datum, &mail->Datum[6], &mail->Datum[8]);
			wprintf(Win->RPort, RIGHT, 65, "%-25.25ls", mail->MsgId);
			wprintf(Win->RPort, LEFT, 75, "%-25.25ls", mail->Laenge);
			wprintf(Win->RPort, RIGHT, 75, "%-25.25ls", mail->Typ);

			wprintf(Win->RPort, LEFT, MESSAGE, "%-63.63ls", "");
			wprintf(Win->RPort, LEFT, ERR_MSG, "%-63.63ls", "");

/* systemnamen in den Pfad einfuegen */
			if(strlen(mail->Pfad))	strcpy(&mail->Pfad[strlen(mail->Pfad)], "!");
			strcpy(&mail->Pfad[strlen(mail->Pfad)], Config.netz_name);

/* systeme wegschneiden, falls zu lang */
			while(strlen(mail->Pfad) > 80)
			{
				if(ptr = strchr(mail->Pfad, '!'))
					strcpy(mail->Pfad, ptr + 1);
				else
					 strcpy(mail->Pfad, Config.netz_name);
			}

/* falls es ein point oder user war */
			SPrintf(file, "ERROR@%ls.ZER", Config.netz_name);
			if(name && point_flag && strcmp(file, mail->Absender))
				SPrintf(mail->Absender, "%ls@%ls.ZER", name, Config.netz_name);

			strupr(mail->Empfaenger);
			strupr(mail->Absender);
			strupr(mail->Pfad);

/* da stand keine laenge drinn => neue mail suchen und zu label1 springen*/
			if(!atol(mail->Laenge))
			{
				wprintf(Win->RPort, LEFT, ERR_MSG, "%-63.63ls", "Fehlerhafter Eintrag, suche nächsten ! (Abfall in BAD)");
				DisplayBeep(NULL);
				Delay(100);
				SPrintf(file, "%lsPoints/BAD", Config.mail);
				if(FH2 = COpen(file))
				{
					Seek(FH2, 0, OFFSET_END);
					WriteHeader(FH2, mail);
				}
				do
				{
					more = FGets(FH, mail->Empfaenger, 80);
					if(FH2)	Write(FH2, mail->Empfaenger, strlen(mail->Empfaenger));

					puffer_pos += strlen(mail->Empfaenger);
				}	while(mail->Empfaenger[0] != '/' && !strchr(mail->Empfaenger, '@') && more);

				if(FH2)	Close(FH2);
				puffer_pos -= strlen(mail->Empfaenger);

				goto label1;
			}

/* die mail einlesen */
			if(!(mail_buffer = AllocVec(atol(mail->Laenge) + 8, MEMF_ANY | MEMF_CLEAR)))
			{
				SPrintf(file, "Konnte nicht %ld Bytes anfordern, Verteile stückweise !", atol(mail->Laenge));
				wprintf(Win->RPort, LEFT, ERR_MSG, "%-63.63ls", file);

				SPrintf(file, "%lsZSort_Temp", Config.temp);
				FH2 = Open(file, MODE_NEWFILE);

				i = atol(mail->Laenge);
				puffer_pos += i;
				while(i > 254)
				{
					FRead(FH, file, 1, 255);
					if(FH2)	Write(FH2, file, 255);

					i -= 255;
				}
				if(i > 0)
				{
					FRead(FH, file, 1, i);
					if(FH2)	Write(FH2, file, i);
				}

				if(FH2)	Close(FH2);
				else
				{
					wprintf(Win->RPort, LEFT, ERR_MSG, "%-63.63ls", "Konnte zu grosse Mail nicht in Temp-File saven.");
					DisplayBeep(NULL);
					Delay(100);
					continue;
				}
			}
			else
			{
				FRead(FH, mail_buffer, 1, atol(mail->Laenge));
			}

			SPrintf(file, "@%ls.ZER", Config.netz_name);
			if(strchr(mail->Empfaenger, '@') && !strstr(mail->Empfaenger, file))
			{
/* private mail in ne andere box. wohin routen ?? */

rout_pmail:
				if(atol(mail->Laenge) > 10240 && !strstr(mail->Absender, "SYSOP"))
				{
					wprintf(Win->RPort, LEFT, ERR_MSG, "%-63.63ls", "Rout-PMail zu gross.");
					if(strcmp(pufferfile, "PufferError"))
						PufferError("war fuer das Netzwerk zu gross (> 10 KBytes) und wurde nicht geroutet.", mail);

					SPrintf(file, "%lsPoints/BAD", Config.mail);
					if(FH2 = COpen(file))
					{
						Seek(FH2, 0, OFFSET_END);
						WriteHeader(FH2, mail);
						WriteMail(FH2, mail_buffer, atol(mail->Laenge));
						Close(FH2);
					}
				}
				else
				{
/* endbox:  wird verglichen mit tmp (kommt aus netz-data) */
/* nextbox: ist der name der box, an die die pmail geroutet werden muss */
/* tmp: der name der end-box aus empfaenger, '.zer' wegschneiden */
					char endbox[41], nextbox[41], tmp[41];

					strcpy(tmp, strchr(mail->Empfaenger, '@') + 1);
					if(ptr = strchr(tmp, '.'))	*ptr = 0;

					line = GetHead(&NetzDataList);
					found = FALSE;
					while(line && !found)
					{
						if(line->text[0] == ' ')
						{
							strcpy(nextbox, &line->text[1]);
							strcpy(endbox, &line->text[1]);
						}
						else
						{
							strcpy(endbox, line->text);
						}
						if(Compare(endbox, tmp))	found = TRUE;

						line = GetSucc(line);
					}

					if(found)
					{
/* wenns gleich ins naechste system geht, boxnamen wegschneiden: '@xxxx.zer' */
						if(!strcmp(endbox, nextbox))
						{
							if(ptr = strchr(mail->Empfaenger, '@'))	*ptr = 0;
						}
						SPrintf(file, "%sPoints/%s", Config.mail, nextbox);
						SPrintf(temp, "Mail an %ls wird geroutet über %ls.", endbox, nextbox);
						wprintf(Win->RPort, LEFT, MESSAGE, "%-63.63ls", temp);
					}
					else
					{
						if(strcmp(pufferfile, "PufferError"))
							PufferError("konnte nicht weitergeleitet werden, da der Ziel-Server nicht bekannt ist.", mail);
						SPrintf(file, "%sPoints/BAD", Config.mail);
					}
					if(mail->Typ[0] == 'F')
					{
						strcpy(mail->Betreff, &mail->Typ[1]);
						strcpy(mail->Typ, "B");
					}

					if(!(FH2 = COpen(file)))
					{
						wprintf(Win->RPort, LEFT, ERR_MSG, "%-63.63ls", "Konnte Point-Puffer nicht (er)öffnen (pmail-routing) !");
						DisplayBeep(NULL);
						Delay(100);
					}
					else
					{
						Seek(FH2, 0L, OFFSET_END);
						WriteHeader(FH2, mail);
						WriteMail(FH2, mail_buffer, atol(mail->Laenge));
						Close(FH2);
					}
				}
			}
			else	if(mail->Empfaenger[0] == '/')
			{
/* oeffentliches brett */
				if(!(brett = FindName(&BrettDataList, &mail->Empfaenger[1])))
				{
					SPrintf(file, "Neuer Eintrag in BrettData : %ls", &mail->Empfaenger[1]);
					wprintf(Win->RPort, LEFT, MESSAGE, "%-63.63ls", file);
					Delay(100);

					SPrintf(file, "%lsBrettData", Config.mail);
					if(!(FH2 = COpen(file)))
						wprintf(Win->RPort, LEFT, ERR_MSG, "%-63.63ls", "Konnte BrettData nicht (er)öffnen.");
					else
					{
						Seek(FH2, 0, OFFSET_END);
						SPrintf(file, "%ls\n0\n\n256\n256\nNeues Brett\n%ls\n#\n", &mail->Empfaenger[1], (point_flag ? "" : name));
						Write(FH2, file, strlen(file));
						Close(FH2);

						if(brett = AllocVec(sizeof(struct Brett), MEMF_ANY | MEMF_CLEAR))
						{
							strcpy(brett->name, &mail->Empfaenger[1]);
							brett->node.ln_Name = brett->name;
							brett->flags = 0;

							if(brett->point_list = AllocVec(sizeof(struct List), MEMF_ANY | MEMF_CLEAR))
							{
								NewList(brett->point_list);
								if(!point_flag)
								{
									if(line = GetLine())
									{
										strcpy(line->text, name);
										AddTail(brett->point_list, line);
									}
								}
								AddTail(&BrettDataList, brett);
							}
							else	FreeVec(brett);
						}
					}
				}

				if(atol(mail->Laenge) > 20480 && !(brett->flags & BFLG_UNLIMITED)
					&& !strstr(mail->Absender, "SYSOP"))
				{
					wprintf(Win->RPort, LEFT, ERR_MSG, "%-63.63ls", "Rout-Mail zu gross.");
					if(strcmp(pufferfile, "PufferError"))
						PufferError("war fuer das Netzwerk zu gross (> 20 KBytes) und wurde nicht mehr weitergeroutet.", mail);
				}
				else
				{
					SPrintf(file, "%ls%ls/", Config.mail, &mail->Empfaenger[1]);
					MakePath(file);

/* rekursions-check mit msgid */
					found = FALSE;
					SPrintf(file, "%ls%ls/Index", Config.mail, &mail->Empfaenger[1]);
					if(buffer = GetFile(file, &i))
					{
						buf = buffer;
						while(!found && buf < buffer + i)
						{
							if(ptr = strchr(buf, '\n'))	buf = ptr + 1;
							if(ptr = strchr(buf, '\n'))	buf = ptr + 1;
							if(ptr = strchr(buf, '\n'))	buf = ptr + 1;
							if(ptr = strchr(buf, '\n'))	buf = ptr + 1;
							if(ptr = strchr(buf, '\n'))	buf = ptr + 1;
							if(ptr = strchr(buf, '\n'))
							{
								*ptr = 0;
								if(!strcmp(buf, mail->MsgId))	found = TRUE;
								buf = ptr + 1;
							}
							if(ptr = strchr(buf, '\n'))	buf = ptr + 1;
							if(ptr = strchr(buf, '\n'))	buf = ptr + 1;
							if(ptr = strchr(buf, '\n'))	buf = ptr + 1;
							else	buf = buffer + i;
						}
						FreeVec(buffer);
					}

					if(!found)
					{
/* in die mailbox-bretter verteilen */
						if(mail->Typ[0] == 'F')
						{
							strcpy(file, &mail->Typ[1]);
							strcpy(mail->Typ, "B");
							wprintf(Win->RPort, LEFT, MESSAGE, "%-63.63ls", mail->Filename);
						}
						else	if(mail->Typ[0] == 'B')
						{
							SPrintf(file, "%.20ls", mail->Betreff);
							while(ptr = strchr(file, ' '))	*ptr = '_';
							while(ptr = strchr(file, ':'))	*ptr = '.';
							while(ptr = strchr(file, '/'))	*ptr = '_';
						}
						else
						{
							SPrintf(file, "%ls%ls/", Config.mail, &mail->Empfaenger[1]);
							FindFreeFile(temp, file);
							SPrintf(file, "%.20ls", &temp[strlen(file)]);
						}
						file[21] = 0;
						strcpy(mail->Filename, file);
						SPrintf(file, "%ls%ls/%ls", Config.mail, &mail->Empfaenger[1], mail->Filename);
						while(Exists(file) && strlen(mail->Filename) < 30)
						{
							strcpy(&file[strlen(file)], ".dup");
							strcpy(&mail->Filename[strlen(mail->Filename)], ".dup");
						}

						SPrintf(file, "%ls%ls/Index", Config.mail, &mail->Empfaenger[1]);
						if(!(FH2 = COpen(file)))
							wprintf(Win->RPort, LEFT, ERR_MSG, "%-63.63ls", "Konnte Index nicht (er)öffnen.");
						else
						{
							Seek(FH2, 0, OFFSET_END);
							SPrintf(file, "%ls\n", mail->Empfaenger);
							Write(FH2, file, strlen(file));
							SPrintf(file, "%ls\n", mail->Betreff);
							Write(FH2, file, strlen(file));
							SPrintf(file, "%ls\n", mail->Absender);
							Write(FH2, file, strlen(file));
							SPrintf(file, "%ls\n", mail->Datum);
							Write(FH2, file, strlen(file));
							SPrintf(file, "%ls\n", mail->Pfad);
							Write(FH2, file, strlen(file));
							SPrintf(file, "%ls\n", mail->MsgId);
							Write(FH2, file, strlen(file));
							SPrintf(file, "%ls\n", mail->Typ);
							Write(FH2, file, strlen(file));
							SPrintf(file, "%ls\n", mail->Laenge);
							Write(FH2, file, strlen(file));
							SPrintf(file, "%ls\n", mail->Filename);
							Write(FH2, file, strlen(file));
							Close(FH2);

							SPrintf(file, "%ls%ls/%ls", Config.mail, &mail->Empfaenger[1], mail->Filename);
							if(!(FH2 = Open(file, MODE_NEWFILE)))
								wprintf(Win->RPort, LEFT, ERR_MSG, "%-63.63ls", "Konnte Data-File nicht generieren.");
							else
							{
								WriteMail(FH2, mail_buffer, atol(mail->Laenge));
								Close(FH2);
							}
						}

/* an die points verteilen */

						if(mail->Typ[0] == 'F')
						{
							strcpy(mail->Betreff, &mail->Typ[1]);
							strcpy(mail->Typ, "B");
						}
						line = GetHead(brett->point_list);
						while(line)
						{
							strcpy(file, name);
							if(point_flag)
							{
								point = GetHead(&PointDataList);
								while(point && !Compare(point->pointname, name))
								{
									point = GetSucc(point);
								}
								if(point)	strcpy(file, point->systemname);
							}
							if(!strcmp(file, line->text))
							{
								line = GetSucc(line);
								continue;
							}
							SPrintf(file, "%ls!", line->text);
							if(strstr(mail->Pfad, file))
							{
								SPrintf(file, "Pfad-DUPE : %ls", line->text);
								wprintf(Win->RPort, LEFT, ERR_MSG, "%-63.63ls", file);
							}
							else
							{
								SPrintf(file, "Routen an : %ls", line->text);
								wprintf(Win->RPort, LEFT, MESSAGE, "%-63.63ls", file);
								Delay(30);

								SPrintf(file, "%sPoints/%s", Config.mail, line->text);
								if(!(FH2 = COpen(file)))
									wprintf(Win->RPort, LEFT, ERR_MSG, "%-63.63ls", "Konnte Point-Puffer nicht (er)öffnen. (Verteilen an Points)");
								else
								{
									Seek(FH2, 0, OFFSET_END);
									WriteHeader(FH2, mail);
									WriteMail(FH2, mail_buffer, atol(mail->Laenge));
									Close(FH2);
								}
							}
							line = GetSucc(line);
						}
					}
					else
					{
						wprintf(Win->RPort, LEFT, ERR_MSG, "%-63.63ls", "DUPE übersprungen !");
					}
				}
			}
			else
			{
/* private mail in diese box */
				SPrintf(file, "@%ls.ZER", Config.netz_name);
				if(ptr = strstr(mail->Absender, file))	*ptr = 0;
				if(ptr = strchr(mail->Empfaenger, '@'))	*ptr = 0;

				if(Compare(mail->Empfaenger, "MAPS"))	Maps(mail, mail_buffer, name);
				else
				{
					found = FALSE;
					point = GetHead(&PointDataList);
					while(point && !found)
					{
						if(Compare(point->pointname, mail->Empfaenger))	found = TRUE;
						else	point = GetSucc(point);
					}

					if(point)
					{
						if(mail->Typ[0] == 'F')
						{
							strcpy(mail->Betreff, &mail->Typ[1]);
							strcpy(mail->Typ, "B");
						}
						SPrintf(file, "PMail an Point %ls (%ls).", point->systemname, point->pointname);
						wprintf(Win->RPort, LEFT, MESSAGE, "%-63.63ls", file);

						SPrintf(file, "%sPoints/%s", Config.mail, point->systemname);
						if(!(FH2 = COpen(file)))
							wprintf(Win->RPort, LEFT, ERR_MSG, "%-63.63ls", "Konnte Point-Puffer nicht (er)öffnen (3).");
						else
						{
							Seek(FH2, 0L, OFFSET_END);
							WriteHeader(FH2, mail);
							WriteMail(FH2, mail_buffer, atol(mail->Laenge));
							Close(FH2);
						}
					}
					else
					{
						User.vertreter[0] = 0;

						SPrintf(file, "%lsUserliste", Config.user);
						if(CheckUser(file, mail->Empfaenger, &User))
						{
							SPrintf(file, "%ls%ls", Config.user, User.number);
							LoadUser(file, &User);
							if(User.vertreter[0] && strchr(User.vertreter, '@'))
							{
								SPrintf(file, "Per Vertreter in nach %ls routen.", User.vertreter);
								wprintf(Win->RPort, LEFT, MESSAGE, "%-63.63ls", file);
								strcpy(mail->Empfaenger, User.vertreter);
								goto rout_pmail;
							}
							else	if(User.vertreter[0] && (point = FindName(&PointDataList, User.vertreter)))
							{
								SPrintf(file, "Per Vertreter an Point %ls weiterleiten.", point->systemname);
								wprintf(Win->RPort, LEFT, MESSAGE, "%-63.63ls", file);

								if(mail->Typ[0] == 'F')
								{
									strcpy(mail->Betreff, &mail->Typ[1]);
									strcpy(mail->Typ, "B");
								}
								SPrintf(file, "%sPoints/%s", Config.mail, point->systemname);
								if(!(FH2 = COpen(file)))
									wprintf(Win->RPort, LEFT, ERR_MSG, "%-63.63ls", "Konnte Point-Puffer nicht (er)öffnen (4).");
								else
								{
									Seek(FH2, 0L, OFFSET_END);
									WriteHeader(FH2, mail);
									WriteMail(FH2, mail_buffer, atol(mail->Laenge));
									Close(FH2);
								}
							}
							else
							{
								if(User.vertreter[0])	wprintf(Win->RPort, LEFT, ERR_MSG, "%-63.63ls", "Fehrlerhafter Vertreter, resp. Point nicht definiert.");
								SPrintf(file, "PMail an User %ls.", User.alias);
								wprintf(Win->RPort, LEFT, MESSAGE, "%-63.63ls", file);
								if(mail->Typ[0] == 'F')
								{
									strcpy(file, &mail->Typ[1]);
									strcpy(mail->Typ, "B");
								}
								else if(mail->Typ[0] == 'B')
								{
									SPrintf(file, "%.20ls", mail->Betreff);
									while(ptr = strchr(file, ' '))	*ptr = '_';
									while(ptr = strchr(file, ':'))	*ptr = '.';
									while(ptr = strchr(file, '/'))	*ptr = '_';
								}
								else
								{
									FindFreeFile(temp, Config.pmail);
									SPrintf(file, "%.20ls", &temp[strlen(Config.pmail)]);
								}
								file[21] = 0;
								strcpy(mail->Filename, file);
								SPrintf(file, "%ls%ls", Config.pmail, mail->Filename);
								while(Exists(file) && strlen(mail->Filename) < 30)
								{
									strcpy(&file[strlen(file)], ".dup");
									strcpy(&mail->Filename[strlen(mail->Filename)], ".dup");
								}

								SPrintf(file, "%lsIndex", Config.pmail);
								if(!(FH2 = COpen(file)))
									wprintf(Win->RPort, LEFT, ERR_MSG, "%-63.63ls", "Konnte Index für PMail nicht (er)öffnen.");
								else
								{
									Seek(FH2, 0L, OFFSET_END);
									SPrintf(file, "%ls\n", mail->Empfaenger);
									Write(FH2, file, strlen(file));
									SPrintf(file, "%ls\n", mail->Betreff);
									Write(FH2, file, strlen(file));
									SPrintf(file, "%ls\n", mail->Absender);
									Write(FH2, file, strlen(file));
									SPrintf(file, "%ls\n", mail->Datum);
									Write(FH2, file, strlen(file));
									SPrintf(file, "%ls\n", mail->Pfad);
									Write(FH2, file, strlen(file));
									SPrintf(file, "%ls\n", mail->MsgId);
									Write(FH2, file, strlen(file));
									SPrintf(file, "%ls\n", mail->Typ);
									Write(FH2, file, strlen(file));
									SPrintf(file, "%ls\n", mail->Laenge);
									Write(FH2, file, strlen(file));
									SPrintf(file, "%ls\n", mail->Filename);
									Write(FH2, file, strlen(file));
									Close(FH2);

									SPrintf(file, "%ls%ls", Config.pmail, mail->Filename);
									if(!(FH2 = Open(file, MODE_NEWFILE)))
										wprintf(Win->RPort, LEFT, ERR_MSG, "%-63.63ls", "Konnte Data-File für PMail nicht generieren.");
									else
									{
										WriteMail(FH2, mail_buffer, atol(mail->Laenge));
										Close(FH2);
									}
								}
							}
						}
						else
						{
							SPrintf(file, "Point/User %ls unbekannt.", mail->Empfaenger);
							wprintf(Win->RPort, LEFT, ERR_MSG, "%-63.63ls", file);
							if(strcmp(pufferfile, "PufferError"))
								PufferError("konnte nicht verschickt werden, da der Empfaenger dem System unbekannt ist.", mail);
						}
					}
				}
			}
			if(mail_buffer)	FreeVec(mail_buffer);
			else
			{
				SPrintf(file, "%lsZSort_Temp", Config.temp);
				DeleteFile(file);
			}
		}
	}	while(more);

	Close(FH);

	SetAPen(Win->RPort, 0);
	RectFill(Win->RPort, 17, 141, 622, 150);
	SetAPen(Win->RPort, 7);
}

VOID PufferError(STRPTR meldung, struct Mail *mail)
{
	struct DateTime date_time;
	BPTR FH;
	LONG size;
	char file[256], date[LEN_DATSTRING], time[LEN_DATSTRING];
	STRPTR buffer;

	date_time.dat_StrDay		= NULL;
	date_time.dat_StrDate	= date;
	date_time.dat_StrTime	= time;
	date_time.dat_Format		= FORMAT_CDN;
	date_time.dat_Flags		= DTB_SUBST;

	DateStamp(&date_time.dat_Stamp);
	DateToStr(&date_time);

	SPrintf(file, "%lsPuffErr_Temp", Config.temp);
	if(FH = Open(file, MODE_NEWFILE))
	{
		FPrintf(FH, " Fehlermeldung von %ls.ZER :\r\n\r\n", Config.netz_name);
		FPrintf(FH, "Deine Mail vom %.2ls-%.2ls-%.2ls  %.2ls:%.2ls mit dem Betreff :\r\n", &mail->Datum[4], &mail->Datum[2], &mail->Datum[0], &mail->Datum[6], &mail->Datum[8]);
		FPrintf(FH, "%ls\r\n", mail->Betreff);
		FPrintf(FH, "an %ls\r\n", mail->Empfaenger);
		FPrintf(FH, "%ls\r\n\r\n", meldung);

		wprintf(Win->RPort, LEFT, MESSAGE, "%-63.63ls", meldung);
		DisplayBeep(NULL);
		Delay(100);

		Close(FH);

		SPrintf(file, "%lsPuffErr_temp", Config.temp);
		if(buffer = GetFile(file, &size))
		{
			SPrintf(file, "%lsUnPack/PufferError", Config.temp);
			if(!(FH = COpen(file)))
				wprintf(Win->RPort, LEFT, ERR_MSG, "%-63.63ls", "Konnte nicht an Error-Puffer anhängen !");
			else
			{
				Seek(FH, 0L, OFFSET_END);
				SPrintf(file, "%ls\r\nFehler: Mail wurde nicht weitergeroutet.\r\nERROR@%ls.ZER\r\n", mail->Absender, Config.netz_name);
				Write(FH, file, strlen(file));
				SPrintf(file, "%.2ls%.2ls%.2ls%.2ls%.2ls\r\n%ls\r\n%02ld.%ld@%ls\r\nT\r\n%ld\r\n", &date[6], &date[3], &date[0], &time[0], &time[3], Config.netz_name, RangeRand(100), RangeRand(1000), Config.netz_name, size);
				Write(FH, file, strlen(file));
				Write(FH, buffer, size);

				Close(FH);
			}
			FreeVec(buffer);
		}
		SPrintf(file, "%lsPuffErr_temp", Config.temp);
		DeleteFile(file);
	}
}

VOID PreArc()
{
	struct FileInfoBlock *entry;
	struct Point *point;
	BPTR lock;
	BOOL err;
	char file[256], file2[256];

	wprintf(Win->RPort, LEFT, MESSAGE, "%-63.63ls", "Pre Arc");
	Delay(50);

	SPrintf(file, "%sPoints", Config.mail);
	if(lock = Lock(file, ACCESS_READ))
	{
		if(entry = AllocVec(sizeof(struct FileInfoBlock), MEMF_ANY | MEMF_CLEAR))
		{
			err = NULL;
			if(Examine(lock, entry) != DOSFALSE)
			{
				while(!err)
				{
					ExNext(lock, entry);
					err = IoErr();
					if(!err && !strstr(entry->fib_FileName, ".PRE"))
					{
						SPrintf(file, "ARC of %ls", entry->fib_FileName);
						wprintf(Win->RPort, LEFT, MESSAGE, "%-63.63ls", file);
						Delay(80);

						point = FindName(&PointDataList, entry->fib_FileName);
						if(point && point->entpacker[0] && point->packer[0])
						{
							SPrintf(file, "%lsPUFFER", Config.temp);
							DeleteFile(file);

							SPrintf(file, "%lsPoints/%ls.PRE", Config.mail, entry->fib_FileName);
							if(Exists(file))
							{
								wprintf(Win->RPort, LEFT, MESSAGE, "%-63.63ls", "extracting...");
								SPrintf(file, "%ls %lsPoints/%ls.PRE %ls", point->entpacker, Config.mail, entry->fib_FileName, Config.temp);
								StartPrg(file);
							}

							wprintf(Win->RPort, LEFT, MESSAGE, "%-63.63ls", "appending...");
							SPrintf(file, "%lsPUFFER", Config.temp);
							SPrintf(file2, "%lsPoints/%ls", Config.mail, entry->fib_FileName);
							Append(file, file2);

							SPrintf(file, "%lsPoints/%ls", Config.mail, entry->fib_FileName);
							DeleteFile(file);
							SPrintf(file, "%lsPoints/%ls.PRE", Config.mail, entry->fib_FileName);
							DeleteFile(file);

							wprintf(Win->RPort, LEFT, MESSAGE, "%-63.63ls", "compressing...");
							SPrintf(file, "%ls %lsPoints/%ls.PRE %lsPUFFER", point->packer, Config.mail, entry->fib_FileName, Config.temp);
							StartPrg(file);

							SPrintf(file, "%lsPUFFER", Config.temp);
							DeleteFile(file);
						}
						else
						{
							wprintf(Win->RPort, LEFT, MESSAGE, "%-63.63ls", "adding...");

							SPrintf(file, "%lsPoints/%ls.PRE", Config.mail, entry->fib_FileName);
							SPrintf(file2, "%lsPoints/%ls", Config.mail, entry->fib_FileName);
							Append(file, file2);

							DeleteFile(file2);
						}

						wprintf(Win->RPort, LEFT, MESSAGE, "%-63.63ls", "done.");
						Delay(30);
					}
				}
			}

			FreeVec(entry);
		}
		UnLock(lock);
	}

	wprintf(Win->RPort, LEFT, MESSAGE, "%-63.63ls", "Pre-Arc beendet");
	Delay(50);
}

VOID WriteHeader(BPTR FH, struct Mail *mail)
{
	char buffer[83];

	SPrintf(buffer, "%ls\r\n", mail->Empfaenger);
	Write(FH, buffer, strlen(buffer));
	SPrintf(buffer, "%ls\r\n", mail->Betreff);
	Write(FH, buffer, strlen(buffer));
	SPrintf(buffer, "%ls\r\n", mail->Absender);
	Write(FH, buffer, strlen(buffer));
	SPrintf(buffer, "%ls\r\n", mail->Datum);
	Write(FH, buffer, strlen(buffer));
	SPrintf(buffer, "%ls\r\n", mail->Pfad);
	Write(FH, buffer, strlen(buffer));
	SPrintf(buffer, "%ls\r\n", mail->MsgId);
	Write(FH, buffer, strlen(buffer));
	SPrintf(buffer, "%ls\r\n", mail->Typ);
	Write(FH, buffer, strlen(buffer));
	SPrintf(buffer, "%ls\r\n", mail->Laenge);
	Write(FH, buffer, strlen(buffer));
}

VOID WriteMail(BPTR FH, STRPTR mail_buffer, LONG size)
{
	if(mail_buffer)	Write(FH, mail_buffer, size);
	else
	{
		BPTR FH2;
		LONG len;
		char file[256];

		SPrintf(file, "%lsZSort_Temp", Config.temp);
		if(FH2 = Open(file, MODE_OLDFILE))
		{
			while(len = Read(FH2, file, 255))
				Write(FH, file, len);

			Close(FH2);
		}
		else
		{
			wprintf(Win->RPort, LEFT, ERR_MSG, "%-63.63ls", "Temp-File konnte nicht eingelesen werden.");
			DisplayBeep(NULL);
			Delay(100);
		}
	}
}

VOID Maps(struct Mail *mail, STRPTR mail_buffer, STRPTR name)
{
	struct Point *point;
	struct Line *line, *line2;
	BOOL write_brettdata, verbose;
	STRPTR buf, ptr;
	char file[256];
	BPTR FH;
	LONG size;

	write_brettdata = FALSE;

	SPrintf(file, "%lsZSort_Temp", Config.temp);
	if(!(FH = Open(file, MODE_NEWFILE)))	return;

	point = GetHead(&PointDataList);
	while(point && !Compare(point->pointname, name))
		point = GetSucc(point);
	if(!point)
	{
		strcpy(mail->Betreff, "Kein Zugriff");
		FPrintf(FH, "FEHLER: Kein Zugriff auf MAPS\r\n");
	}
	else
	{
		strupr(mail->Betreff);
		verbose = (strchr(mail->Betreff, 'V') ? TRUE : FALSE);
		if(strstr(mail->Betreff, "LIST"))
		{
			if(strstr(mail->Betreff, "USER"))
			{
				BPTR FH2;
				BOOL ret;

				strcpy(mail->Betreff, "Re: USER");

				ret = TRUE;
				SPrintf(file, "%lsUserListe", Config.user);
				if(FH2 =  Open(file, MODE_OLDFILE))
				{
					FPrintf(FH, "Alias        Name                 #     Alias        Name                 #\r\n-----------------------------------------------------------------------------\r\n");
					while(FGets(FH2, file, 80))
					{
						if(ptr = strchr(file, '\n'))	*ptr = 0;
						FPrintf(FH, "%-12ls ", file);

						if(FGets(FH2, file, 80))
						{
							if(ptr = strchr(file, '\n'))	*ptr = 0;
							strcpy(&file[strlen(file)], " ");

							if(FGets(FH2, &file[strlen(file)], 80))
							if(ptr = strchr(file, '\n'))	*ptr = 0;
							FPrintf(FH, "%-20ls ", file);
						}

						if(FGets(FH2, file, 80))
						{
							if(ptr = strchr(file, '\n'))	*ptr = 0;
							FPrintf(FH, "%-3ls", file);
						}

						if(ret = !ret)	FPrintf(FH, "\r\n", file);
						else	FPrintf(FH, "   ");
					}
					FPrintf(FH, "\r\n", file);

					Close(FH2);
				}
			}
			else if(strstr(mail->Betreff, "SYSTEME"))
			{
				struct Point *point2;

				strcpy(mail->Betreff, "Re: SYSTEME");

				point2 = GetHead(&PointDataList);
				while(point2)
				{
					if(point2->pointname[0])	SPrintf(file, "%ls (%ls)\r\n", point2->systemname, point2->pointname);
					else	SPrintf(file, "%ls\r\n", point2->systemname);
					Write(FH, file, strlen(file));

					point2 = GetSucc(point2);
				}
			}
			else if(strstr(mail->Betreff, "BRETTER"))
			{
				struct Brett *brett;

				if(strstr(mail->Betreff, "MY"))
				{
					strcpy(mail->Betreff, "Re: LIST MY BRETTER");
					brett = GetHead(&BrettDataList);
					while(brett)
					{
						if(FindName(brett->point_list, point->systemname))
						{
							if(verbose)	SPrintf(file, "/%-39ls %ls\r\n", brett->name, brett->comment);
							else	SPrintf(file, "/%ls\r\n", brett->name);
							Write(FH, file, strlen(file));
						}
						brett = GetSucc(brett);
					}
				}
				else if(strstr(mail->Betreff, "OTHER"))
				{
					strcpy(mail->Betreff, "Re: LIST OTHER BRETTER");
					brett = GetHead(&BrettDataList);
					while(brett)
					{
						if(!(FindName(brett->point_list, point->systemname)) && brett->read_level <= point->level && (brett->flags & BFLG_MAPS))
						{
							if(verbose)	SPrintf(file, "/%-39ls %ls\r\n", brett->name, brett->comment);
							else	SPrintf(file, "/%ls\r\n", brett->name);
							Write(FH, file, strlen(file));
						}
						brett = GetSucc(brett);
					}
				}
				else
				{
					strcpy(mail->Betreff, "Re: LIST BRETTER");
					brett = GetHead(&BrettDataList);
					while(brett)
					{
						if(brett->read_level <= point->level && (brett->flags & BFLG_MAPS))
						{
							if(verbose)	SPrintf(file, "/%-39ls %ls\r\n", brett->name, brett->comment);
							else	SPrintf(file, "/%ls\r\n", brett->name);
							Write(FH, file, strlen(file));
						}
						brett = GetSucc(brett);
					}
				}
			}
			else if(strstr(mail->Betreff, "LOGBUCH"))
			{
				BPTR FH2;

				strcpy(mail->Betreff, "Re: LOGBUCH");
				if(point->level > 250)
				{
					SPrintf(file, "%lsLogFile", Config.log);
					if(FH2 =  Open(file, MODE_OLDFILE))
					{
						while(FGets(FH2, file, 200))
						{
							if(ptr = strchr(file, '\n'))	*ptr = 0;
							FPrintf(FH, "%ls\r\n", file);
						}
						Close(FH2);
					}
				}
				else	FPrintf(FH, "Kein Zugriff.\r\n");
			}
		}
		else if(strstr(mail->Betreff, "ADD"))
		{
			struct List LineList;
			struct Brett *brett;

			NewList(&LineList);
			strcpy(mail->Betreff, "Re: ADD");

			buf = mail_buffer;
			size = atol(mail->Laenge);
			while(buf < mail_buffer + size)
			{
				if(ptr = strchr(buf, '\r'))
				{
					*ptr = 0;
					SPrintf(file, "\r\nAuf '%ls' eingetragene Bretter :\r\n", buf);
					Write(FH, file, strlen(file));

					strupr(buf);
					if(*buf == '/')	buf++;
					PatternList(buf, &BrettDataList, &LineList);

					line = GetHead(&LineList);
					while(line)
					{
						if(brett = FindName(&BrettDataList, line->text))
						{
							if(brett->read_level <= point->level && (brett->flags & BFLG_MAPS) &&
								!FindName(brett->point_list, point->systemname))
							{
								if(line2 = GetLine())
								{
									strcpy(line2->text, point->systemname);
									AddTail(brett->point_list, line2);

									SPrintf(file, "/%ls\r\n", brett->name);
									Write(FH, file, strlen(file));

									write_brettdata = TRUE;
								}
							}
						}
						line = GetSucc(line);
					}
					RemList(&LineList);

					buf = ptr + 1;
				}
				else buf = mail_buffer + size;
			}
		}
		else if(strstr(mail->Betreff, "DEL"))
		{
			struct List LineList;
			struct Brett *brett;

			NewList(&LineList);
			strcpy(mail->Betreff, "Re: DEL");

			buf = mail_buffer;
			size = atol(mail->Laenge);
			while(buf < mail_buffer + size)
			{
				if(ptr = strchr(buf, '\r'))
				{
					*ptr = 0;
					SPrintf(file, "\r\nAuf '%ls' ausgetragene Bretter :\r\n", buf);
					Write(FH, file, strlen(file));

					strupr(buf);
					if(*buf == '/')	buf++;
					PatternList(buf, &BrettDataList, &LineList);

					line = GetHead(&LineList);
					while(line)
					{
						if(brett = FindName(&BrettDataList, line->text))
						{
							if((line2 = FindName(brett->point_list, point->systemname)) &&
								(brett->flags & BFLG_MAPS))
							{
								Remove(line2);
								FreeVec(line2);

								SPrintf(file, "/%ls\r\n", brett->name);
								Write(FH, file, strlen(file));

								write_brettdata = TRUE;
							}
						}
						line = GetSucc(line);
					}
					RemList(&LineList);

					buf = ptr + 1;
				}
				else buf = mail_buffer + size;
			}
		}
		else if(strstr(mail->Betreff, "INHALT"))
		{
		}
		else if(strstr(mail->Betreff, "REQUEST"))
		{
		}
	}

	strcpy(mail->Empfaenger, mail->Absender);
	SPrintf(mail->Absender, "MAPS@%ls.ZER", Config.netz_name);
	mail->Pfad[0] = 0;
	strcpy(&mail->MsgId[strlen(mail->MsgId) - 5], "@MAPS");

	Close(FH);
	SPrintf(file, "%lsZSort_Temp", Config.temp);
	if(buf = GetFile(file, &size))
	{
		SPrintf(mail->Laenge, "%ld", size);
		SPrintf(file, "%lsUnPack/MAPS", Config.temp);
		if(FH = COpen(file))
		{
			Seek(FH, 0, OFFSET_END);
			WriteHeader(FH, mail);
			Write(FH, buf, size);
			Close(FH);
		}
		FreeVec(buf);
	}
}
