#include "bbs.h"
extern long Startup_Time,Time_limit;
extern char ReservedName[];
extern int QuickFlag;
extern UBYTE ShutDownFlag;
extern char lang[];
void CallerIDLog(int opt);
extern int RingCount;
extern int ConnectDef(char *s);
static void ReserveForUser(void)
{
 int stat;
 char str[34];
 struct User TUser;
 struct UserKeys TUserkeys;

Redo:
 AEPutStr("\r\nEnter username to reserve for: ");
 stat=LineInput("",str,30,KEYBOARD_TIMEOUT);
 if(stat<0||str[0]=='\0') 	return;
 stat=ChooseAName(str,&TUser,&TUserkeys,0);
 if(stat<FAILURE) 	return;
 if(stat==FAILURE)	goto Redo;
 strcpy(ReservedName,TUserkeys.UserName);
}
char ID_DATE[20];
char ID_TIME[20];
char ID_NMBR[50];
char ID_NAME[50];


static int do_baud(ULONG baudrate)
{

 /* set up baud, & return */
	Online_Baud  = baudrate;

	Online_BaudR = Cmds->OpeningBaud;

	IO_Flags[IOFLAG_SER_OUT] = 1;
 IO_Flags[IOFLAG_SCR_OUT] = 1;
	if(Cmds->AcLvl[LVL_VARYING_LINK_RATE]==1) 	SetBaud(baudrate);
 ConPutStr("\014");
	time(&Time_connect);
	return(REMOTE_LOGON);
}
int CallerID=0;
//extern int LastValidUser;
int Await_Logon(void)
{
 int stat,ch,c;
 int input;
 int RCount;
 ULONG tempbaud;

 char string[81];
 /* if the last valid user was a validated user, reset otherwise keep display */
// if(LastValidUser) {
     sprintf(string,ctime(&Startup_Time));
     string[strlen(string)-1]='\0';
     StatMessage(48,3,string);
 strcpy(ID_DATE,"");
 strcpy(ID_NAME,"");
 strcpy(ID_TIME,"");
 strcpy(ID_NMBR,"");

 StatChatFlag();
  SetEnvStat(ENV_AWAITCONNECT);
 strcpy(lang,"txt");
 ClearProtocol();
         DisplayAwaitMsg();
 FOREVER	{
//(JOE)
     Time_limit=1800;
     Time_holder=0;
     RCount=RingCount;
     if(TrapDoor) goto GO;
 	AWAITLOGON=1;

        Cycle_The_Display();
	 
	    CheckIconifyMsg();
//(put back in ) (JOE)
     ServerCmd=0;
     CheckDoorMsg(0);
 	AWAITLOGON=0;
//(JOE)-----
     if(ServerCmd)
     {
       strcpy(User.Name,""); strcpy(User.Location,"");
       switch(ServerCmd)
       {
         case SV_RESERVE:
                                 if(ReservedName[0]!='\0')
							{
							   ReservedName[0]='\0';
							   DisplayAwaitMsg();
                                      SetEnvStat(ENV_AWAITCONNECT);
							}
						     else
							{
							   IO_Flags[IOFLAG_SER_IN]=0;
							   IO_Flags[IOFLAG_SER_OUT]=0;
							   IO_Flags[IOFLAG_SCR_OUT]=1;
							   IO_Flags[IOFLAG_KBD_IN]=1;
							   Time_limit=3600L;
							   Whence_The_Logon=LOCAL_LOGON;
							   IntDoReset(Sopt->OffHook);
							   ConPutStr("[ p\014");
							   ReserveForUser();
							   Reset_System(1);
							   IO_Flags[IOFLAG_SER_IN]=1;
							   IO_Flags[IOFLAG_SCR_OUT]=0;
							   Whence_The_Logon=AWAIT_LOGON;
                                      strcpy(User.Name,ReservedName);
                                      strcpy(User.Location,"");
                                      SetEnvStat(ENV_RESERVE);
                                      DisplayAwaitMsg();
							}
                                   break;
         case SV_ACCOUNTS:
                              IO_Flags[IOFLAG_SER_IN]=0;
						IO_Flags[IOFLAG_SER_OUT]=0;
						IO_Flags[IOFLAG_SCR_OUT]=1;
						IO_Flags[IOFLAG_KBD_IN]=1;
						IntDoReset(Sopt->OffHook);
						ConPutStr("[ p\014");
						Time_limit=3600L;
						Whence_The_Logon=LOCAL_LOGON;
						Edit_Accounts();
						Reset_System(1);
						IO_Flags[IOFLAG_KBD_IN]=1;
						IO_Flags[IOFLAG_SER_IN]=1;
						if(IO_Flags[IOFLAG_FIL_IN])
							{
							IO_Flags[IOFLAG_FIL_IN]=0;
							}
						IO_Flags[IOFLAG_SCR_OUT]=0;
						IO_Flags[IOFLAG_SER_OUT]=0;
						Whence_The_Logon=AWAIT_LOGON;
                              SetEnvStat(ENV_AWAITCONNECT);
                              DisplayAwaitMsg();
                  break;
          case SV_NODEOFFHOOK: /* F10 - Exit Off Hook */
						IntDoReset(Sopt->OffHook);
						Delay(30L);
						ShutDown("!"); break;
		case SV_EXITNODE: /* F9 - Exit On Hook */
						Delay(30L);ShutDown("!"); break;
          case SV_AESHELL:
               SetEnvStat(SV_AESHELL);(void)LRemoteShell();
               SetEnvStat(ENV_AWAITCONNECT); break;
          case SV_INSTANT: goto GO; break;
        
         default: return(ServerCmd);
       }
     }
//----------(JOE) end;
	    Delay(30L);

	    CheckRexxMessage();
	    if(ShutDownFlag)	return(SUSPEND_LOGON);

 	if(CheckCon()) {
strcpy(User.Name,""); strcpy(User.Location,"");
 		c=GetConKey(1L);
	    	if(c==155) {
 			ch=GetConKey(1L);
	    		c=GetConKey(1L);
		    	if(c==126) {
 				switch(ch) {
 					case '?':               /* Help - ToggleStat */
 						ToggleStatusDisplay();
	    					break;
	    				case '9':               /* F10 - Exit Off Hook */
		    				IntDoReset(Sopt->OffHook);
			    			Delay(30L);
				    		ShutDown("!");
		    			case '8':               /* F9 - Exit On Hook */
						    ShutDown("!");
			    	    	case '7':           /* F8 - Reprogram modem */
					    	ReInitModem();
						    Reset_System(1);
						    continue;
				    	case '6':               /* F7 - Toggle Chat Bit */
			    			if(SySChat==1)	SySChat=0;
				    		else			SySChat=1;
					    	StatChatFlag();
						    break;
					    case '5':               /* F6 - Account Editting */
 						IO_Flags[IOFLAG_SER_IN]=0;
	    					IO_Flags[IOFLAG_SER_OUT]=0;
		    				IO_Flags[IOFLAG_SCR_OUT]=1;
			    			IO_Flags[IOFLAG_KBD_IN]=1;
				    		IntDoReset(Sopt->OffHook);
					    	ConPutStr("[ p\014");
 						Time_limit=3600L;
	    					Whence_The_Logon=LOCAL_LOGON;
                              Load_Account(1,&User,&User_keys);
		    				Edit_Accounts();
			    			Reset_System(1);
				    		IO_Flags[IOFLAG_KBD_IN]=1;
					    	IO_Flags[IOFLAG_SER_IN]=1;
						    if(IO_Flags[IOFLAG_FIL_IN])
 							IO_Flags[IOFLAG_FIL_IN]=0;
	    					IO_Flags[IOFLAG_SCR_OUT]=0;
		    				IO_Flags[IOFLAG_SER_OUT]=0;
			    			Whence_The_Logon=AWAIT_LOGON;
                              SetEnvStat(ENV_AWAITCONNECT);
                                  DisplayAwaitMsg();
				    		continue;
					    case '4':               /* F5 - Local Shell */
						    (void)LRemoteShell();
						    break;
 					case '3':
	    					if(ReservedName[0]!='\0') {
 							ReservedName[0]='\0';
	    						DisplayAwaitMsg();
							} else	{
 							IO_Flags[IOFLAG_SER_IN]=0;
	    						IO_Flags[IOFLAG_SER_OUT]=0;
		    					IO_Flags[IOFLAG_SCR_OUT]=1;
			    				IO_Flags[IOFLAG_KBD_IN]=1;
				    			Time_limit=3600L;
					    		Whence_The_Logon=LOCAL_LOGON;
						    	IntDoReset(Sopt->OffHook);
							    ConPutStr("[ p\014");
 							ReserveForUser();
	    						Reset_System(1);
		    					IO_Flags[IOFLAG_SER_IN]=1;
			    				IO_Flags[IOFLAG_SCR_OUT]=0;
				    			Whence_The_Logon=AWAIT_LOGON;
                                    
                                   DisplayAwaitMsg();
							}
					    	continue;
					    case '2':           /* F3 - Instant Remote Logon */
					    	goto GO;
				    	case '1':           /* F2 - Local Login */
					    	strcpy(ConnectString,"F2_LOCAL");
					    	(void)StatClearTime();
						    IO_Flags[IOFLAG_SER_IN]=0;
					    	IO_Flags[IOFLAG_SER_OUT]=0;
						    IO_Flags[IOFLAG_SCR_OUT]=1;
 						IO_Flags[IOFLAG_KBD_IN]=1;
	    					ConPutStr("[ p\014");
		    				time(&Time_connect);

				    		Online_Baud=Cmds->OpeningBaud;
					    	Online_BaudR=Cmds->OpeningBaud;
					    	IntDoReset(Sopt->OffHook);
						    return(LOCAL_LOGON);
 					case '0':           /* F1 - Sysop Login */
	    					strcpy(ConnectString,"SYSOP_LOCAL");
		    				(void)StatClearTime();
			    			IO_Flags[IOFLAG_SER_IN]=0;
				    		IO_Flags[IOFLAG_SER_OUT]=0;
					    	IO_Flags[IOFLAG_SCR_OUT]=1;
						    IO_Flags[IOFLAG_KBD_IN]=1;
 						AnsiColor=1;
	    					QuickFlag=1;
		    				ConPutStr("[ p\014");
			    			time(&Time_connect);
				    		Online_Baud=Cmds->OpeningBaud;
					    	Online_BaudR=Cmds->OpeningBaud;

						    IntDoReset(Sopt->OffHook);
 						return(SYSOP_LOGON);
					}      /* end switch */
				}          /* end if ch=126 */
			}              /* end if c==125 */
		}                  /* end if CheckCon() */
	    if(CheckSer()) {
strcpy(User.Name,""); strcpy(User.Location,"");
 		IO_Flags[IOFLAG_SER_IN]=1;
	    	IO_Flags[IOFLAG_SER_OUT]=0;
while(RCount)
          {
		    LineInput("",string,80,5L);
 		if((stat=StringCompare(string,Cmds->MRing))==FAILURE)
 			break;
            RCount -=1;
          }          if(RCount) continue;
          if(Sopt->Toggles[15] || Sopt->Toggles[16])
          {
            LineInput("",ID_DATE,14,5L);
            LineInput("",ID_DATE,14,5L);
            LineInput("",ID_TIME,14,5L);
            LineInput("",ID_NMBR,40,5L);
            if(Sopt->Toggles[16])
            LineInput("",ID_NAME,40,5L);
            CallerIDLog(1);
          }
		/* OTHERWISE EQUAL, ANSWER AND SET BAUDS */
GO:
		(void)StatClearTime();
 		IO_Flags[IOFLAG_SER_IN]=1;
	    	IO_Flags[IOFLAG_SER_OUT]=0;
/*(JOE)---- added this v*/
if(!TrapDoor)
          {
            SerPutStr(Cmds->MAnswer);
		  SerPutChar('\r');
		  input=LineInput("",string,80,40L);
		  if(input==TIMEOUT)
			 {
		      	goto Timedout;
			  }
		    input=LineInput("",string,80,40L);
		}
          else strcpy(string,TrapConnect);
          strcpy(ConnectString,string);
		if(!TrapDoor)
          {
            //CutConnect(string);
		  if(input==TIMEOUT) { goto Timedout; }
          }
          
//(JOE) add end
            if(ConnectDef(string)) strcpy(ConnectString,string);
            if(!strnicmp(string,"CONNECT ",8)) return(do_baud(atol(&string[8])));
	       Online_Baud=Online_BaudR; SetEnvStat(ENV_AWAITCONNECT);
            goto Timedout; 
		 }            /* end if Chk serial */
       else {
  		continue;
      }

	    /* ELSE RESET, PURGE AND CONTINUE THE LOOP */
Timedout:
	    DropDTR();
	    Delay(25L);
	    if(Cmds->AcLvl[LVL_VARYING_LINK_RATE]==1) {
 		SetBaud(Cmds->OpeningBaud);
	    	Delay(25L);
		}
 	IntDoReset(Cmds->MReset);
 	SerPutChar('\r');
	    Delay(25L);
	    PurgeLine();
	}                                    /* end forever */
 return(SUCCESS);
}


void Server(int Code)
{
   switch(Code)
   {
     case SV_SYSOPLOG:
          strcpy(ConnectString,"SYSOP_LOCAL");
		(void)StatClearTime();
		IO_Flags[IOFLAG_SER_IN]=0;
		IO_Flags[IOFLAG_SER_OUT]=0;
		IO_Flags[IOFLAG_SCR_OUT]=1;
		IO_Flags[IOFLAG_KBD_IN]=1;
		AnsiColor=1;
		QuickFlag=1;
		ConPutStr("[ p\014");
		time(&Time_connect);
		Online_Baud=Cmds->OpeningBaud;
		Online_BaudR=Cmds->OpeningBaud;
		IntDoReset(Sopt->OffHook);
          ServerCmd=SYSOP_LOGON;
          break;
     case SV_LOCALLOG:
	strcpy(ConnectString,"F2_LOCAL");
					    
						(void)StatClearTime();
						IO_Flags[IOFLAG_SER_IN]=0;
						IO_Flags[IOFLAG_SER_OUT]=0;
						IO_Flags[IOFLAG_SCR_OUT]=1;
						IO_Flags[IOFLAG_KBD_IN]=1;
						ConPutStr("[ p\014");
						time(&Time_connect);
						Online_Baud=Cmds->OpeningBaud;
						Online_BaudR=Cmds->OpeningBaud;
						IntDoReset(Sopt->OffHook);
						ServerCmd=LOCAL_LOGON;
          break;
     case SV_ACCOUNTS:
          ServerCmd=SV_ACCOUNTS; break;
     case SV_CHAT:
          ServerCmd=SV_CHAT; break;
     case SV_EXITNODE:
          ServerCmd=SV_EXITNODE; break;
     case SV_NODEOFFHOOK:
          ServerCmd=SV_NODEOFFHOOK; break;
     case SV_INITMODEM:
          ServerCmd=0;ReInitModem();Reset_System(0);IO_Flags[IOFLAG_KBD_IN]=0;IO_Flags[IOFLAG_SCR_OUT]=0;break;
     case SV_INSTANT:
          ServerCmd=SV_INSTANT; break;
     case SV_RESERVE:
          ServerCmd=SV_RESERVE; break;
     case SV_CHATTOGGLE:
          ServerCmd=0; if(SySChat) SySChat=0; else SySChat=1;
          StatChatFlag();
          break;
     case SV_QUIETNODE:
          ServerCmd=0; if(QuietNode) QuietNode=0; else QuietNode=1;
          SendQuietFlag(QuietNode); break;
     case SV_AESHELL:
          ServerCmd=SV_AESHELL; break;
   }
}

