#include "bbs.h"

extern char *MyVerStr;
extern ULONG ConfBaseLine;
extern int ValidUser;
extern char ReservedName[40];
extern UBYTE NodeWork[],WhichHist,NumHistItems;
extern int CustomCommand(char *str1, char *str2,int Private);
char LSTR[300];
extern char lang[];
extern char langtitle[];
void CallerIDLog(int opt);
char mybbstitle[50];
extern char SystemPrompt[80];
extern int Stealth;
UWORD CheckUserOnLine(struct User *user,UWORD check)
{
 struct User *tuser;
 BPTR fh,lock;
 char temp[10];
 UWORD error=0,stat,loop;

 if(check) {
	    if(tuser=(struct User *)AllocMem(sizeof(struct User),MEMF_ANY|MEMF_CLEAR))	{
		    loop=0;
		    error=1;
		    do {
			    if(loop==Cmds->AcLvl[LVL_NODE_NUMBER])	loop++;

			    sprintf(GSTR1,"%snode%ld",Cmds->BBSLoc,loop);
			    if(lock=Lock(GSTR1,ACCESS_READ)) {
				    UnLock(lock);
				    sprintf(GSTR1,"%snode%ld.user",NodeWork,loop);
				    if(fh=Open(GSTR1,MODE_OLDFILE)) {
					    if(stat=Read(fh,(void *)tuser,sizeof(struct User))) {
						    if(StringCompare(tuser->Name,user->Name)==SUCCESS) {
							    error=0;
							    lock=NULL;
							}
						}
					    Close(fh);
					}
				}
			    loop++;
			} while(lock!=NULL);
		    FreeMem(tuser,sizeof(struct User));
		} else	AEPutStr("Can't allocate memory for user test\r\n");
	} else    error=1;

 if(error) {
	    error=0;

     /* Write the current user info to Node%d.user */

	    sprintf(GSTR1,"%snode%ld.user",NodeWork,Cmds->AcLvl[LVL_NODE_NUMBER]);
	    if(fh=Open(GSTR1,MODE_NEWFILE))
		{
		strcpy(temp,user->Pass);
		strcpy(user->Pass,"ENCRYPTED");
		if(stat=Write(fh,(void *)user,sizeof(struct User))) error=1;
		}
	    Close(fh);

          strcpy(user->Pass,temp);

     /* Write current userkeys information */

	    sprintf(GSTR1,"%snode%ld.userkeys",NodeWork,Cmds->AcLvl[LVL_NODE_NUMBER]); /* file name */
	    if(fh=Open(GSTR1,MODE_NEWFILE))
		{
		if(stat=Write(fh,(void *)&User_keys,sizeof(struct UserKeys))) error=1;
		}
	Close(fh);
	}

 return(error);
}

void CallersLogDivider(void)
{
 CallersLog("**************************************************************\n");
 
}

extern char ID_TIME[];
extern char ID_DATE[];
extern char ID_NAME[];
extern char ID_NMBR[];

void CallerIDLog(int opt)
{
  FILE *fi;
  if((Sopt->Toggles[15] || Sopt->Toggles[16]) && opt)
  {
     sprintf(GSTR1,"%sNode%d/CallerIDlog",Cmds->BBSLoc,Cmds->AcLvl[LVL_NODE_NUMBER]);
     fi=fopen(GSTR1,"a");
     fprintf(fi,"**************************************************************\n");

     if(Sopt->Toggles[16])
     fprintf(fi,"\t(%s - %s [%16.16s / %s]) \n",ID_DATE,ID_TIME,ID_NMBR,ID_NAME);
     else
     fprintf(fi,"\t(%s - %s [%16.16s])\n",ID_DATE,ID_TIME,ID_NMBR);
     fclose(fi);
     return;
  }
  if(Sopt->Toggles[15] || Sopt->Toggles[16])
  {
         sprintf(GSTR1,"%sNode%d/CallerIDlog",Cmds->BBSLoc,Cmds->AcLvl[LVL_NODE_NUMBER]);
     fi=fopen(GSTR1,"a");

     fprintf(fi,"\t%s\n",User.Name);
     fclose(fi);
   }
}    
void UDLog(char *stringout)
{
 FILE *GFP1;
 if(!(GET_BIT(ACS_DO_UD_LOG)))	return;

 sprintf(LSTR,"%sNode%u/UDLog",Cmds->BBSLoc,Cmds->AcLvl[LVL_NODE_NUMBER]);
 GFP1=fopen(LSTR,"r");
 if(GFP1==NULL)	GFP1=fopen(LSTR,"w");
 else {
	    fclose(GFP1);
	    GFP1=fopen(LSTR,"a");
	}

 if(GFP1) {
	    fprintf(GFP1,stringout);
	    fclose(GFP1);
	}
}

void UDLogDivider(void)
{
 UDLog("**************************************************************\n");
}

void DisplayUserToCallersLog(int Udonly)
{
 extern struct myst my_struct;

 if(!Udonly) 	{ (void)CallersLogDivider(); 
                 CallerIDLog(0); }
 else        	(void)UDLogDivider();

 Time_system=time(NULL);

 sprintf(GSTR2,"%s",ctime(&Time_system));
 (void)Convert_CTime_To_Date(GSTR2,GSTR1,GSTR3);

 if(User.Times_Called==0) {
     my_struct.newuser = TRUE;
	    sprintf(GSTR2,"%s (%s) NEW [%d] %s (%s) %s\n",GSTR1,GSTR3,User.Slot_Number,User.Name,ConnectString,User.Location);
	} else {
	    sprintf(GSTR2,"%s (%s) [%d] %s (%s) %s\n",GSTR1,GSTR3,User.Slot_Number,User.Name,ConnectString,User.Location);
     my_struct.newuser = FALSE;
 }
 
 if(!Udonly)	{
     User.Times_Called +=1;
     CallersLog(GSTR2);
  } else
     UDLog(GSTR2);

}

void LogOffLog(char *STAT)
{
 Time_system=time(NULL);

 sprintf(GSTR2,"%s",ctime(&Time_system));
 (void)Convert_CTime_To_Date(GSTR2,GSTR1,GSTR3);

 if(STAT[0]=='N')
	    sprintf(GSTR2,"%s (%s) %s Off Normally\n",GSTR1,GSTR3,User.Name);
 else
 	sprintf(GSTR2,"%s (%s) %s Off %s\n",GSTR1,GSTR3,User.Name,STAT);

(void)CallersLog(GSTR2);
}

static int New_Account_Sequence(void)
{
  int mystat;
  int command_accepted;
sprintf(GSTR1,"%sACCESS/Preset.1",Cmds->BBSLoc);

	strcpy(User.Pass,"");

	User.Slot_Number=0;
	User.Sec_Status=IntFromIcon(GSTR1,"PRESET.ACCESS");
	User.Sec_Board=IntFromIcon(GSTR1,"PRESET.RATIO_TYPE");
	User.Sec_Library=IntFromIcon(GSTR1,"PRESET.RATIO");
	User.Time_Limit=IntFromIcon(GSTR1,"PRESET.TIME_LIMIT");
	User.Messages_Posted=0;
	User.New_User=1;
	User.NewSinceDate=0;
	User.Uploads=0;
	User.Downloads=0;
	User.ConfRJoin=IntFromIcon(GSTR1,"PRESET.CONFRJOIN");

	if(User.ConfRJoin==NULL) User.ConfRJoin=1;
	User.Time_Last_On=0L;
	User.Time_Used=0L;
	User.Time_Total=User.Time_Limit;
	User.Times_Called=0;
	User.Bytes_Download=0L;
	User.Bytes_Upload=0L;
	User.Protocol = 'Z'; 
	User.Time_Last_On=time(NULL);
	User.Daily_Bytes_Limit=IntFromIcon(GSTR1,"PRESET.DAILY_BYTE_LIMIT");
	GetFromIconStr(GSTR1,"PRESET.AREA",User.Conference_Access);
	strcpy(User.Location," ");

	StatPrintUser(&User);

 sprintf(GSTR3,"%sGuestLogon",Sopt->NodeScreen);
 if(!(GI1=ChecktoDisplay(GSTR3,GSTR2,0,1)))
	    UnAvailNotice(GSTR2,GSTR3);
 if(User.Slot_Number==0) {
     mystat=DoPause();
     if(mystat<0) return(mystat);
     command_accepted=JCom();              /* join */
     if(command_accepted<0)   return(command_accepted);
     AEPutStr("\r\n");
 }

 return(0);
}

void DisplayReserveNotice(void)
{
 sprintf(GSTR1,"\r\nNode %d is reserved right now, please try again later\r\n",Cmds->AcLvl[LVL_NODE_NUMBER]);
 AEPutStr(GSTR1);
}

int DoReserve(char *username)
{
 if(ReservedName[0]!='\0') {
	    if(stricmp(username,ReservedName)) {
		    DisplayReserveNotice();
		    Delay(60);
		    return(1);
		}
	}
 return(0);
}

static int CheckBaudCallingTime(int Online_Baud)
{

 int Time,Start=0,Fin=0;
 char str[70],str2[10];
 char t[100],t1[20];
 sprintf(t,"%sNode%d/TIMES.DEF",Cmds->BBSLoc,Cmds->AcLvl[LVL_NODE_NUMBER]);

if(GET_BIT(ACS_OVERRIDE_TIMES))return(1);

 strcpy(str,GetTheTime(Time_connect));
 str2[0]=str[0];
 str2[1]=str[1];
 str2[2]=str[3];
 str2[3]=str[4];
 str2[4]='\0';

 Time=(int)atoi(str2);
 sprintf(t1,"START.%d",Online_Baud);
 Start=IntFromIcon(t,t1);
 sprintf(t1,"END.%d",Online_Baud);
 Fin=IntFromIcon(t,t1);
if(Fin<Start)
 {
    if(Time>=Fin && Time<Start) return(0);
    return(1);
 }
 if(Time>=Start) { if(Time<=Fin) return(1); return(0);}
}



static int BaudTime(int Online_Baud)
{
int stat;

 stat=CheckBaudCallingTime(Online_Baud);
 if(!stat) {
 	sprintf(GSTR1,"%sNotTime%ld",NodeStr,Online_Baud);
	    if(!(stat=ChecktoDisplay(GSTR1,GSTR2,0,1))) {
 		sprintf(GSTR1,"\r\n%ld baud is not allowed at this time.\r\n\r\n",Online_Baud);
	    	AEPutStr(GSTR1);
		}
 	stat=FALSE;
 	Delay(120L);
	}
 return(stat);
}

/************************************************** check User logon  ****/
/*** ADD IF new user, read bulletin1 rules ***/
int rnd(int );

int Logon_Sequence(void)
{
 #define MY_CONNECTMSG  "You are Connected to"
 extern struct myst my_struct;
 extern BOOL QuickAllowed;
 char acctfile[133], username[40];
 int stat, UUCP, tries;
 BPTR f, fp;

 Time_holder=0;
 ValidUser=2;
 AnsiColor=1;
if(Cmds->SysPass[0]!='\0' && Stealth) {
	    
	    for(tries=1; tries<4; tries++) {
         sprintf(GSTR3,"%sPrivate",Sopt->NodeScreen);
	    if(!(ChecktoDisplay(GSTR3,GSTR1,0,1)))
		    UnAvailNotice(GSTR1,GSTR3);
              AEPutStr(SystemPrompt);
		    stat=LineInputConverted("",GSTR1,30,KEYBOARD_TIMEOUT);
		    if(stat<0) return(SLEEP_LOGOFF);

		    if(Whence_The_Logon>=REMOTE_LOGON) {
			    stat=CheckCarrier();
			    if(stat==FALSE)			return(SLEEP_LOGOFF);
			}

 		stat=StringCompare(GSTR1,Cmds->SysPass);
	    	if(stat==SUCCESS)	break;

		}

	    if(tries==4) {
		    (void)CallersLog("System Password Failure\n");
		    return(FAILURE);
		}
       AEPutStr("\r\n");
	}

 ConPutStr("[ p");

 sprintf(GSTR3,"%5d",Online_Baud);
 StatMessage(73,1,GSTR3);

 Delay(50L);
 /* check if NoCallers File exists */
 sprintf(GSTR3,"%sNoCallersAt%d",Sopt->NodeScreen,Online_Baud);
 fp=Open(GSTR3,MODE_OLDFILE);
 if(fp!=NULL) {
	    Close(fp);
	    MenuSend(GSTR3);
	    Delay(200L);
	    goto LogoffEnd;
	}

 my_struct.sessiondbytes = 0;    /* DOwnloaded Bytes for this user, this session */
strcpy(acctfile,UserDataLoc);
 //sprintf(acctfile,"%sUser.Data",Cmds->BBSLoc);

 Time_system=time(NULL);
//(JOE)---06-21-92

	AEPutStr(ConnectString);

	if(mybbstitle[0]!=NULL)
		{
		sprintf(GSTR1,"\r\n\r\n[0mWelcome to %s, located in %s",Cmds->BBSName,mybbstitle);
		} else {
		sprintf(GSTR1,"\r\n\r\n[0mWelcome to %s.",Cmds->BBSName);
		}

	AEPutStr(GSTR1);
	AEPutStr("\r\nRunning AmiExpress BBS - Beta Tester Version\r\n");
	sprintf(GSTR1,"You are connected to Node %d at %ld baud",Cmds->AcLvl[LVL_NODE_NUMBER],Online_Baud);
	AEPutStr(GSTR1);
	strcpy(GSTR2,GetTheTime(Time_system));
	strcpy(GSTR3,GetTheDate(Time_system));
	sprintf(GSTR1,"\r\nConnection occured at %s %s.\r\n",GSTR2,GSTR3);
	AEPutStr(GSTR1);
	AEPutStr("\r\n");

 sprintf(GSTR1,"%sCommands/SysCmd/",Cmds->BBSLoc);
 strcpy(GSTR2,"FRONTEND");
 CustomCommand(GSTR1,GSTR2,1);
 /*-- 11w end */
QuickFlag=0;
 User.Sec_Status=255;
 
 if(Sopt->Toggles[15] || Sopt->Toggles[16])
 {
    ConPutStr("\r\n >"); ConPutStr(ID_TIME); ConPutStr("\r\n");
    ConPutStr(" >");                    ConPutStr(ID_DATE); ConPutStr("\r\n");
    ConPutStr(" >");                    ConPutStr(ID_NMBR); ConPutStr("\r\n");
    if(Sopt->Toggles[16]) { AEPutStr(" >"); ConPutStr(ID_NAME); ConPutStr("\r\n"); }
    ConPutStr("\r\n");
  }
 sprintf(GSTR1,"%sCommands/syscmd/",Cmds->BBSLoc);
 
 strcpy(GSTR2,"ANSI");
 if(!CustomCommand(GSTR1,GSTR2,1))
 {
 AEPutStr("ANSI graphics (Y/n)? ");
 

 stat=LineInput("",GSTR1,10,KEYBOARD_TIMEOUT/2);

 if(stat<0)  return(SLEEP_LOGOFF);
 if(Whence_The_Logon>=REMOTE_LOGON)	{
	    stat=CheckCarrier();
	    if(stat==FALSE)		return(SLEEP_LOGOFF);
	}
 if(GSTR1[0]=='N'||GSTR1[0]=='n') {
         my_struct.AnsiColor=0;
 	    AnsiColor=0;
 }

QuickFlag=0;
if((GSTR1[2]=='Q'||GSTR1[2]=='q') && QuickAllowed)
 	QuickFlag=1;
}

/*-- Gotta Know the pasword ---*/
if(Cmds->SysPass[0]!='\0' && !Stealth) {
	    sprintf(GSTR3,"%sPrivate",Sopt->NodeScreen);
	    if(!(stat=ChecktoDisplay(GSTR3,GSTR1,0,1)))
		    UnAvailNotice(GSTR1,GSTR3);
	    for(tries=1; tries<4; tries++) {
              AEPutStr(SystemPrompt);
		    stat=LineInputConverted("",GSTR1,30,KEYBOARD_TIMEOUT);
		    if(stat<0) return(SLEEP_LOGOFF);

		    if(Whence_The_Logon>=REMOTE_LOGON) {
			    stat=CheckCarrier();
			    if(stat==FALSE)			return(SLEEP_LOGOFF);
			}

 		stat=StringCompare(GSTR1,Cmds->SysPass);
	    	if(stat==SUCCESS)	break;

		    AEPutStr("Invalid PassWord\r\n");
		}

	    if(tries==4) {
		    (void)CallersLog("System Password Failure\n");
		    return(FAILURE);
		}
	}

 if(QuickFlag) goto Begining;    /* Skip Logon Screen */
/*--- end 11w cycle screens --- */
//(RTS)  Tue Jun 23 08:34:08 1992
 /* show a default screen for low end users ?? */
             sprintf(GSTR1,"%sBBSTitle",Sopt->NodeScreen);
             ChecktoDisplay(GSTR1,GSTR3,0,0);

Begining:
tries=0;

 if(ReservedName[0]!='\0') {
	    sprintf(GSTR1,"\r\n*** Node %d is reserved right now, for %s ***\r\n",Cmds->AcLvl[LVL_NODE_NUMBER],ReservedName);
	    AEPutStr(GSTR1);
	}
/*---------------LogonLoop-----------------------------------*/
LogonLoop:
 if(tries>=5)	{
	    AEPutStr("Too Many Errors, Goodbye!\r\n");
	    return(FAILURE);
	}


	/* Allow custom name_prompt string */

	AEPutStr("\r\n[0mEnter your ");
	if(!GetFromIconStr(NodeStr,"NAME_PROMPT",GSTR1))
		{
		AEPutStr("Name");
		} else {
		AEPutStr(GSTR1);
		}
	AEPutStr(" : ");



 NumHistItems=0;
 WhichHist=0;
 HistorySelect=0;

 stat=LineInput("",username,28,KEYBOARD_TIMEOUT/2);
 if(stat<0) return(stat);

 if(Whence_The_Logon>=REMOTE_LOGON) {
	    stat=CheckCarrier();
	    if(stat==FALSE)		return(SLEEP_LOGOFF);
	}

 if(strlen(username)==0) { tries+=1; goto LogonLoop; }

 UUCP=0;
 strcpy(GSTR3,username);
 GSTR3[5]='\0';
 strupr(GSTR3);
 strcpy(GSTR1,"UUCP.");
 if(StringCompare(GSTR3,GSTR1)==SUCCESS)	{
	    UUCP=1;
	    strcpy(GSTR3,username+5);
	    strcpy(username,GSTR3);
	} else	strcpy(GSTR3,username);

 stat=ChooseAName(GSTR3,&User,&User_keys,0);  /* go get this guys user info */
 
 if(stat<FAILURE)
     return(stat);
     SetEnvStat(ENV_ACCOUNTSEQ);
 if(stat==FAILURE)	{
	    sprintf(GSTR1,"\r\nThe handle %s is not used on this BBS.\r\n",username);
	    AEPutStr(GSTR1);
	//    sprintf(GSTR1,"\t  The handle %s is not used on this BBS.\n",username);
     //CallersLog(GSTR1);   /* (RTS) save this to a file to see who tried to hacked in */

	    AEPutStr("[R]etry your name or [C]ontinue as a new user? ");
	    stat=LineInput("",GSTR1,2,KEYBOARD_TIMEOUT/2);
	    if(stat<0)  return(stat);
         
	    if(GSTR1[0]!='C'&&GSTR1[0]!='c') {
		    AEPutStr("\r\n");
		    tries+=1;
		    goto LogonLoop;
		}
         
	    stat=DoReserve(User.Name);
	    if(stat)		return(FAILURE);
         ConvertAccess();
	    if(ReservedName[0]=='\0') {
		    stat=BaudTime(Online_Baud);
		    if(!stat)		return(FAILURE);
		}

	    if(Cmds->NEW_UserPW[0]!='\0') {
		    sprintf(GSTR2,"%sNewUserPW",Sopt->NodeScreen);
		    stat=ChecktoDisplay(GSTR2,GSTR3,0,1);

		    AEPutStr("Enter New User Password: ");
		    stat=LineInputConverted("",GSTR3,30,KEYBOARD_TIMEOUT);
		    if(stat<0)  return(SLEEP_LOGOFF);
		    if(Whence_The_Logon>=REMOTE_LOGON)	{
			    stat=CheckCarrier();
			    if(stat==FALSE) 	return(SLEEP_LOGOFF);
			}

		    stat=StringCompare(GSTR3,Cmds->NEW_UserPW);
		    if(stat!=SUCCESS) {
			    tries+=1;
			    AEPutStr("Invalid PassWord\r\n");
			    goto LogonLoop;
			}
		    AEPutStr("Correct\r\n");
		}

	    strcpy(User.Name,username);
     /* Check for NoNewUsers at xxx Baud */
	    sprintf(GSTR1,"%sNoNewAt%d",Sopt->NodeScreen,Online_Baud);
	    if((f= Open(GSTR1,MODE_OLDFILE))) {
		    Close(f);
		    MenuSend(GSTR1);
		    Delay(360L);
		    goto LogoffEnd;
		}
     /* Check NoNewUsers at all */
	    sprintf(GSTR1,"%sNoNewUsers",Sopt->NodeScreen);
	    if((f= Open(GSTR1,MODE_OLDFILE))) {
		    Close(f);
		    MenuSend(GSTR1);
		    Delay(360L);
		    goto LogoffEnd;
		}

	    stat=New_Account_Sequence();
	    if(stat<=(-1))	return(stat);
         SetEnvStat(ENV_LOGGINGON);
         
         (void)DisplayUserToCallersLog(0);
         
 	return(SUCCESS);
	}
     SetEnvStat(ENV_LOGGINGON);
      
//(RTS) Tue Jun 23 08:36:43 1992
 /*** Check list.. if user appears tell him to call the other node */

 /* load the Users account */
 stat=Load_Account((int)User_keys.Number,&User,&User_keys);
 if(stat==FAILURE) {
	    AEPutStr("That account has problems\r\n");
	    tries+=1;
	    goto LogonLoop;
	}

 /*- Users accout was deleted --*/
 if(User.Slot_Number==0)	{
	    AEPutStr("That account has been deleted.\r\n");
	    goto LogoffEnd;
	}
//(JOE) added here, removed from menu.c
ConvertAccess();
 
Time_Last_On=User.Time_Last_On;
 stat=DoReserve(User.Name);
 if(stat)	return(FAILURE);

 if(ReservedName[0]=='\0') {
	    stat=BaudTime(Online_Baud);
	    if(!stat)	return(FAILURE);
	}

 if(User.Sec_Status==0)	{        /* User is locked out the bbs */
	    sprintf(GSTR1,"%sLockout-0",Sopt->NodeScreen);
	    if(!(stat=ChecktoDisplay(GSTR1,GSTR3,0,1))) {
		    UnAvailNotice(GSTR3,GSTR1);
		}
	    goto LogoffEnd;
	}

 if(User.Sec_Status==1) {
	    sprintf(GSTR1,"%sLockout-1",Sopt->NodeScreen);
	    if(!(stat=ChecktoDisplay(GSTR1,GSTR3,0,1)))
		    UnAvailNotice(GSTR3,GSTR1);

	    goto LogoffEnd;
	}

 /*** gotta update current info before going to CheckUSerOnline */

 User_keys.baud_rate = Online_Baud;

 StatPrintUser(&User);

 ConvertAccess();
 stat=CheckUserOnLine(&User,1);
 if(!stat) {
	    CallersLog("User already on another node!\n");
	    sprintf(GSTR1,"%sOnlyOnOneNode",Cmds->BBSLoc);
	    if(!(stat=ChecktoDisplay(GSTR1,GSTR3,0,1)))
		    AEPutStr("You are already logged into another node!\r\n");
	    goto LogoffEnd;
	}
     
 FOREVER	{
         
	    (void)DisplayUserToCallersLog(0);
         
	    tries=0;
	    do {
		    if(tries>2)
			{
			AEPutStr("\r\nExcessive Password Failure\r\n");
			sprintf(GSTR1,"%sCommands/syscmd/",Cmds->BBSLoc);
			strcpy(GSTR2,"PWFAIL");
			CustomCommand(GSTR1,GSTR2,1);
			goto LogoffErr;
			}


		if(Whence_The_Logon==LOCAL_LOGON)
			{
			stat=SUCCESS;	// LOCAL_SYSOP PASSWORD OVERRIDE..
			} else {

			/* read users password, decrypt it...  */

			AEPutStr("PassWord: ");
			stat=LineInputConverted("",GSTR3,32,KEYBOARD_TIMEOUT);
			if(stat<0) return(SLEEP_LOGOFF);
			if(Whence_The_Logon>=REMOTE_LOGON)
				{
				stat=CheckCarrier();
				if(stat==FALSE) return(SLEEP_LOGOFF);
				}
			strupr(GSTR3);
			stat=AECryptCmp(GSTR3,User.PassKey); /* actual pw */
			}


		if(stat!=SUCCESS)
			{
			sprintf(GSTR2,"\tPassword Failure (%s)\n",GSTR3);
			(void)CallersLog(GSTR2);
			AEPutStr("Invalid PassWord\r\n");
			++tries;
			}

		} while(stat!=SUCCESS);
#ifdef RTS
	    sprintf(GSTR1,"%sPhoneCheck",Cmds->BBSLoc);
	    if(f=Open(GSTR1,MODE_OLDFILE)) {
		    Close(f);
		    tries=0;
		    do {
			    if(tries>2)	{
				    AEPutStr("\r\nExcessive PhoneNumber Failure\r\n");
				    goto LogoffErr;
				}
			    AEPutStr("Last 4 digits of your PhoneNumber: ");
			    stat=LineInput("",GSTR3,4,KEYBOARD_TIMEOUT);
			    if(stat<0)  return(SLEEP_LOGOFF);
			    if(Whence_The_Logon>=REMOTE_LOGON) {
				    stat=CheckCarrier();
				    if(stat==FALSE) return(SLEEP_LOGOFF);
				}
			    strcpy(GSTR1,User.PhoneNumber);
			    if(strlen(GSTR1)>4)
				    strcpy(GSTR1,GSTR1+(strlen(GSTR1)-4));

			    stat=StringCompare(GSTR3,GSTR1);
			    if(stat!=SUCCESS) {
				    sprintf(GSTR2,"\tPhoneNumber Failure (%s)\n",GSTR3);
				    (void)CallersLog(GSTR2);
				    AEPutStr("Invalid PhoneNumber\r\n");
				    ++tries;
				}
			} while(stat!=SUCCESS);
		}
#endif
	    StatPrintUser(&User);
#ifdef RTS
	    if(UUCP) {
		    if(User.UUCPA) {
			    ValidUser=3;
			    ConPutStr("\r\nSystem dropping to UUCP...");
			    CallersLog("\tReceiving UUCP feed\n");
			    PurgeLineEnd();
			    if(lfh=Open("NIL:",MODE_OLDFILE)) {
				    sprintf(GSTR2,"uucico -D %s -U %u -Getty -7 -xx",Cmds->SerDev,Cmds->SerDevUnit);
				    Execute(GSTR2,(DeBuG?0:lfh),(DeBuG?0:lfh));
				    Close(lfh);
				}
			    PurgeLineStart();
			    DropDTR();
			    return(FAILURE);
			}
		    AEPutStr("UUCP access has been denied!\r\n\r\n");
		}
#endif
     /* we made it here so we got a online real valid user */
	    ValidUser=1;
	    return(SUCCESS);
	}

 LogoffErr:
 (void)CallersLog("\t* Password Failure *\n");

LogoffEnd:
 return(FAILURE);
}

void Sysop_Account_Sequence(void)
{
 Load_Account(1,&User,&User_keys);
      
//(JOE) added here, removed from menu.c
Time_Last_On=User.Time_Last_On;
 StatPrintUser(&User);
ConvertAccess();
 DisplayUserToCallersLog(0);
SetEnvStat(ENV_LOGGINGON);
 
 sprintf(GSTR1,"%sCommands/syscmd/",Cmds->BBSLoc);
 strcpy(GSTR2,"ANSI");
 CustomCommand(GSTR1,GSTR2,1);

}

void StartLog(char *stringout)
{
  FILE *GFP1;
if(!Sopt->Toggles[3]) return;
sprintf(LSTR,"%sNode%u/StartUpLog",Cmds->BBSLoc,Cmds->AcLvl[LVL_NODE_NUMBER]);

if(!TLock(LSTR)) GFP1=fopen(LSTR,"w"); else GFP1=fopen(LSTR,"a");
/*
GFP1=fopen(LSTR,"r");
if(GFP1==NULL)
	{
	GFP1=fopen(LSTR,"w");
	}
else
	{
	fclose(GFP1);
	GFP1=fopen(LSTR,"a");
	}
*/
if(GFP1)
	{
	fprintf(GFP1,stringout);
	fclose(GFP1);
	}
}
