/*******************************\
* INIT_SYSTEM.C			*
* (C)1986-87, Patrick E. Hughes	*
\*******************************/

#include <exec/io.h>
#include <exec/types.h>
#include <exec/memory.h>
#include <stdio.h>
#include <intuition/intuition.h>
#include <devices/console.h>
#include <devices/serial.h>
#include <devices/timer.h>
#include "System.h"
#include "Defines.h"

/***********************\
* GLOBAL VARIABLE LIST	*
\***********************/

extern struct IntuitionBase *IntuitionBase;
extern struct Remember *RememberKey;
extern struct NewWindow NewWindow;
extern struct NewWindow PaneStatus;
extern struct Window *window;
extern struct Window *StatusPane;
extern struct System System;
extern struct IOExtSer *WriteSerReq, *ReadSerReq;
extern struct IOStdReq *WriteConReq, *ReadConReq, *StatWriteReq;
extern struct timerequest *TimerMsg;
extern struct MsgPort *WriteSerPort, *ReadSerPort, *TimerPort;
extern struct MsgPort *WriteConPort, *ReadConPort, *StatWritePort;
extern void *OpenLibrary();
extern struct Window *OpenWindow();
extern void *CreatePort(), *CreateStdIO();
extern void *AllocRemember();

extern ULONG TimerSig, SerCharSig, ConCharSig, WindowSig;
extern UBYTE serin[200], conin[200];

extern int Boards_Are_Active, Libraries_Are_Active;
extern int Bulletins_Are_Active, Mail_Is_Active;
extern int Whence_The_Logon;
extern int IO_Flags[];

/***********************\
* INIT_SYSTEM()		*
\***********************/

int Init_System()
{
FILE *fp, *fm;
int stat, low, high, count;
char trashcan[132];
struct Mail_Data *md;

/* preliminaries */
IntuitionBase=OpenLibrary("intuition.library",0L);
window=OpenWindow(&NewWindow);
StatusPane=OpenWindow(&PaneStatus);
WindowSig=1L<<window->UserPort->mp_SigBit;

Kill_SysReq(TRUE);

InitConsole();
ConCharSig=1L<<ReadConPort->mp_SigBit;
Display_Logo();
OpenTimer();
TimerSig=1L<<TimerPort->mp_SigBit;

System.Mail_List=AllocRemember(&RememberKey,
	(long)sizeof(struct Mail_Header),
	MEMF_CLEAR);
if(System.Mail_List==NULL)
	{
	ShutDown("No memory for Mail list");
	}

fp=fopen("s:Tag_System","r");
if(fp==NULL)
	{
	ShutDown("File S:Tag_System missing");
	}

(void)fscanf(fp, "%[^S]",trashcan);
stat=fscanf(fp, "SYSTEM:%30[^\n]", System.Name);
if(stat!=1)
	{
	ShutDown("Error, System Name");
	}

(void)fscanf(fp, "%[^L]",trashcan);

stat=fscanf(fp, "LOCAT:%80[^\n]", System.Location);
if(stat!=1)
	{
	ShutDown("Error, System Location");
	}
(void)fscanf(fp, "%[^S]",trashcan);

stat=fscanf(fp, "SYSOP:%30[^\n]", System.Sysop);
if(stat!=1)
	{
	ShutDown("Error, Sysop's Name");
	}
(void)fscanf(fp, "%[^U]",trashcan);

(void)fscanf(fp, "USERS:", trashcan);
(void)fscanf(fp, "%[^A]",trashcan);

stat=fscanf(fp, "ACCOUNTS:%hu", &System.User_Defaults.Maximum);
if(stat!=1)
	{
	ShutDown("Error, System Accounts");
	}

(void)fscanf(fp, "%[^G]",trashcan);

(void)fscanf(fp, "GUEST:", trashcan);
(void)fscanf(fp, "%[^S]",trashcan);

stat=fscanf(fp, "STSEC:%hu", &System.User_Defaults.Guest.Sec_Status);
if(stat!=1)
	{
	ShutDown("Error, Guest Default, Sec_Status");
	}
(void)fscanf(fp, "%[^B]",trashcan);

stat=fscanf(fp, "BDSEC:%hu", &System.User_Defaults.Guest.Sec_Board);
if(stat!=1)
	{
	ShutDown("Error, Guest Default, Sec_Board");
	}
(void)fscanf(fp, "%[^L]",trashcan);

stat=fscanf(fp, "LBSEC:%hu", &System.User_Defaults.Guest.Sec_Library);
if(stat!=1)
	{
	ShutDown("Error, Guest Default, Sec_Library");
	}
(void)fscanf(fp, "%[^B]",trashcan);

stat=fscanf(fp, "BUSEC:%hu", &System.User_Defaults.Guest.Sec_Bulletin);
if(stat!=1)
	{
	ShutDown("Error, Guest Default, Sec_Bulletin");
	}
(void)fscanf(fp, "%[^T]",trashcan);

stat=fscanf(fp, "TIME:%ld", &System.User_Defaults.Guest.Time_Limit);
if(stat!=1)
	{
	ShutDown("Error, Guest Default, Time_Limit");
	}

/***/
(void)fscanf(fp, "%[^N]",trashcan);

(void)fscanf(fp, "NEW:", trashcan);
(void)fscanf(fp, "%[^S]",trashcan);

stat=fscanf(fp, "STSEC:%hu", &System.User_Defaults.New.Sec_Status);
if(stat!=1)
	{
	ShutDown("Error, New Default, Sec_Status");
	}
(void)fscanf(fp, "%[^B]",trashcan);

stat=fscanf(fp, "BDSEC:%hu", &System.User_Defaults.New.Sec_Board);
if(stat!=1)
	{
	ShutDown("Error, New Default, Sec_Board");
	}
(void)fscanf(fp, "%[^L]",trashcan);

stat=fscanf(fp, "LBSEC:%hu", &System.User_Defaults.New.Sec_Library);
if(stat!=1)
	{
	ShutDown("Error, New Default, Sec_Library");
	}
(void)fscanf(fp, "%[^B]",trashcan);

stat=fscanf(fp, "BUSEC:%hu", &System.User_Defaults.New.Sec_Bulletin);
if(stat!=1)
	{
	ShutDown("Error, New Default, Sec_Bulletin");
	}
(void)fscanf(fp, "%[^T]",trashcan);

stat=fscanf(fp, "TIME:%ld", &System.User_Defaults.New.Time_Limit);
if(stat!=1)
	{
	ShutDown("Error, New Default, Time_Limit");
	}
/***/
(void)fscanf(fp, "%[^V]",trashcan);

(void)fscanf(fp, "VALID:", trashcan);
(void)fscanf(fp, "%[^S]",trashcan);

stat=fscanf(fp, "STSEC:%hu", &System.User_Defaults.Valid.Sec_Status);
if(stat!=1)
	{
	ShutDown("Error, Valid Default, Sec_Status");
	}
(void)fscanf(fp, "%[^B]",trashcan);

stat=fscanf(fp, "BDSEC:%hu", &System.User_Defaults.Valid.Sec_Board);
if(stat!=1)
	{
	ShutDown("Error, Valid Default, Sec_Board");
	}
(void)fscanf(fp, "%[^L]",trashcan);

stat=fscanf(fp, "LBSEC:%hu", &System.User_Defaults.Valid.Sec_Library);
if(stat!=1)
	{
	ShutDown("Error, Valid Default, Sec_Library");
	}
(void)fscanf(fp, "%[^B]",trashcan);

stat=fscanf(fp, "BUSEC:%hu", &System.User_Defaults.Valid.Sec_Bulletin);
if(stat!=1)
	{
	ShutDown("Error, Valid Default, Sec_Bulletin");
	}
(void)fscanf(fp, "%[^T]",trashcan);

stat=fscanf(fp, "TIME:%ld", &System.User_Defaults.Valid.Time_Limit);
if(stat!=1)
	{
	ShutDown("Error, Valid Default, Time_Limit");
	}
/***/

(void)fscanf(fp, "%[^M]", trashcan);

(void)fscanf(fp, "MAIL:", trashcan);
(void)fscanf(fp, "%[^L]", trashcan);

stat=fscanf(fp, "LOCAT:%80[^\n]", System.Mail_List->Location);
if(stat!=1)
	{
	ShutDown("Error, Mail Location");
	}
(void)fscanf(fp, "%[^W]", trashcan);

stat=fscanf(fp,"WRITE:%hu",&System.Mail_List->Write_Low);
if(stat!=1)
	{
	ShutDown("Error, Mail Write Low");
	}
stat=fscanf(fp,",%hu",&System.Mail_List->Write_High);
if(stat!=1)
	{
	ShutDown("Error, Mail Write High");
	}
(void)fscanf(fp, "%[^L]", trashcan);

stat=fscanf(fp, "LETTERS:%hu", &System.Mail_List->Maximum);
if(stat!=1)
	{
	ShutDown("Error, Mail Letters");
	}
System.Mail_List->Start_of_Data=AllocRemember(
		&RememberKey,
		(long)sizeof(struct Mail_Data)*System.Mail_List->Maximum,
		MEMF_CLEAR);
if(System.Mail_List->Start_of_Data==NULL)
	{
	ShutDown("No memory for mail configuration");
	}

strcpy(trashcan,System.Mail_List->Location);
strcat(trashcan,"Mail.Keys");
fm=fopen(trashcan,"r");
if(fm!=NULL)
	{
	fread(System.Mail_List->Start_of_Data,
		sizeof(struct Mail_Data),
		System.Mail_List->Maximum,
		fm);
	fclose(fm);
	Mail_Is_Active=1;
	System.Mail_List->Highest_Letter=0;
	for(count=0;count<System.Mail_List->Maximum;++count)
		{
		md=System.Mail_List->Start_of_Data;
		md+=count;
		if(md->Slot!=0) { ++System.Mail_List->Highest_Letter; }
		}
	}
else
	{
	Mail_Is_Active=0;
	}

/***/

(void)fscanf(fp, "%[^M]", trashcan);

(void)fscanf(fp, "MODEM:", trashcan);
(void)fscanf(fp, "%[^O]", trashcan);

stat=fscanf(fp, "OPEN:%80[^\n]", System.Modem.Open);
if(stat!=1)
	{
	ShutDown("Error, Modem Open");
	}
(void)fscanf(fp, "%[^R]", trashcan);

stat=fscanf(fp, "RESET:%80[^\n]", System.Modem.Reset);
if(stat!=1)
	{
	ShutDown("Error, Modem Reset");
	}
(void)fscanf(fp, "%[^R]", trashcan);

stat=fscanf(fp, "RING:%80[^\n]", System.Modem.Ring);
if(stat!=1)
	{
	ShutDown("Error, Modem Ring");
	}
(void)fscanf(fp, "%[^A]", trashcan);

stat=fscanf(fp, "ANSWER:%80[^\n]", System.Modem.Answer);
if(stat!=1)
	{
	ShutDown("Error, Modem Answer");
	}
(void)fscanf(fp, "%[^3]", trashcan);

stat=fscanf(fp, "300:%80[^\n]", System.Modem.B300);
if(stat!=1)
	{
	ShutDown("Error, Modem 300");
	}
(void)fscanf(fp, "%[^1]", trashcan);

stat=fscanf(fp, "1200:%80[^\n]", System.Modem.B1200);
if(stat!=1)
	{
	ShutDown("Error, Modem 1200");
	}
(void)fscanf(fp, "%[^2]", trashcan);

stat=fscanf(fp, "2400:%80[^\n]", System.Modem.B2400);
if(stat!=1)
	{
	ShutDown("Error, Modem 2400");
	}
(void)fscanf(fp, "%[^4]", trashcan);

stat=fscanf(fp, "4800:%80[^\n]", System.Modem.B4800);
if(stat!=1)
	{
	ShutDown("Error, Modem 4800");
	}
(void)fscanf(fp, "%[^9]", trashcan);

stat=fscanf(fp, "9600:%80[^\n]", System.Modem.B9600);
if(stat!=1)
	{
	ShutDown("Error, Modem 9600");
	}

/***/
fclose(fp);
/***/

OpenSerial(300L,(UBYTE)8,(UBYTE)1,(ULONG)SERF_SHARED|
	SERF_XDISABLED|
	SERF_RAD_BOOGIE);

SerCharSig=1L<<ReadSerPort->mp_SigBit;

SetDTR(TRUE);
Delay(25L);
SerPutStr(System.Modem.Open);
SerPutChar('\r');
Delay(100L);
PurgeLine();

Init_Boards();
Init_Libraries();
Init_Bulletins();
Init_Stat();

}

/**********************/
int Display_Logo()
{
ConPutStr("\
\014\n\n\n\n\n\n[1;33m\
                                TAG-BBS[0m\n");
ConPutStr("\
                                >XOXOX<\n\n");
ConPutStr("\
                                Version 1.03\n");
ConPutStr("\
                      1986-87, Patrick E. Hughes\n\n\n");
}
