/*********************************************
  SPAZ, I CHANGED A LOT OF THIS CODE
  PLEASE CHECK IT OUT, THERE WAS SO MANY
  CHANGES, MY NAME WOULD HAVE BEEN ALL OVER
  IT.
 *********************************************/
#include "bbs.h"
#include <clib/intuition_protos.h>
#define SEEK_SET 0
#define FOREVER for(;;)
#define NL NULL
#define JH_LI 0
#define JH_REGISTER 1
#define JH_SHUTDOWN 2
#define JH_WRITE 3
#define JH_SM 4
#define JH_PM 5
#define JH_HK 6
#define JH_SG 7
#define JH_SF 8
#define JH_EF 9
#define JH_CO 10
#define JH_BBSName 11
#define JH_Sysop 12
#define JH_FLAGFILE 13
#define JH_SHOWFLAGS 14
#define JH_DL 15
#define JH_ExtHK 15
#define JH_SIGBIT 16
#define JH_FetchKey 17
#define JH_SO 18
/**************************** GET/SET Values from System ***********************/

#define DT_NAME           100
#define DT_PASSWORD       101
#define DT_LOCATION       102
#define DT_PHONENUMBER    103
#define DT_SLOTNUMBER     104
#define DT_SECSTATUS      105
#define DT_SECBOARD       106
#define DT_SECLIBRARY     107
#define DT_SECBULLETIN    108
#define DT_MESSAGESPOSTED 109
#define DT_UPLOADS        110
#define DT_DOWNLOADS      111
#define DT_TIMESCALLED    112
#define DT_TIMELASTON     113
#define DT_TIMEUSED       114
#define DT_TIMELIMIT      115
#define DT_TIMETOTAL      116
#define DT_BYTESUPLOAD    117
#define DT_BYTEDOWNLOAD   118
#define DT_DAILYBYTELIMIT 119
#define DT_DAILYBYTEDLD   120
#define DT_EXPERT         121
#define DT_LINELENGTH     122
#define ACTIVE_NODES      123
#define DT_DUMP           124
#define DT_TIMEOUT        125
#define BB_CONFNAME       126
#define BB_CONFLOCAL      127
#define BB_LOCAL          128
#define BB_STATUS         129
#define BB_COMMAND        130
#define BB_MAINLINE       131
#define NB_LOAD           132
#define DT_USERLOAD       133
#define BB_CONFIG         134
#define CHG_USER          135
#define RETURNCOMMAND     136
#define ZMODEMSEND        137
#define ZMODEMRECEIVE     138
#define SCREEN_ADDRESS    139
#define BB_TASKPRI        140
#define RAWSCREEN_ADDRESS 141
#define BB_CHATFLAG       142
#define DT_STAMP_LASTON   143
#define DT_STAMP_CTIME    144
#define DT_CURR_TIME      145
#define DT_CONFACCESS     146
#define BB_PCONFLOCAL     147
#define BB_PCONFNAME      148
#define BB_NODEID         149
#define BB_CALLERSLOG     150
#define BB_UDLOG          151
#define EXPRESS_VERSION   152
#define SV_UNICONIFY      153
#define BB_CHATSET        162
#define ENVSTAT           163
#define GETKEY            500
#define RAWARROW          501
#define CHAIN             502
/****************** in progress ******************/
#define NODE_DEVICE       503
#define NODE_UNIT         504
#define NODE_BAUD         505
#define NODE_NUMBER       506
#define JH_MCI            507
/*************************************************/
#define PRV_COMMAND       508
#define PRV_GROUP         509
#define BB_CONFNUM        510
#define BB_DROPDTR        511
#define BB_GETTASK        512
#define BB_REMOVEPORT     513
#define BB_SOPT           514
#define NODE_BAUDRATE     516
#define BB_LOGONTYPE      517
#define BB_SCRLEFT        518
#define BB_SCRTOP         519
#define BB_SCRWIDTH       520
#define BB_SCRHEIGHT      521
#define BB_PURGELINE      522
#define BB_PURGELINESTART 523
#define BB_PURGELINEEND   524
#define BB_NONSTOPTEXT    525
#define BB_LINECOUNT      526
#define DT_LANGUAGE       527
#define DT_QUICKFLAG      528
#define DT_GOODFILE       529
#define DT_ANSICOLOR      530
#define MULTICOM          531
#define LOAD_ACCOUNT      532
#define SAVE_ACCOUNT      533
#define SAVE_CONFDB       534
#define LOAD_CONFDB       535
#define GET_CONFNUM       536
#define SEARCH_ACCOUNT    537
#define APPEND_ACCOUNT    538
#define LAST_ACCOUNTNUM   539
#define MOD_TYPE          540
#define DT_ISANSI         541
#define BATCHZMODEMSEND   542
#define DT_MSGCODE        543
#define ACP_COMMAND       544
#define DT_FILECODE       545
#define EDITOR_STRUCT     546
#define BYPASS_CSI_CHECK  547
#define SENTBY            548
#define DT_ADDBIT         1000
#define DT_REMBIT         1001
#define DT_QUERYBIT       1002

#define READIT 1
#define WRITEIT 0
#define HK HtKey
#define PM prompt
#define SG showgfile
#define SF showfile
#define EF EditFile
#define DROP Drop
#define EDITSAVE 1
#define EDITABORT 2
#define EDITEDIT 3
#define EDITLIST 4
#define ANYKEY "press <RETURN> to continue"
/**************************** PARAGON DEFINES ****************************/
#define PG_SHUTDOWN 20
#define PG_CO 2
#define PG_SM 1
#define PG_SO 3
#define PG_CC 4
#define PG_CH 5
#define PG_PM 6
#define PG_HK 8
#define PG_SG 19
#define PG_SF 10
#define PG_EF 12
#define PG_UD 13
#define PG_US 14
#define PG_PS 15
#define PG_CS 16
#define PG_RD 17
#define PG_CL 18
#define PG_TM 21
#define PG_SC 7
#define PG_FF 11
extern int doormsgcode;
extern char ReservedName[];
extern int ReadExtChar(unsigned long wait,unsigned long signal);
int Dropped=0;
extern char *MyVerStr;
LONG DOOR_TIMEOUT = KEYBOARD_TIMEOUT;
extern int Edit(void);
extern char ServerCommand[];
BOOL isparagon = FALSE;
char Screen_Address[200];
int UserIsDoing=-1;
int DoorResult;
extern int AEGoodFile;
extern char lang[];
extern char MsgBuf[100][80];
extern int XIMPort;
unsigned long doorextsig=0L;
extern int checksym;
extern int BypassCSI;

struct MyEditor
{
  SHORT MaxFileLength;
  UBYTE MaxScrLength;
  UBYTE EditorTop;
  UBYTE EditorMaxWidth;
  UBYTE EditorAnsiColor;
  UBYTE EditorAllowLoad;
  UBYTE EditorAllowAbort;
  CPTR  EditorFile;
  CPTR  EditorIncludeFile;
  CPTR  EditorPrependFile;
  CPTR  EditorPostPendFile;
} EditorStruct;

struct JHMessage
{
  struct Message Msg;
  char String[200];
  int Data;
  int Command;
  int NodeID;
  int LineNum;
  unsigned long signal;
  struct Process *task;
  APTR *Semi;
  APTR Filler1;
  APTR Filler2;

} ;

struct JHMessage *servermsg;
struct DoorMsg {
	struct Message Door_Msg;
	short command;
	short data;
	char string[80];
	short carrier;
	};

struct DoorMsg *doormsg;
struct MsgPort *resmp;
char ResPortName[30];
ULONG ResControl(int node)
{
  sprintf(ResPortName,"AEServer.%d",node);
  resmp=CreatePort(ResPortName,0L);
  return((ULONG)(1L<< resmp->mp_SigBit));
}
void DeleteResControl(void)
{
  if(resmp)
              DeletePort((struct MsgPort *)resmp); resmp=0L;
}
void FreeACP(struct JHMessage *servermsg);
BOOL CheckDoorMsg(int Mode)
{
   static BOOL Inac=FALSE;
   register BOOL returnval=FALSE;
   int ch;
   if(Inac) return(0);
   while(servermsg=(struct JHMessage *)GetMsg((struct MsgPort *)resmp))
  {
    
    switch(servermsg->Command)
    {
       case JH_WRITE:
            Inac=TRUE;
            if(UserIsDoing==0)
            { 
            AEPutStr(servermsg->String);} servermsg->Command=UserIsDoing; 
            Inac=FALSE; break;
       case JH_MCI:
            Inac=TRUE; MCIDoor=TRUE;
            ReplyMsg((struct Message *)servermsg);
            mciputstr(servermsg->String); MCIDoor=FALSE;if(servermsg->Data) AEPutStr("\r\n");
            Inac=FALSE; return(returnval);break;
       case  JH_CO:
             Inac=TRUE;
             ConPutStr(servermsg->String); if(servermsg->Data) ConPutStr("\r\n"); 
             Inac=FALSE;break;
       case  JH_SM:
             Inac=TRUE;
             AEPutStr(servermsg->String);if(servermsg->Data) AEPutStr("\r\n");
             Inac=FALSE; break;
       case  JH_PM:
             Inac=TRUE; AEPutStr(servermsg->String);
             if(LineInput("",servermsg->String,servermsg->Data,DOOR_TIMEOUT)<0)
             servermsg->Data=-1; else servermsg->Data=1; Inac=FALSE;break;
       case  JH_HK:
             Inac=TRUE;
             ch=HtKey(servermsg->String);  if(ch<0)servermsg->Data=-1;else servermsg->Data=1;
             servermsg->String[0]=ch; servermsg->String[1]='\0';Inac=FALSE; break;
       case  JH_SG:
             Inac=TRUE;gnsflag=0;
             SG(servermsg->String); Inac=FALSE;break;
       case  JH_SF: Inac=TRUE;gnsflag=0;
             SF(servermsg->String); Inac=FALSE;break;
       case  JH_EF: Inac=TRUE;
             EF(servermsg->String,servermsg->Data,1000); Inac=FALSE;break;
       case  JH_BBSName:
             strcpy(servermsg->String,Cmds->BBSName); break;
       case  JH_Sysop:
             strcpy(servermsg->String,Cmds->SysopName); break;
       case  JH_FLAGFILE:
             AddFlagtoList(servermsg->String); break;
       case  DT_NAME          :
             if(servermsg->Data) strcpy(servermsg->String,User.Name);
             else sprintf(User.Name,"%.31s",servermsg->String);
             break;

       case  DT_PASSWORD      :

		if(servermsg->Data)
			{
			/* get user password */
			strcpy(servermsg->String,"ENCRYPTED");

			} else {

			/* set user password */
			AECryptCpy(User.PassKey,servermsg->String);
			}
             break;

       case  DT_LOCATION      :
             if(servermsg->Data) strcpy(servermsg->String,User.Location);
             else sprintf(User.Location,"%.30s",servermsg->String);
             break;
       case  DT_PHONENUMBER   :
             if(servermsg->Data) strcpy(servermsg->String,User.PhoneNumber);
             else sprintf(User.PhoneNumber,"%.13s",servermsg->String);
             break;
       case  DT_SLOTNUMBER    :
             if(servermsg->Data) sprintf(servermsg->String,"%d",User.Slot_Number);
             else User.Slot_Number=atoi(servermsg->String);
             break;
       case  DT_SECSTATUS     :
             if(servermsg->Data) sprintf(servermsg->String,"%d",User.Sec_Status);
             else { User.Sec_Status=atoi(servermsg->String); ConvertAccess(); }
             break;
       case  DT_SECBOARD      :
             if(servermsg->Data) sprintf(servermsg->String,"%d",User.Sec_Board);
             else User.Sec_Board=atoi(servermsg->String);
             break;
       case  DT_SECLIBRARY    :
             if(servermsg->Data) sprintf(servermsg->String,"%d",User.Sec_Library);
             else User.Sec_Library=atoi(servermsg->String);
             break;
       case  DT_SECBULLETIN   :
             if(servermsg->Data) sprintf(servermsg->String,"%d",User.Sec_Bulletin);
             else User.Sec_Bulletin=atoi(servermsg->String);
             break;
       case  DT_MESSAGESPOSTED:
             if(servermsg->Data) sprintf(servermsg->String,"%d",User.Messages_Posted);
             else User.Messages_Posted=atoi(servermsg->String);
             break;
       case  DT_UPLOADS       :
             if(servermsg->Data) sprintf(servermsg->String,"%d",User.Uploads);
             else User.Uploads=atoi(servermsg->String);
             break;
       case  DT_DOWNLOADS     :
             if(servermsg->Data) sprintf(servermsg->String,"%d",User.Downloads);
             else User.Downloads=atoi(servermsg->String);
             break;
       case  DT_TIMESCALLED   :
             if(servermsg->Data) sprintf(servermsg->String,"%d",User.Times_Called);
             else User.Times_Called=atoi(servermsg->String);
             break;
       case  DT_TIMELASTON    :
             if(servermsg->Data) sprintf(servermsg->String,"%d",User.Time_Last_On);
             else User.Time_Last_On=atol(servermsg->String);
             break;
       case  DT_TIMEUSED      :
             if(servermsg->Data) sprintf(servermsg->String,"%d",User.Time_Used);
             else User.Time_Used=atol(servermsg->String);
             break;
       case  DT_TIMELIMIT     :
             if(servermsg->Data) sprintf(servermsg->String,"%d",Time_limit);
             else Time_limit=atol(servermsg->String);
             break;
       case  DT_TIMETOTAL     :
             if(servermsg->Data) sprintf(servermsg->String,"%d",User.Time_Total);
             else User.Time_Total=atol(servermsg->String);
             break;
       case  DT_BYTESUPLOAD   :
             if(servermsg->Data) sprintf(servermsg->String,"%d",User.Bytes_Upload);
             else User.Bytes_Upload=atol(servermsg->String);
             break;
       case  DT_BYTEDOWNLOAD  :
             if(servermsg->Data) sprintf(servermsg->String,"%d",User.Bytes_Download);
             else User.Bytes_Download=atol(servermsg->String);
             break;
       case  DT_DAILYBYTELIMIT:
             if(servermsg->Data) sprintf(servermsg->String,"%d",BytesADL);
             else BytesADL=atol(servermsg->String);
             break;
       case  DT_DAILYBYTEDLD  :
             if(servermsg->Data) sprintf(servermsg->String,"%d",User.Daily_Bytes_Dld);
             else User.Daily_Bytes_Dld=atol(servermsg->String);
             break;
       case  DT_EXPERT        :
             if(servermsg->Data) sprintf(servermsg->String,"%c",User.Expert);
             else User.Expert=servermsg->String[0];
             break;
       case  DT_LINELENGTH    :
             if(servermsg->Data) sprintf(servermsg->String,"%d",User.LineLength);
             else User.LineLength=atoi(servermsg->String);
             break;
      case  DT_DUMP: 
            DumpActiveUser(servermsg->String); break;
      case  DT_TIMEOUT:
            if(servermsg->Data) sprintf(servermsg->String,"%d",DOOR_TIMEOUT);
            else DOOR_TIMEOUT=atol(servermsg->String);
            break;
      case  BB_CONFNAME:
            if(servermsg->Data) strcpy(servermsg->String,Conference_Name);
            else{ strcpy(Conference_Name,servermsg->String);
                  strcpy(Cmds->ConfName[User.ConfRJoin-1],servermsg->String); 
                }
            break;
      case  BB_CONFLOCAL:
            if(servermsg->Data) strcpy(servermsg->String,Conference_Location);
            else strcpy(Conference_Location,servermsg->String);
            break;  
      case  BB_LOCAL:
            strcpy(servermsg->String,Cmds->BBSLoc); break;
      case  BB_STATUS:
            if(Mode) strcpy(servermsg->String,"ONLINE"); else
            strcpy(servermsg->String,"OFFLINE"); break;
      case  BB_COMMAND:
            serverin[0]=servermsg->String[0]; serverin[1]='\0'; returnval=TRUE; break;
      case  BB_MAINLINE:
            ServerCommand[195]='\0';
            strcpy(servermsg->String,ServerCommand); break;
      case  BB_TASKPRI:
            sprintf(Screen_Address,"%u",Cmds->TaskPri);
            strcpy(servermsg->String,Screen_Address);
            break;
      case  BB_CHATFLAG:
            if(SySChat) strcpy(servermsg->String,"ON");
            else strcpy(servermsg->String,"OFF");
            break;
      case  RAWSCREEN_ADDRESS:
            sprintf(Screen_Address,"%ld",MYScreen);
            strcpy(servermsg->String,Screen_Address);
            break; 
      case  BB_CHATSET:
            if(servermsg->Data)
            {
              sprintf(Screen_Address,"%d",PagedFlag);
              strcpy(servermsg->String,Screen_Address);
            }else PagedFlag=atoi(servermsg->String);
            break;
      case  EXPRESS_VERSION:
            strcpy(servermsg->String,MyVerStr);
            break;
      case  SV_UNICONIFY: 
             ReplyMsg((struct Message *)servermsg); FreeMem(servermsg,servermsg->Msg.mn_Length);
            if(ICON)UnIconifyAE(0); else ScreenToFront(MYScreen);
            continue;break;
    
      case  SV_SYSOPLOG: FreeACP(servermsg);
            Server(SV_SYSOPLOG); continue;break;
      case  SV_LOCALLOG: FreeACP(servermsg);
            Server(SV_LOCALLOG); continue;break;
      case  SV_ACCOUNTS: FreeACP(servermsg);
            Server(SV_ACCOUNTS);continue;break;
      case  SV_EXITNODE:
            ReplyMsg((struct Message *)servermsg);FreeMem(servermsg,servermsg->Msg.mn_Length);
            Server(SV_EXITNODE); continue;break;
      case  SV_INITMODEM:
            ReplyMsg((struct Message *)servermsg);FreeMem(servermsg,servermsg->Msg.mn_Length);
            Server(SV_INITMODEM); continue; break;
      case  SV_NODEOFFHOOK:
            ReplyMsg((struct Message *)servermsg);FreeMem(servermsg,servermsg->Msg.mn_Length);
            Server(SV_NODEOFFHOOK); continue;break;
      case  SV_WHATSUP:
            ReplyMsg((struct Message *)servermsg);FreeMem(servermsg,servermsg->Msg.mn_Length);
            SendMaster(); continue; break;
      case  SV_INSTANT: FreeACP(servermsg);
            Server(SV_INSTANT); continue; break;
      case  SV_RESERVE: FreeACP(servermsg);
            Server(SV_RESERVE); continue; break;
      case  SV_CHATTOGGLE:
            ReplyMsg((struct Message *)servermsg);FreeMem(servermsg,servermsg->Msg.mn_Length);
            Server(SV_CHATTOGGLE); /*StatChatFlag();*/continue; break;
      case  SV_AESHELL: FreeACP(servermsg);
            Server(SV_AESHELL); continue; break;
      case   SV_CHAT: FreeACP(servermsg);
            Server(SV_CHAT); returnval=TRUE; continue;break;
      case  SV_SETNRAMS: ReplyMsg((struct Message *)servermsg);FreeMem(servermsg,servermsg->Msg.mn_Length);
            SetNRAMS(); continue; break;

      case  SV_QUIETNODE: ReplyMsg((struct Message *)servermsg);FreeMem(servermsg,servermsg->Msg.mn_Length);
            Server(SV_QUIETNODE); continue; break;
      case  SV_RESERVENODE: ReplyMsg((struct Message *)servermsg);
            strcpy(ReservedName,servermsg->String);
            FreeMem(servermsg,servermsg->Msg.mn_Length);
            if(ReservedName[0]=='\0') SetEnvStat(ENV_AWAITCONNECT); else
            SetEnvStat(ENV_RESERVE);
            break;
     }  
    ReplyMsg((struct Message *)servermsg);
  }
  return(returnval);
}

void FreeACP(struct JHMessage *servermsg)
{
 ReplyMsg((struct Message *)servermsg); FreeMem(servermsg,servermsg->Msg.mn_Length);
            if(ICON)UnIconifyAE(1); else ScreenToFront(MYScreen);
}
int Control(int node,int Type,int ModType)
{
  struct MsgPort *mp;
  struct JHMessage *msg;
  struct User *tempuserdata;
  struct UserKeys *tempuserkeys;
  struct ConfBase *tempconfdb;
  //char *JhExtPort;
  long XtypeSig;
  long TimeVar;
  long signals;
  int Nodes=0;
  int DoorActive=0;
  int temp;
  int ch;
  int i;
  char date[20];
  char DISPLAY_time[30];
  char string[200];
  char TEMPMENU_Li[200];
  if(strlen(MAINMENU_Li)>199) MAINMENU_Li[198]='\0';
  strcpy(TEMPMENU_Li,MAINMENU_Li);
  strcpy(MAINMENU_Li,"");
  //LineCount = 0;
  if(Type=='I') return(0);

  if(Type=='X')
  {   
	sprintf(GSTR1,"AEDoorPort%d\0",node);
	if(mp=FindPort(GSTR1))
			{
			DoorActive=1;
			} else {
			mp=CreatePort(GSTR1,0L);
			}

  isparagon=FALSE;
  XtypeSig=(1L<< mp->mp_SigBit);
  }    
  else
  {
	sprintf(GSTR1,"DoorControl%d\0",node);
	if(FindPort(GSTR1)) return(0);
	mp=CreatePort(GSTR1,0L);
   
  isparagon=TRUE;
  } 


if(Type=='X')   
while(1)
{
  signals=Wait(XtypeSig | DoorSig);
  if(signals&DoorSig) { CheckDoorMsg(0); continue; }
  while(msg=(struct JHMessage *)GetMsg((struct MsgPort *)mp))
  {
    if(msg->Command!=ACP_COMMAND)msg->LineNum=0;
    switch(msg->Command)
    {
       case JH_REGISTER:
            Nodes++;  
            break;
       case JH_WRITE:
            AEPutStr(msg->String); break;
       case CHAIN:
            Nodes--; break;
       case JH_SHUTDOWN:
             Nodes--;
             
             if(!Nodes)
             {
                RawArrow=0;
                ReplyMsg((struct Message *)msg);
                if(!DoorActive)DeletePort((struct MsgPort *)mp);
                if(MAINMENU_Li[0]!='\0') return(1); else return(0);
             }
             break;
       case  JH_SIGBIT:
             msg->Data=doorextsig;
             break;
       case  RETURNCOMMAND:
             strcpy(MAINMENU_Li,msg->String);
             strcpy(ServerCommand,msg->String); break;
       case  JH_CO:
             ConPutStr(msg->String); if(msg->Data){ ConPutStr("\r\n"); CheckForPause();} break;
       case  JH_SO:
             SerPutStr(msg->String); if(msg->Data){ SerPutStr("\r\n");} break;
       case  JH_SM:
             AEPutStr(msg->String);if(msg->Data)
             { AEPutStr("\r\n"); CheckForPause();}  break;
       case  JH_MCI: MCIDoor=TRUE;
             strcpy(Screen_Address,msg->String);
             mciputstr(Screen_Address);MCIDoor=FALSE; if(msg->Data)
             { AEPutStr("\r\n"); CheckForPause();} break;
       case  JH_PM: AEPutStr(msg->String);
             if(LineInput("",msg->String,msg->Data,DOOR_TIMEOUT)<0)
             msg->Data=-1; else msg->Data=1; break;
       case  JH_LI:
             if(LineInput(msg->String,msg->String,msg->Data,DOOR_TIMEOUT)<0)
             msg->Data=-1; else msg->Data=1; break;
       case  JH_ExtHK: LineCount=0;
             msg->Command=ReadExtChar(DOOR_TIMEOUT,1L << (msg->signal));
             if(msg->Command<0)msg->Data=-1;else msg->Data=1;
             break;
       case  JH_HK: LineCount=0;
             ch=HtKey(msg->String);  if(ch<0)msg->Data=-1;else msg->Data=1;
             msg->String[0]=ch; msg->String[1]='\0'; msg->Command=XIMPort;break;
       case  JH_FetchKey:
             if(CheckCon() || CheckSer())
             {

             msg->Command=ReadChar(DOOR_TIMEOUT);  if(msg->Command<0)msg->Data=-1;else msg->Data=1;
             }
             else { msg->Command=0; msg->Data=1; } break; 
       case  JH_SG:gnsflag=0;
             ChecktoDisplay(msg->String,Screen_Address,1,0); break;
       case  JH_SF:gnsflag=0;
             SF(msg->String); break;
       case  JH_EF:
             if(!EF(msg->String,msg->Data,1000)) msg->Data=-1; else msg->Data=1;break;
       case  JH_BBSName:
             strcpy(msg->String,Cmds->BBSName); break;
       case  JH_Sysop:
             strcpy(msg->String,Cmds->SysopName); break;
       case  JH_FLAGFILE:
             AddFlagtoList(msg->String); break;
       case  DT_NAME          :
             if(msg->Data) strcpy(msg->String,User.Name);
             else sprintf(User.Name,"%.31s",msg->String);
             break;

       case  DT_PASSWORD      :
	             if(msg->Data)
			{
			/* get user password */
			strcpy(msg->String,"ENCRYPTED");
			} else {
			/* set user password */
			AECryptCpy(User.PassKey,msg->String);
			}
		break;

       case  DT_LOCATION      :
             if(msg->Data) strcpy(msg->String,User.Location);
             else sprintf(User.Location,"%.30s",msg->String);
             break;
       case  DT_PHONENUMBER   :
             if(msg->Data) strcpy(msg->String,User.PhoneNumber);
             else sprintf(User.PhoneNumber,"%.13s",msg->String);
             break;
       case  DT_SLOTNUMBER    :
             if(msg->Data) sprintf(msg->String,"%d",User.Slot_Number);
             else User.Slot_Number=atoi(msg->String);
             break;
       case  DT_SECSTATUS     :
             if(msg->Data) sprintf(msg->String,"%d",User.Sec_Status);
             else { User.Sec_Status=atoi(msg->String); ConvertAccess(); }
             break;
       case  DT_SECBOARD      :
             if(msg->Data) sprintf(msg->String,"%d",User.Sec_Board);
             else User.Sec_Board=atoi(msg->String);
             break;
       case  DT_SECLIBRARY    :
             if(msg->Data) sprintf(msg->String,"%d",User.Sec_Library);
             else User.Sec_Library=atoi(msg->String);
             break;
       case  DT_SECBULLETIN   :
             if(msg->Data) sprintf(msg->String,"%d",User.Sec_Bulletin);
             else User.Sec_Bulletin=atoi(msg->String);
             break;
       case  DT_MESSAGESPOSTED:
             if(msg->Data) sprintf(msg->String,"%d",User.Messages_Posted);
             else User.Messages_Posted=atoi(msg->String);
             break;
       case  DT_UPLOADS       :
             if(msg->Data) sprintf(msg->String,"%d",User.Uploads);
             else User.Uploads=atoi(msg->String);
             break;
       case  DT_DOWNLOADS     :
             if(msg->Data) sprintf(msg->String,"%d",User.Downloads);
             else User.Downloads=atoi(msg->String);
             break;
       case  DT_TIMESCALLED   :
             if(msg->Data) sprintf(msg->String,"%d",User.Times_Called);
             else User.Times_Called=atoi(msg->String);
             break;
       case  DT_TIMELASTON    :
             if(msg->Data) sprintf(msg->String,"%d",User.Time_Last_On);
             else User.Time_Last_On=atol(msg->String);
             break;
       case  DT_TIMEUSED      :
             if(msg->Data) sprintf(msg->String,"%d",User.Time_Used);
             else User.Time_Used=atol(msg->String);
             break;
       case  DT_TIMELIMIT     :
             if(msg->Data) sprintf(msg->String,"%d",Time_limit);
             else Time_limit=atol(msg->String);
             break;
       case  DT_TIMETOTAL     :
             if(msg->Data) sprintf(msg->String,"%d",User.Time_Total);
             else User.Time_Total=atol(msg->String);
             break;
       case  DT_BYTESUPLOAD   :
             if(msg->Data) sprintf(msg->String,"%d",User.Bytes_Upload);
             else User.Bytes_Upload=atol(msg->String);
             break;
       case  DT_BYTEDOWNLOAD  :
             if(msg->Data) sprintf(msg->String,"%d",User.Bytes_Download);
             else User.Bytes_Download=atol(msg->String);
             break;
       case  DT_DAILYBYTELIMIT:
             if(msg->Data) sprintf(msg->String,"%d",User.Daily_Bytes_Limit);
             else User.Daily_Bytes_Limit=atol(msg->String);
             break;
       case  DT_DAILYBYTEDLD  :
             if(msg->Data) sprintf(msg->String,"%d",User.Daily_Bytes_Dld);
             else User.Daily_Bytes_Dld=atol(msg->String);
             break;
       case  DT_EXPERT        :
             if(msg->Data) sprintf(msg->String,"%c",User.Expert);
             else User.Expert=msg->String[0];
             break;
       case  DT_LINELENGTH    :
             if(msg->Data) sprintf(msg->String,"%d",User.LineLength);
             else User.LineLength=atoi(msg->String);
             break;
       case  ACTIVE_NODES:
		i=0;
		while(i<32)		// 32 Nodes
			{
			sprintf(GSTR1,"AmiExpress_Node.%d\0",i);
			if(FindPort(GSTR1))
				{
				msg->String[i]='X';
				} else {
				msg->String[i]=' ';
				}			
			i++;
			}
		break;

      case  DT_DUMP:
            DumpActiveUser(msg->String); break;
      case  DT_MSGCODE:
            switch(msg->Data)
            {
              case 1: doormsgcode=1; break;
              case 2: doormsgcode=0; break;
              default: msg->Data=doormsgcode;
            }break;
      case  ENVSTAT:
            if(msg->Data)
            {
              sprintf(Screen_Address,"%d",UserIsDoing); 
              strcpy(msg->String,Screen_Address);
            }
            else { UserIsDoing=atoi(msg->String);
            SetEnvStat(atoi(msg->String)); } break; 
      case  SV_NEWMSG:
            strcpy(Screen_Address,msg->String);
            SetEnvMsg(Screen_Address); break;
      case  DT_TIMEOUT:
            if(msg->Data) sprintf(msg->String,"%d",DOOR_TIMEOUT);
            else DOOR_TIMEOUT=atol(msg->String);
            break;
      case  BB_CONFNAME:
            if(msg->Data) strcpy(msg->String,Conference_Name);
            else{ strcpy(Conference_Name,msg->String);
                  strcpy(Cmds->ConfName[User.ConfRJoin-1],msg->String); 
                }
            break;
      case  BB_CONFLOCAL:
            if(msg->Data) strcpy(msg->String,Conference_Location);
            else
            {
               strcpy(Conference_Location,msg->String);
             strcpy(GSTR1,Conference_Location);
             if(MaxDirs=IntFromIcon(GSTR1,"NDIRS")) {
              strcpy(GSTR1,Conference_Location);
              if(IsFromIcon(GSTR1,"FREEDOWNLOADS")) FreeDownloads=1; else FreeDownloads=0;
             }
            }
            break;  
      case  BB_LOCAL:
            strcpy(msg->String,Cmds->BBSLoc); break;
      case  ZMODEMSEND:
            DTBT=0;
            TBT=0;
            TTTM=NULL;
            TTEFF=NULL;
            TTCPS=NULL;
            strcpy(Screen_Address,msg->String);
            ch=Zmodem_Send(Screen_Address);
            if(Whence_The_Logon==REMOTE_LOGON && !CheckCarrier()) msg->Data=-2;
            else
              msg->Data=ch;
             break;
      case  BATCHZMODEMSEND:
            DTBT=0;
            TBT=0;
            TTTM=NULL;
            TTEFF=NULL;
            TTCPS=NULL;
            strcpy(Screen_Address,msg->String);
            ch=Zmodem_Send(msg->Filler1);
            if(Whence_The_Logon==REMOTE_LOGON && !CheckCarrier()) msg->Data=-2;
            else
              msg->Data=ch;
             break;
      case  ZMODEMRECEIVE:
            DTBT=0;
            TBT=0;
            TTTM=NULL;
            TTEFF=NULL;
            TTCPS=NULL;
            strcpy(Screen_Address,msg->String);
            ch=Zmodem_Receive(Screen_Address,1); 
            if(Whence_The_Logon==REMOTE_LOGON && !CheckCarrier()) msg->Data=-2;
            else
              msg->Data=ch;
            break;
      case  SCREEN_ADDRESS:
            sprintf(Screen_Address,"%08x",MYScreen);
            strcpy(msg->String,Screen_Address);
            break; 

      case  BB_TASKPRI:
            sprintf(Screen_Address,"%u",Cmds->TaskPri);
            strcpy(msg->String,Screen_Address);
            break;
      case  RAWSCREEN_ADDRESS:
            sprintf(Screen_Address,"%ld",MYScreen);
            strcpy(msg->String,Screen_Address);
            break; 
      case  BB_CHATFLAG:
            if(SySChat) strcpy(msg->String,"ON");
            else strcpy(msg->String,"OFF");
            break;
      case  BB_CHATSET:
            if(msg->Data)
            {
              sprintf(Screen_Address,"%d",PagedFlag);
              strcpy(msg->String,Screen_Address);
            }else PagedFlag=atoi(msg->String);
            break;
      case  DT_STAMP_LASTON:
                  sprintf(string,"%s",ctime(&User.Time_Last_On));
                  string[strlen(string)-1]='\0';
                  strcpy(msg->String,string); break;
       case DT_CURR_TIME:
            TimeVar=time(NULL);
            sprintf(string,"%d",TimeVar);
            strcpy(msg->String,string); break;
       case DT_STAMP_CTIME:
                  TimeVar=0L;
                  Time_system=time(&TimeVar);
            sprintf(string,"%s",ctime(&Time_system));
            string[strlen(string)-1]='\0';
            strcpy(msg->String,string); break;
       case DT_CONFACCESS:
            if(msg->Data) strcpy(msg->String,User.Conference_Access);
            else strcpy(User.Conference_Access,msg->String);
            break;
       case  BB_PCONFNAME:
            temp=atoi(msg->String); 
            if(temp<1 || temp>9)
            {
              strcpy(msg->String,"ERROR"); break;
            }
            strcpy(msg->String,Cmds->ConfName[temp-1]);
            break;
       case BB_PCONFLOCAL:
            temp=atoi(msg->String);
            if(temp<1 || temp>9)
            {
              strcpy(msg->String,"ERROR"); break;
            }
            strcpy(msg->String,Cmds->ConfLoc[temp-1]);
            break;
       case BB_MAINLINE:
            ServerCommand[195]='\0';
            strcpy(msg->String,ServerCommand); break; 
       case BB_NODEID:
            sprintf(Screen_Address,"%d",Cmds->AcLvl[LVL_NODE_NUMBER]);
            strcpy(msg->String,Screen_Address); break;
       case BB_CALLERSLOG:
            CallersLog(msg->String); break;
       case BB_UDLOG:
            UDLog(msg->String); break;
       case EXPRESS_VERSION:
            strcpy(msg->String,MyVerStr); break;
       case GETKEY:
            if(CheckSer() || CheckCon())
            msg->String[0]='1'; else msg->String[0]='0';
            msg->String[1]='\0';
            break;
       case RAWARROW:
            if(RawArrow) RawArrow=0; else RawArrow=1;
            break;
       case PRV_COMMAND:
            strcpy(ServerCommand,msg->String);
            MenuCommand(ServerCommand);
            break;
       case PRV_GROUP:
            strcpy(ServerCommand,msg->String);
            temp=atoi(ServerCommand);
            strcpy(Cmds->ConfLoc[temp],&ServerCommand[40]);
            if(temp==CN-1) strcpy(Conference_Location,&ServerCommand[40]);
            ServerCommand[39]='\0';
            StripReturn(ServerCommand);
            strcpy(Cmds->ConfName[temp],&ServerCommand[2]);
            if(temp==CN-1) strcpy(Conference_Name,&ServerCommand[2]);
            break;
       case BB_CONFNUM:
            sprintf(ServerCommand,"%d",CN-1);
            strcpy(msg->String,ServerCommand);
            break;
       case BB_DROPDTR:
            ModemOffHook(); break;
       case BB_GETTASK:
            msg->task=(struct Process *)FindTask(0L);
            break;
       case NODE_BAUD:
            sprintf(Screen_Address,"%ld",Online_Baud);
            strcpy(msg->String,Screen_Address);break;
       case NODE_BAUDRATE:
            sprintf(Screen_Address,"%ld",Online_BaudR);
            strcpy(msg->String,Screen_Address);break;
       case NODE_DEVICE:
            strcpy(msg->String,Cmds->SerDev); break;
       case NODE_UNIT:
            sprintf(Screen_Address,"%d",Cmds->SerDevUnit);
            strcpy(msg->String,Screen_Address);
            break;
       case DT_ADDBIT:
            ADD_BIT(msg->Data); break;
       case DT_REMBIT:
            REM_BIT(msg->Data); break;
       case DT_QUERYBIT:
            msg->Command=GET_BIT(msg->Data); break;
       case BB_LOGONTYPE:
             msg->Data=Whence_The_Logon;
            break;
       case BB_SCRLEFT: msg->Data=MYNewScreen.LeftEdge; break;
       case BB_SCRTOP: msg->Data=MYNewScreen.TopEdge; break;
       case BB_SCRWIDTH: msg->Data=MYNewScreen.Width; break;
       case BB_SCRHEIGHT: msg->Data=MYNewScreen.Height; break;
       case BB_PURGELINE: PurgeLine(); break;
       case BB_PURGELINESTART: PurgeLineStart(); break;
       case BB_PURGELINEEND: PurgeLineEnd(); break;
       case BB_NONSTOPTEXT: if(!msg->Data) gnsflag=0; else gnsflag=1;
            break;
       case BB_LINECOUNT: if(!msg->Data) LineCount=atoi(msg->String);
            else { sprintf(Screen_Address,"%d",LineCount); strcpy(msg->String,Screen_Address); }
            break;
       case DT_LANGUAGE: if(msg->Data) strcpy(msg->String,lang); else
            strcpy(lang,msg->String); break; 
       case DT_QUICKFLAG:
            QuickFlag=msg->Data;
            break;
       case DT_GOODFILE:
            AEGoodFile=msg->Data; break;
       case DT_ANSICOLOR:
             if(msg->Data) { AnsiColor=1;  }
             else { AnsiColor=0;  }
             break;
       case DT_ISANSI:
            if(AnsiColor) msg->Data=1;
            else msg->Data=0; break;
       case MULTICOM:
            msg->Semi=(APTR)MasterNode;
            break;
       case LOAD_ACCOUNT:
            tempuserdata=msg->Filler1; tempuserkeys=msg->Filler2;
            msg->NodeID=0;
            if(User.Slot_Number==msg->Data)
              {
                SaveMsgPointers(CN); //AddMsgPointers(); 
                CopyMem((struct User *)&User,tempuserdata,sizeof(struct User));
                CopyMem((struct UserKeys *)&User_keys,tempuserkeys,sizeof(struct UserKeys));
                LoadMsgPointers(CN);
                msg->NodeID=1; 
              }
              else
             {
            if(Load_Account(msg->Data,msg->Filler1,msg->Filler2)!=FAILURE) msg->NodeID=1;  
            }
            msg->Data=msg->NodeID;
            break;
       case SEARCH_ACCOUNT:
            if(Find_User_From_Number(msg->Data,msg->Filler1)) msg->Data=1; else
            msg->Data=0;
            break;
       case APPEND_ACCOUNT:
            tempuserdata=(struct User *)msg->Filler1;
            tempuserkeys=(struct UserKeys *)msg->Filler2;
            InitUser(tempuserdata,tempuserkeys);
            Find_Open_Account(tempuserdata,tempuserkeys);
            break;
       case LAST_ACCOUNTNUM:
            msg->Data=(int) Find_Last_Account();
            break;
       
       case SAVE_ACCOUNT:
            tempuserdata=(struct User *)msg->Filler1;
            tempuserkeys=(struct UserKeys *)msg->Filler2;
            if(tempuserdata->Slot_Number==0)
            {
              tempuserkeys->Number=0;
              Save_Account(tempuserdata,tempuserkeys,msg->Data,1);
            }
            else

            Save_Account(tempuserdata,tempuserkeys,0,0);

            if(User.Slot_Number==msg->Data)
            {
             i=0; 
             if(User.Sec_Status!=tempuserdata->Sec_Status || !stricmp(User.Conference_Access,tempuserdata->Conference_Access)) i=1;
             CopyMem(tempuserdata,(struct User *)&User,sizeof(struct User));
             CopyMem(tempuserkeys,(struct UserKeys *)&User_keys,sizeof(struct UserKeys));
             Time_limit=User.Time_Total-User.Time_Used;
             LoadMsgPointers(CN);
             if(i) ConvertAccess();
              
            }

            break;
       case EDITOR_STRUCT:
            if(msg->Data)
            {
               CopyMem(msg->Filler1,(APTR)&EditorStruct,sizeof(struct MyEditor));
            }else CopyMem((APTR)&EditorStruct,msg->Filler1,sizeof(struct MyEditor));
            break;
       case LOAD_CONFDB:

            Load_ConfDB(msg->Data,msg->NodeID,msg->Filler1);
            tempconfdb=msg->Filler1;
            break;
       case SAVE_CONFDB:
            tempconfdb=msg->Filler1;
         Save_ConfDB(msg->Data,msg->NodeID,msg->Filler1);
     if(User.Slot_Number==msg->Data) LoadMsgPointers(CN);
       
            break;
       case GET_CONFNUM:
            GetConfName((char *)msg->Filler1,(char *)msg->Filler2,msg->Data);
            GetConfName(GSTR1,GSTR2,CN-1);  break;
       case MOD_TYPE: msg->Data=ModType; break;
       case DT_FILECODE: checksym=msg->Data; break;
       case ACP_COMMAND:
            SendACPCommand(msg->String,msg->Data,msg->LineNum);
            break;
       case BYPASS_CSI_CHECK:
            BypassCSI=msg->Data; break;
       case SENTBY:
            msg->Data=Cmds->AcLvl[20]; break;


    }
    ReplyMsg((struct Message *)msg);
  }
}
else
while(1)
{
  doormsg=(struct DoorMsg *)WaitPort((struct MsgPort *)mp);
  while(doormsg=(struct DoorMsg *)GetMsg((struct MsgPort *)mp))
  {
    doormsg->carrier=FALSE;
    switch(doormsg->command)
    {
       case PG_SHUTDOWN:
             strcpy(string,"Exiting");
                ReplyMsg((struct Message *)doormsg);
                DeletePort((struct MsgPort *)mp);
                AEPutStr("\r\n"); RawArrow=0;return(0);
             break;
       case  PG_SO: SerPutChar((char *)&(doormsg->data)); break;
       case  PG_CC: ConPutChar((char *)&(doormsg->data)); break;
       case  PG_CH: SerPutChar((char *)&(doormsg->data)); 
                    ConPutChar((char *)&(doormsg->data));break;
       case  PG_CO:
             ConPutStr(doormsg->string); if(doormsg->data){ ConPutStr("\r\n");
CheckForPause(); }break;
       case  PG_SM:
             AEPutStr(doormsg->string);if(doormsg->data){ AEPutStr("\r\n");
CheckForPause();} break;
       case  PG_PM:AEPutStr(doormsg->string);
             if(LineInput("",doormsg->string,doormsg->data,DOOR_TIMEOUT)<0)
             doormsg->carrier=TRUE; else doormsg->carrier=FALSE;break;
        case  PG_SC:AEPutStr(doormsg->string);
             if(LineInput("",doormsg->string,doormsg->data,DOOR_TIMEOUT)<0)
             doormsg->carrier=TRUE; else doormsg->carrier=FALSE;break;
       case  PG_HK:
             ch=HtKey(doormsg->string);  if(ch<0)doormsg->carrier=TRUE;else doormsg->carrier=FALSE;
             doormsg->string[0]=ch; doormsg->string[1]='\0'; break;
       case  PG_SG:gnsflag=0;MCIViewSafe=FALSE;
             SG(doormsg->string); MCIViewSafe=TRUE;break;
       case  PG_SF:gnsflag=0;
             MCIViewSafe=FALSE;SF(doormsg->string);MCIViewSafe=TRUE; break;
       case  PG_EF:
             EF(doormsg->string,75,doormsg->data); break;
       case  PG_UD:
               if(doormsg->data==1){ doormsg->data=User.Sec_Status/10; break; }
               if(doormsg->data==2){ doormsg->data=User.Expert; break; }
               if(doormsg->data==3){ doormsg->data=0; break; }
               if(doormsg->data==4){ doormsg->data=User.Times_Called; break;}
               if(doormsg->data==5){ doormsg->data=User.Times_Called; break;}
               if(doormsg->data==6){ doormsg->data=1; break;}
               if(doormsg->data==7){ doormsg->data=(int)(Time_limit/60L); break; }
               if(doormsg->data==8){ doormsg->data=80; break; }
               if(doormsg->data==9){ doormsg->data=User.LineLength; break; }
               break;
       case  PG_US:
               if(doormsg->data==1){ strcpy(doormsg->string,User.Name);doormsg->string[21]='\0'; break;}
               if(doormsg->data==2){ strcpy(doormsg->string,User.Pass);doormsg->string[13]='\0'; break;}
               if(doormsg->data==3){ strcpy(doormsg->string,User.Location);doormsg->string[39]='\0'; break; }
               if(doormsg->data==4){ strcpy(doormsg->string,User.Location);doormsg->string[29]='\0'; break; }
               if(doormsg->data==5){ strcpy(doormsg->string,User.Location);doormsg->string[2]='\0'; break; }
               if(doormsg->data==6){ strcpy(doormsg->string,User.Location);doormsg->string[7]='\0'; break; }
               if(doormsg->data==7){ strcpy(doormsg->string,"PGDOORS:"); break;}
               if(doormsg->data==8){ strcpy(doormsg->string,Cmds->BBSLoc); break;}
                
               if(doormsg->data==9){ strcpy(doormsg->string,GetTheDate(0L)); break;}
               if(doormsg->data==10)
               
               {
                  Time_system=time(NULL);
                  sprintf(string,"%s",ctime(&Time_system));
                  Convert_CTime_To_Date(string,date,DISPLAY_time);
                  strcpy(doormsg->string,DISPLAY_time); break;
               }
              strcpy(doormsg->string,""); break;
       case PG_PS: break;
       case PG_CS: break;
       case PG_RD: if(doormsg->data==0) break; else doormsg->data=rnd(doormsg->data); break;
       case PG_CL: break;
       case PG_TM: User.Time_Used -=((LONG)doormsg->data)*60L; 
                   if(User.Time_Used<0L)User.Time_Used=0L;
                   Time_limit +=((LONG)doormsg->data)*60L;
                   if(Time_limit<0L) Time_limit=0L;
                   break;
       case PG_FF: if(!access(doormsg->string,00)) doormsg->data=1; else
       doormsg->data=-1; break;
         case  BB_TASKPRI:
            sprintf(Screen_Address,"%u",Cmds->TaskPri);
            strcpy(msg->String,Screen_Address);
            break;
   
     }   
    ReplyMsg((struct Message *)doormsg);
  }
}
  RawArrow=0;
}



/* showfile(mstring) shows the text file which mstring is the path to.
*/
void showfile(mstring)
char mstring[];
{      
        if(!access(mstring,00))
        {
          DisplayFile(mstring);
        }
}
void showgfile(mstring)
char mstring[];
{
  char FileName[80];
  strcpy(FileName,mstring);
  strcat(FileName,".GR1");

        if(!access(FileName,00))
        {
          DisplayFile(FileName);
        }
        else 
        {
          strcpy(FileName,mstring);
          strcat(FileName,".TXT.GR");
          if(!access(FileName,00))
          {
            DisplayFile(FileName);
          }
          else
          {
            strcpy(FileName,mstring);
            strcat(FileName,".TXT");
            if(!access(FileName,00))
            {
              DisplayFile(FileName);
            }
          }
        }
}
extern int Lines;
int EditFile(char mstring[],int End,int Length)
{
  FILE *fi;
  int stat;
  Lines=0;
  LoadMsg(mstring);
  stat=Edit();
  if(stat==TIMEOUT||stat==NO_CARRIER) return(0);
  if(stat<0) { AEPutStr("\r\n"); return(1); }
  AEPutStr("Saving...");
  if(!(fi=fopen(mstring,"w")))
  {
    AEPutStr("Failed!\r\n\r\n");
    return(1);
  }
  for(stat=0;stat<Lines;stat++)
    fprintf(fi,"%s\n",MsgBuf[stat]);
   fclose(fi);
  return(1);
}
int HtKey(char *prompt)
{
int ch;
LineCount=0;
AEPutStr(prompt);
	ch=(int)ReadChar(DOOR_TIMEOUT);
       /* if(isparagon==TRUE)*/ return(ch);
	/*if(ch=='\r' || ch=='\n') ch='\0'; return(ch);*/
} 
VOID DumpActiveUser(char *FileName)
{
  FILE *fi;
  fi=fopen(FileName,"wb");
  fwrite((APTR)&User,sizeof(struct User),1,fi);
  fclose(fi);
}

int DisplayFile(char *s)
{
  int result;
  MCIDoor=TRUE;
  result=MenuSend24(s,0);MCIDoor=FALSE;
  return(result);

}
void CheckRexxInterface(char *arg1,char *returnstr)
{
   static BOOL Inac=FALSE;
   int Command;
   strcpy(returnstr,"BUSY");
   if(Inac) return;
   strcpy(returnstr,"");
   //if(*(arg1)!=0) Command=atoi(arg1);
   if(!strnicmp(arg1,"GETDATA",7))
   {
     Command=atoi(arg1+8);
     switch(Command)
     {
      case  BB_CHATFLAG:
            if(SySChat) strcpy(returnstr,"ON");
            else strcpy(returnstr,"OFF");
            break;
   
     }
     return;
    }
  
    if(!strnicmp(arg1,"AESAYLN",7))
    {
       Inac=TRUE;
       AEPutStr(arg1+8);
       AEPutStr("\r\n");
       Inac=FALSE;
       return;
    }
    if(!strnicmp(arg1,"AESAY",5))
    {
       Inac=TRUE;
       AEPutStr(arg1+6);
       Inac=FALSE;
       return;
    }
   
}

