#include "bbs.h"
#include <clib/intuition_protos.h>
int CallMsgFuncs(WORD which,int pass);
int RelNum=0;
void ScanHoldDesc(void);
int ConnectDef(char *s);
extern struct myst my_struct;           /* temp */
extern void who(int opt);
/******* Fix so user only sees the Bulletins once *******/
int BatchError;
int CommentToSYSOP(void);
int IsFromConf(int Conf,char *c);
int GetFromConf(int Conf,char *c,char *buf);
int IntFromConf(int Conf,char *c);
extern int Valer;
int ALL;
char NetConf[30];
extern char prototitle[];
void FileStatus(int opt);
extern int NotRelative;
char TEMPMENU_Li[255];
BYTE Didsomething;
int GetInverse(int CN);
int RelConf(int CN);
static int JEZoom(void);
int PagesAllowed;
extern int relogon;
extern int templogon;
extern int loadedmsg;
static BOOL no_scrn_clr = FALSE;
int Wild(char *s);
int Join_Conference(int cn)
{
 char string[200];
 int mystat,TCN,ch;
 long temp;
 if(!cn) {
     if(strlen(MAINMENU_Li)>1) {
         strcat(MAINMENU_Li," -1 ");
         sscanf(MAINMENU_Li,"%s %d",&string,&TCN);
TCN=GetInverse(TCN);

         if(TCN<1||TCN>Boards_Are_Active)            goto CNTJoin;
         
         goto JOINit;
     }
CNTJoin:
     sprintf(GSTR1,"%sJoinConf",Sopt->NodeScreen);
     if(!(mystat=ChecktoDisplay(GSTR1,GSTR2,1,0)))
         UnAvailNotice(GSTR2,GSTR1);

     AEPutStr("Conference Number: ");  GetConfName(Conference_Name,Conference_Location,CN-1);

     mystat=LineInput("",string,8,KEYBOARD_TIMEOUT);
     if(mystat<0)  return(NO_CARRIER);
     if(strlen(string)==0) { AEPutStr("\r\n");
      return(SUCCESS); }

     sscanf(string,"%d",&TCN);
     TCN=GetInverse(TCN);
     if(TCN<1||TCN>Boards_Are_Active) {  GetConfName(Conference_Name,Conference_Location,CN-1);

         AEPutStr("\r\nNot a valid conference number\r\n\r\n");
         return(SUCCESS);
     }
 } else  TCN=cn;

JOINit:
 if(!IsValidConf(TCN-1)||TCN>Boards_Are_Active) {
     TCN=CN;
     if(!cn)
         AEPutStr("\r\nYou do not have access to requested conference\r\n\r\n");
     return(SUCCESS);
 }
 GetConfName(Conference_Name,Conference_Location,TCN-1);
 if(Conference_Location[0]=='\0')
 {
   CallersLog("\t****Conference Location unknown in MENU routines****\n");
   sprintf(GSTR1,"\t**** For Conference %d\n",TCN);
   CallersLog(GSTR1);
 }
 RelNum=RelConf(TCN);
 if(!cn) {
     sprintf(string,"\t%s (%d) Conference Joined\n",Conference_Name,RelNum);
     CallersLog(string);
 }
 if(!cn)
  
     sprintf(string,"\r\n[32mJoining Conference[33m: [0m%s\r\n",Conference_Name);
 else
     sprintf(string,"[32mScanning Conference[33m: [0m%s...",Conference_Name);

 AEPutStr(string);
 
   if(!GetFromConf(TCN-1,"CONF_NETID",NetConf)) strcpy(NetConf,"");
 if(!cn)
 {
  if(strlen(NetConf)>3)
 {
   if(NetConf[0]=='H' || NetConf[0]=='h')
 sprintf(string,"[36mNetNode: [33m%s , [36mHost to NetConf: [33m%s[0m\r\n",Sopt->BBSConfig,&NetConf[3]);
   else
 sprintf(string,"[36mNetNode: [33m%s , [36mSub to NetConf: [33m%s[0m\r\n",Sopt->BBSConfig,&NetConf[3]);
   AEPutStr(string);
 }
 }
 if(!cn) AEPutStr("\r\n");
 CN=TCN;
 if(!cn) User.ConfRJoin=CN;

 LoadMsgPointers(CN);
 
 mystat=GetMailStatFile();
 if(mystat==FAILURE)     return(FAILURE);
 if(Last_Msg_Read_Conf<MailStat.LowestNotDel) Last_Msg_Read_Conf=MailStat.LowestNotDel;
 if(Last_New_Read_Conf<MailStat.LowestNotDel) Last_New_Read_Conf=MailStat.LowestNotDel;
 FreeDownloads=1;

 strcpy(GSTR1,Conference_Location);
 if(MaxDirs=IntFromConf(TCN-1,"NDIRS")) {
     if(IsFromConf(TCN-1,"FREEDOWNLOADS")) {
         FreeDownloads=0;
     }   else
         FreeDownloads=1;
    
 }

 if(!GetFromConf(TCN-1,"SCREENS",Screen_Location))
       strcpy(Screen_Location,Conference_Location);
 if(!cn)
 {    
     strcpy(GSTR1,Screen_Location);
     strcat(GSTR1,"BULL");
     if(ch=ChecktoDisplay(GSTR1,GSTR2,1,1)) {
         ch=DoPause();
         if(ch<0)  return(ch);
         AEPutStr("\r\n");

     }
     if(BatchError<0) return(BatchError);
 }
 if(Last_Msg_Read_Conf>MailStat.HighMsgNum)
     Last_Msg_Read_Conf=0;

 if(Last_New_Read_Conf>MailStat.HighMsgNum)
     Last_New_Read_Conf=0;

 if(!cn) {
   if(MailStat.LowestKey>1)
   {
     sprintf(string,"[32mMessages range from [33m( [0m%ld [32m- [0m%ld [33m)[0m\r\n",
                 MailStat.LowestKey,MailStat.HighMsgNum-1);
   }else
 sprintf(string,"\r\n[32mTotal messages           [33m:[0m %ld\r\n",MailStat.HighMsgNum-1);      
   AEPutStr(string);
   
 temp=Last_New_Read_Conf-1;
 if(temp<0)  temp=1;

 sprintf(string,"\r\n[32mLast message auto scanned[33m:[0m %ld\r\n",temp);
 AEPutStr(string);

     sprintf(string,"[32mLast message read        [33m:[0m %ld\r\n\r\n",Last_Msg_Read_Conf);
 AEPutStr(string);

 
 }
 mystat=CallMsgFuncs(3,cn);
 SaveMsgPointers(CN);
return(mystat);
}

static void DisMenu(void)
{
 int stat;

 if(no_scrn_clr == FALSE)     /* dont do screen clear code */
    if(User_keys.Userflags & USER_SCRNCLR)  AEPutStr("\f");   // (RTS) Screen CLEAR
 sprintf(GSTR1,"%sMenu",Screen_Location);

 if(!(stat=ChecktoDisplay(GSTR1,GSTR2,1,0)))
     UnAvailNotice(GSTR2,GSTR1);
 no_scrn_clr = FALSE;     /* dont do screen clear code */
}


static void UserStatus(void)
{
 long TimeVar;
 char string[100],c[100], temp[100];

 TimeVar=Time_Last_On;
 sprintf(string,"%s",ctime(&TimeVar));
 Convert_CTime_To_Date(string,c,temp);

 /** Display Users Stat's **/

 AEPutStr("\r\n");
 
 if(NotRelative)
 {
 sprintf(string,"[32mArea Name  [33m:[0m %s\r\n",User.Conference_Access);
   AEPutStr(string);
 }
 sprintf(string,"[32mCaller Num.[33m:[0m %u\r\n",System_Calls);
 AEPutStr(string);
 sprintf(string,"[32mLst Date On[33m:[0m %s\r\n",c);
 AEPutStr(string);
 sprintf(string,"[32mSecurity Lv[33m:[0m %d\r\n",User.Sec_Status);
 AEPutStr(string);

 sprintf(string,"[32m# Times On [33m:[0m %u\r\n",User.Times_Called);
 AEPutStr(string);

//(RTS) Thu Apr 30 18:18:13 1992
 sprintf(string,"[32mOnline Baud[33m:[0m %ld\r\n",Online_Baud);
 AEPutStr(string);
// (RTS) Fri Mar 27 13:41:27 1992
 if(User_keys.UPcps > 6000)
     strcpy(string,"[32mRate CPS UP[33m:[0m 0\r\n");
 else
     sprintf(string,"[32mRate CPS UP[33m:[0m %d\r\n",User_keys.UPcps);
  AEPutStr(string);

 if(User_keys.DNcps > 6000)
    strcpy(string,"[32mRate CPS DN[33m:[0m 0\r\n");
 else
    sprintf(string,"[32mRate CPS DN[33m:[0m %d\r\n",User_keys.DNcps);
 AEPutStr(string);

 /*(RTS)** User FLags ****/
 if(User_keys.Userflags & USER_SCRNCLR)
    strcpy(string,"[32mScreen  Clr[33m:[0m YES\r\n");
 else
    strcpy(string,"[32mScreen  Clr[33m:[0m NO\r\n");

 AEPutStr(string);
    sprintf(string,"[32mProtocol   [33m:[0m %s\r\n",prototitle);
 AEPutStr(string);
 if(PagesAllowed!=-1)
 {
    sprintf(string,"[32mSysop Pages Remaining[33m:[0m %d\r\n",PagesAllowed);
    AEPutStr(string);
 }
 AEPutStr("\r\n");
 
 FileStatus(1);
}
void FileStatus(int opt)
{
 int valid=0;
 int j=0,i,s;char string[200];
 int k,t=0;
 if(!opt) s=Boards_Are_Active;
 else s=CN; 
 if(GET_BIT(ACS_CONFERENCE_ACCOUNTING)) t=1;
 AEPutStr("\r\n");
 sprintf(string,"[32m              Uploads            Downloads\r\n");
 AEPutStr(string);
 sprintf(string,"[32m     Conf  Files    Bytes     Files    Bytes     Bytes Avail  Ratio\r\n");
 AEPutStr(string);
 AEPutStr("[0m     ----  -------  --------- -------  --------- -----------  -----\r\n");
 SaveMsgPointers(CN);
 for(i=0;i<s;i++)
 {
   if(IsValidConf(i)) { j++; valid=TRUE; } else valid=FALSE;
   if(!opt || i==CN-1)
   {
      if(valid)
   {
      if(!t) k=i+1; else k=j;
      LoadMsgPointers(i+1);
  if(User.Sec_Library)
 sprintf(string,"[33m     %4d[0m> [3%dm%7d  %9ld %7d  %9ld   %9ld   %d[0m:[3%dm1\r\n",
         k, i==CN-1?3:6,User.Uploads,User.Bytes_Upload,User.Downloads,User.Bytes_Download,User.Daily_Bytes_Limit-User.Daily_Bytes_Dld,User.Sec_Library,i==CN-1?3:6);
 else
sprintf(string,"[33m     %4d[0m> [3%dm%7d  %9ld %7d  %9ld   %9ld  [31mDSBLD\r\n",
         k,i==CN-1?3:6,User.Uploads,User.Bytes_Upload,User.Downloads,User.Bytes_Download,User.Daily_Bytes_Limit-User.Daily_Bytes_Dld);

 AEPutStr(string);
    }
  }
 }
 AEPutStr("[0m\r\n");
 LoadMsgPointers(CN);
 
}

void user_INFO(struct myst *ms);
void cps_show(struct myst *ms);

int IntFromFile(char *s,char *temp)
{
 int tempval;
 FILE *fp;

 temp[0]='\0';

 if(fp=fopen(s,"r")) {
     fgets(temp,50,fp);
     fclose(fp);
     if(temp[0]!='\0') {
         sscanf(temp,"%d",&tempval);
         return(tempval);
     }
 }
 return(0);
}



void Clear_Online_Status(void)
{
 Time_holder=0L;
}

static int CCom(void)
{
 int i,i2,stat;
 char str[81],DISPLAY_time[30],string[200],date[20],buff[255];

 Time_system=time(NULL);
 sprintf(string,"%s",ctime(&Time_system));
 Convert_CTime_To_Date(string,date,DISPLAY_time);
 sprintf(str,"\tOperator Paged at (%s)\n",DISPLAY_time);
 CallersLog(str);

 ConPutStr("\r\nF1 Toggles chat\r\n");

 /* show our page sign to user */
 sprintf(buff,"%s\r\nPaging %s (CTRL-C to Abort). .",ctime(&Time_system),Cmds->SysopName);
 AEPutStr(buff);
 for(i=0; i<20; i++) {
     DisplayBeep(NULL);
     AEPutStr(" .");
     for(i2=1; i2<50; i2++) {
         Delay(1L);
         if(Whence_The_Logon>=REMOTE_LOGON)  {
             stat=CheckCarrier();
             if(stat==FALSE)             return(NO_CARRIER);
         }
         if(CheckInput()) {
             stat=ReadChar(1L);
             if(CHATF==1) {
                 AEPutStr("\r\n\r\n");
                 return(SUCCESS);
             }
             if(stat==3) {
                 AEPutStr("Aborted!\r\n\r\n");
                 return(SUCCESS);
             }
         }
     }
 }

 AEPutStr("\r\n\r\nThe Sysop has been paged\r\n");
 AEPutStr("You may continue using the system\r\n");
 AEPutStr("until ");
 AEPutStr(Cmds->SysopName);
 AEPutStr(" answers your request.\r\n\r\n");
 StatMessage(1,1,"                            ");
 sprintf(str,"[37m%s[0m",User.Name);
 StatMessage(1,1,str);

 return(SUCCESS);
}

int DoPause(void)
{
int ch;
LineCount=0;
Pause();
 do  {
     ch=Check_Online_Status();
     if(ch<0) return(ch);
     ch=ReadChar(KEYBOARD_TIMEOUT);
     if(ch<0)  return(ch);
 } while(ch!=13&&ch!=32);
 AEPutStr("\r\n");
 return(SUCCESS);

}


void IntToFile(char *s,int num)
{
FILE *f;

 if(f=fopen(s,"w")) {
     fprintf(f,"%d\n",num);
     fclose(f);
 }
}


int FirstChar(char *s)
{
int loop;

 for(loop=0; loop<strlen(s); loop++) {
     if(s[loop]!=' ')
         return(loop);
 }
 return(-1);
}

int FirstCharValue(char *s)
{
 int stat;

 stat=FirstChar(s);
 if(stat<0)      return(stat);

 return((int)s[stat]);
}


/* This file did not UnLock(FLock) on every level */
static int PartUpload_OK(int option)
{
 struct FileInfoBlock *Fib = NL;
 BPTR FLock;
 int status,ch;
 int rts_stat = SUCCESS;    /* Tue Jan 28 10:37:46 1992 */
 char path[100],str[100],ray2[100];
 int cnt = 0;
 char *s;

 strcpy(path,Conference_Location);
 strcat(path,"PartUpload/");
 if(MaxDirs==0)  return(SUCCESS);


 if(Whence_The_Logon==LOCAL_LOGON) return(SUCCESS);

 if(!(FLock = Lock(path,ACCESS_READ)))   {
     sprintf(str,"Tell %s the bbs can't access the %s dir\r\n",Cmds->SysopName,path);
     AEPutStr(str);
     return(SUCCESS); // success = 0
 }

                                                      //(RTS) was chip
 if((Fib=(struct FileInfoBlock *)AllocDosObject(DOS_FIB,NULL)) == NULL) {
     UnLock(FLock);             //(RTS)
     MyError(0);
     return(0);
 }

 if(!(Examine(FLock,Fib))) {
     UnLock(FLock);
     FreeDosObject(DOS_FIB,Fib);
     return(0);
 }

 if(Fib->fib_DirEntryType > 0) {   /* make sure we locked a directory */
     while (ExNext(FLock,Fib)) {     /* my change.. prior to this we had a blank file name */
             if(strlen(Fib->fib_FileName) == 0) {   /* check for filename > 0 length */
                 goto OUTOH;
             }

             cnt = 0;
             s = Fib->fib_FileName;
             while(*s && cnt < 30) {     /* check for valid file name */
                 if(*s == ' ') {     /* check for spaces at beginning of filename */
                     goto OUTOH;
                 }
                 if(*s == '/') {
                     goto OUTOH;
                 }
                 if(!(isascii((int) *s))) {
                     goto OUTOH;
                 }
                 cnt++;
                 s++;
             }

/** END ERROR CKING */
         strcpy(str,Fib->fib_FileName);
         strcpy(ray2,str);
         status=GetUN(str);       /* remove the @(num at end of file. Return user number */
         if(status==User.Slot_Number) {
             AEPutStr("There are some incompleted uploads of yours\r\n");
             if(!option) AEPutStr("Would you like to leave anyway (Y/N)? ");

             FOREVER {
                 ch=Check_Online_Status();
                 if(ch<0) {
                     rts_stat = ch;   goto OUTOH;
                 }
                 if(!option)  {
                     ch=ReadChar(KEYBOARD_TIMEOUT);
                     if(ch==TIMEOUT) {
                         rts_stat = NO_CARRIER;   goto OUTOH;/* Tue Jan 28 10:33:54 1992 RTS */
                     }
                     if(Whence_The_Logon>=REMOTE_LOGON) {
                         status=CheckCarrier();
                         if(status==FALSE) {
                             rts_stat = NO_CARRIER;   goto OUTOH;
                         }
                     }
                 } else ch = 'N';

                 if(ch=='N' || ch=='n') {
                     if(!option)AEPutStr("No!   View them (Y/N)? ");
                     else AEPutStr("View them (Y/N)? ");
                     PurgeLine();
                     FOREVER {
                         ch=Check_Online_Status();
                         if(ch<0) {
                             rts_stat = ch;   goto OUTOH;
                         }
                         ch=ReadChar(KEYBOARD_TIMEOUT);
                         if(ch==TIMEOUT) {
                             rts_stat = NO_CARRIER;   goto OUTOH;
                         }
                         if(ch=='N' || ch=='n') {
                             AEPutStr("No!\r\n");
                             rts_stat = ABORT;   goto OUTOH;
                         }
                         if(ch=='Y' || ch=='y')  break;
                         else  continue;
                     }
                     // AEPutStr("Yes..\r\n");
                     rts_stat = FAILURE;   goto OUTOH;
                 }   /* end if ch == 'n' */
                 if(ch=='Y' || ch=='y')  break;
                 else  continue;
             }               /* end forever */
         }
        //AEPutStr("Yes..\r\n");
        goto OUTOH;
     }  /* end while (ExNext(FLock,Fib)) */
 }     /* end if(Fib->fib_DirEntryType > 0) */
OUTOH:
 if(FLock) UnLock(FLock);
 if(Fib) FreeDosObject(DOS_FIB,Fib);
 return(rts_stat);
}

static int DateNewer(char *s1,char *s2)
{
 int mdt,ddt,ydt,month,day,year,tv;
 char cs1[20],cs2[20];

 tv=0;

 strcpy(cs1,s1);
 strcpy(cs2,s2);

 cs1[2]=' '; cs2[2]=' '; cs1[5]=' '; cs2[5]=' ';

 sscanf(cs1,"%d %d %d",&mdt,&ddt,&ydt);
 sscanf(cs2,"%d %d %d",&month,&day,&year);

 if(ydt>year)    tv = 1;
 else {
     if(ydt==year) {
         if(mdt>month)
             tv = 1;
         else {
             if(mdt==month) {
                 if(ddt>day)     tv = 1;
             }
         }
     }
 }
 return(tv);
}

void DisplayNodeCLog(void);

static void EditDirFile(void)
{
 long stat,which;

 if(MaxDirs==0) {
     AEPutStr("\r\n");
     MyError(5);
     return;
 }

 stat=CommandSplit();
 if(stat>1)
     strcpy(GSTR1,Command[1]);
 else
     GSTR1[0]='\0';
 do{
     if(GSTR1[0]=='\0')  {
         sprintf(GSTR1,"\r\nDirectory to Edit[1-%ld]? ",MaxDirs);
         AEPutStr(GSTR1);
         stat=LineInput("",GSTR1,5,KEYBOARD_TIMEOUT);
         if(stat<0||GSTR1[0]=='\0')  {
             AEPutStr("\r\n");
             return;
         }
     }
     sscanf(GSTR1,"%ld",&which);
     GSTR1[0]='\0';
     if(which<1||which>MaxDirs)
         AEPutStr("\r\nNo such directory!\r\n");
 } while(which<1||which>MaxDirs);

 sprintf(GSTR1,"%sDir%ld",Conference_Location,which);
 EditEmacs(GSTR1);
 AEPutStr("\r\n");
}

static void EditAnyFile(void)
{
 long stat;

 stat=CommandSplit();
 if(stat>1)
     strcpy(GSTR1,Command[1]);
 else {
     AEPutStr("\r\nFullPath/Filename to Editor? ");
     stat=LineInput("",GSTR1,250,KEYBOARD_TIMEOUT);
     if(stat<0||GSTR1[0]=='\0') {
         AEPutStr("\r\n");
         return;
     }
 }
  if(FindAssign(GSTR1))
          {
             AEPutStr("\r\nDevice not Mounted.\r\n");
             AEPutStr("\r\n");
             return;
          }
 EditEmacs(GSTR1);
 AEPutStr("\r\n");
}

static void AlterFlags(void)
{
 int stat;

 AEPutStr("\r\n");
 if(strlen(MAINMENU_Li)>2) {
     stat=FlagFiles(MAINMENU_Li+2);
     if(stat<0)      return;
     while(stat)     stat=FlagFiles(NULL);
 } else {
     do {
         stat=FlagFiles(NULL);
         if(stat<0)          return;
     } while(stat);
 }
 AEPutStr("\r\n");
}

int Download_A_File(char *str);

static int BeginDLF(void)      /* begin downloading */
{
 int stat;
 char *str;

 stat=FAILURE;

 if(str=(UBYTE *)AllocMem(3072,MEMF_ANY|MEMF_CLEAR)) {
     stat=Download_A_File(str);
     FreeMem(str,3072);
 } else  MyError(3);
 return(stat);
}


static int CheckFlagged(void)
{
 int stat;

 if(strlen(flaglist))    {
     AEPutStr("You have flagged files still not downloaded.\r\nDo you leave without them? ");
     stat=YesNo(2);
     return(stat);
 }
 return(1);
}


/*******************************************************MENU ************/
int SearchString(void);
int MyNewFiles(void);
extern int SetEnvStat(int Code);


void  check_nodes(void);

int Menu(void)
{
 int command_accepted, ch, mystat;
 char string[133],c[100],str[100],tc[100];
 long temp;
 Clear_Online_Status();
 Time_menu_entry=time(NULL);
 Time_system=Time_menu_entry;


 sprintf(c,"%s",ctime(&User.Time_Last_On));
 Convert_CTime_To_Date(c,str,string);
 sprintf(c,"%s",ctime(&Time_menu_entry));
 Convert_CTime_To_Date(c,tc,string);

 mystat=DateNewer(tc,str);    /* is it a newer date ? */
Time_limit=User.Time_Limit;
 if(mystat) {
     
     if(Cmds->AcLvl[LVL_KEEP_UPLOAD_CREDIT]>1) {
         if(User.Time_Total-Time_limit>0)
             Time_limit+=(User.Time_Total-Time_limit);
     }
     User.Time_Total=Time_limit;
     User.Time_Used=0L;
     User.Daily_Bytes_Dld=0L;
     BytesADL=User.Daily_Bytes_Limit;
 } else {
     Time_limit=User.Time_Total-User.Time_Used;
     BytesADL=User.Daily_Bytes_Limit-User.Daily_Bytes_Dld;
 }

 if(Time_limit<=0L)  {       /*-- User Exceeded his time limit for today --*/
     sprintf(GSTR1,"%sLogon24hrs",Sopt->NodeScreen);
     if(!(mystat=ChecktoDisplay(GSTR1,GSTR2,0,0))) {
         UnAvailNotice(GSTR2,GSTR1);
     }
     return(NO_CARRIER); /* goodbye */
 }

LogON=1;

 
 /*--- Show BBS:Bull.txt ----*/
 ch=0;
 sprintf(GSTR1,"%sBULL",Cmds->BBSLoc);
 if(ChecktoDisplay(GSTR1,GSTR2,1,1)) {
     mystat=DoPause();
     if(mystat<0) { return(mystat); }
 }

 if(BatchError<0) return(BatchError);

  /* really need to resave account with new baud rate */

// User_keys.baud_rate = Online_Baud;

 /* show the New user the Rules */
 if(my_struct.newuserfile && (GET_BIT(ACS_UPLOAD)) && (User_keys.Userflags & USER_NEWMSG) ) {
          ch=ChecktoDisplay(my_struct.newuserfile,GSTR2,0,1);
          User_keys.Userflags ^= USER_NEWMSG;    /* reset bit */
 //JOE 23-Jun modified code to pause only if the newuserfile exists

 }


     
     if(ch)
     {
      mystat=DoPause();
      if(mystat<0) return(mystat);
     }

//JOE 23-Jun modified
     sprintf(GSTR1,"%sBULL",Sopt->NodeScreen);
     ch=ChecktoDisplay(GSTR1,GSTR2,1,1);

//JOE 23-Jun modified code to pause only if the bulletin exists

     if(ch)
     {
      mystat=DoPause();
      if(mystat<0) return(mystat);
     }
     ClearMsgPointers();
     MasterLoadPointers(); 
     loadedmsg=1;
GetProtocol();

 SetEnvStat(ENV_SCANNING);

//-- if(User.Sec_Status > my_struct.access_scan_level) { /* dont scan if user < 11 */
  /*----------------- Search Conferences for mail ------------------*/
     AEPutStr("\r\nScanning conferences for mail...\r\n\r\n");
//(JOE)
     MCIViewSafe=FALSE;
     for(ch=1; ch<Boards_Are_Active+1; ch++)  {
         mystat=Join_Conference(ch);
           
         if(mystat==FAILURE)         break;
         if(mystat==NO_CARRIER||mystat==TIMEOUT) return(mystat);
     }
     MCIViewSafe=TRUE;
//-- }

                if(GET_BIT(ACS_UPLOAD)) {
                    //AEPutStr("\r\n[35m  --[32mChecking for PartUploads\r\n[0m");
                    for(CN=1;CN<Boards_Are_Active+1;CN++)
                    {
                      GetConfName(Conference_Name,Conference_Location,CN-1);
                      strcpy(GSTR1,Conference_Location);
                       if(!GetFromConf(CN-1,"SCREENS",Screen_Location))
                       strcpy(Screen_Location,Conference_Location);
                      if(MaxDirs=IntFromConf(CN-1,"NDIRS"))
                      {
                        if(IsValidConf(CN-1))
                        {
                   
                   command_accepted=PartUpload_OK(1);
                   if(command_accepted==FAILURE)  {
                     strcpy(MAINMENU_Li,"URG");
                     SetEnvStat(ENV_UPLOADING);
                     if(!(GET_BIT(ACS_UPLOAD)))
                         command_accepted=NOTALLOWED;
                       else
                        command_accepted=Upload_a_File(0);
                   }
                          else
                   if(command_accepted==ABORT)
                   {
                      AEPutStr("\r\n");
                    }
                        
                        }
                      }
                } 
               AEPutStr("\r\n");
               mystat=DoPause();
         if(mystat<0) return(mystat);
          }

 CN=User.ConfRJoin;
 if(!IsValidConf(CN-1))  CN=1;
 if(CN==0||CN>Boards_Are_Active)  CN=1;
 GetConfName(Conference_Name,Conference_Location,CN-1);
 LoadMsgPointers(CN);
 FreeDownloads=1;
 strcpy(str,Conference_Location);
 if(MaxDirs=IntFromConf(CN-1,"NDIRS"))  {
     if(IsFromConf(CN-1,"FREEDOWNLOADS"))  {
         FreeDownloads=0;
     } else      FreeDownloads=1;
 }
if(!GetFromConf(CN-1,"CONF_NETID",NetConf)) strcpy(NetConf,"");
 
  if(!GetFromConf(CN-1,"SCREENS",Screen_Location))
     strcpy(Screen_Location,Conference_Location);
 /* Display that conferences Bulletin to the user */
     strcpy(GSTR1,Screen_Location);
     strcat(GSTR1,"BULL");
     if(ch=ChecktoDisplay(GSTR1,GSTR2,1,1))  {
         ch=DoPause();
         if(ch<0)  return(ch);
     }
     if(BatchError<0) return(BatchError);

 GetMailStatFile();
 AEPutStr("\r\n");

 if(CN==User.ConfRJoin) ScanHoldDesc();
 UserStatus();
 
 sprintf(string,"Conference %d: %s Auto-ReJoined",RelConf(CN),Conference_Name);
 sprintf(c,"\t%s\n",string);
 CallersLog(c);
 AEPutStr(string);
 AEPutStr("\r\n");
  if(strlen(NetConf)>3)
 {
   if(NetConf[0]=='H' || NetConf[0]=='h')
 sprintf(string,"[35mNetNode: [33m%s , [35mHost to NetConf: [33m%s[0m\r\n",Sopt->BBSConfig,&NetConf[3]);
   else
 sprintf(string,"[35mNetNode: [33m%s , [35mSub to NetConf: [33m%s[0m\r\n",Sopt->BBSConfig,&NetConf[3]);
   AEPutStr(string);
 }
AEPutStr("\r\n\r\n");

 if(Last_Msg_Read_Conf>MailStat.HighMsgNum)
     Last_Msg_Read_Conf=0;

 if(Last_New_Read_Conf>MailStat.HighMsgNum)
     Last_New_Read_Conf=0;
 if(MailStat.LowestKey>1)
  {
 sprintf(string,"[32mMessages range from [33m( [0m%ld [32m- [0m%ld [33m)[0m\r\n",
                 MailStat.LowestKey,MailStat.HighMsgNum-1);
  }
  else
sprintf(string,"\r\n[32mTotal messages           [33m:[0m %ld\r\n",MailStat.HighMsgNum-1);      
 
 AEPutStr(string);
 temp=Last_New_Read_Conf-1;
 if(temp<0)  temp=1;

 sprintf(string,"\r\n[32mLast message auto scanned[33m:[0m %ld\r\n",temp);
 AEPutStr(string);

 sprintf(string,"[32mLast message read [33m       :[0m %ld\r\n\r\n",Last_Msg_Read_Conf);
 AEPutStr(string);


 DisplaySysopULStats();

MMcont:
 SetEnvStat(ENV_IDLE);
 no_scrn_clr = FALSE;    
 RelNum=RelConf(CN);              /* dont do screen clear code */

 
 for(;;) {
MAINMENU:
     ChatFlag=0;
      SetEnvStat(ENV_IDLE);             /* 11w */

     if(Check_Online_Status()<0) return(NO_CARRIER);
     if(User.Expert!='X'&&MAINMENU_Li[0]!='?') {
         mystat=DoPause();
         if(mystat<0)  return(mystat);
         DisMenu();
     }

         sprintf(string,"[0m[35m%s[0m [[36m%d[34m:[36m%s[0m] Menu ([33m%ld [37mmins. left[0m): ",Cmds->BBSName,RelNum,Conference_Name,Time_limit/60L);
         AEPutStr(string);

     while(1) {
         StatPrintUser(&User);
         mystat=LineInput("",MAINMENU_Li,200,KEYBOARD_TIMEOUT);
         if(mystat<0)  return(NO_CARRIER);
         if(strlen(MAINMENU_Li)==0) {
             AEPutStr("\r\n");
             break; /* goto MAINMENU; */
         }

               if(MAINMENU_Li[0]==' ')
               {
                    AEPutStr("\r\n");
                    break; 
               }
          
         mystat=MenuCommand(MAINMENU_Li);
         if(mystat!=SUCCESS) return(mystat); else break;
        }
 }
 return(SUCCESS);
}
int MenuCommand(char str1[])
{
int input, command_accepted, mystat;
 char string[133]; int ch;
    strcpy(MAINMENU_Li,str1);
      SetEnvStat(ENV_IDLE);             /* 11w */
     if(Check_Online_Status()<0) return(NO_CARRIER);

         StatPrintUser(&User);
         if(strlen(MAINMENU_Li)==2&&(!strnicmp(MAINMENU_Li,"rz",2))) {
             SetEnvStat(ENV_UPLOADING);            /* 11w */
             command_accepted    = Upload_a_File(1);
             if(command_accepted == GOODBYE) {
                 Goodbye();
                 return(STANDARD_LOGOFF);
             }
             if(command_accepted == NO_CARRIER) {
                 return(NO_CARRIER);
             }
             command_accepted=NOTALLOWED;
             return(SUCCESS);
         }
         if(!Valer) return(NO_CARRIER); 
         if(!Wild(MAINMENU_Li))
         {
         while(1)
         {
          sprintf(string,"%sCommands/conf%dCmd/",Cmds->BBSLoc,CN);
          command_accepted=CustomCommand(string,MAINMENU_Li,0);
          if(command_accepted==1) return(SUCCESS); /* 11w */
          if(command_accepted!=3) break;
         }
         while(1)
         {
          sprintf(string,"%sCommands/BBSCmd/",Cmds->BBSLoc);
          command_accepted=CustomCommand(string,MAINMENU_Li,0);
          if(command_accepted==1) return(SUCCESS);
          if(command_accepted!=3) break;
         }
         }
FORCENTRY:
         input=FirstCharValue(MAINMENU_Li);
         if(Check_Online_Status()<0)  return(NO_CARRIER);

         switch(toupper(input)) {
             case '1':
                 SetEnvStat(ENV_SYSOP);                /* 11w */
                 if(!GET_BIT(ACS_ACCOUNT_EDITING)) {
                     command_accepted=NOTALLOWED;
                     break;
                 }
                 CallersLog("\tAccount editing.\n");
                 Edit_Accounts();
                 command_accepted=SUCCESS;
                 break;
             case '2':
                 SetEnvStat(ENV_SYSOP);
                 if(!GET_BIT(ACS_NODE_LIST)) {
                     command_accepted=NOTALLOWED;
                     break;
                 }
                 DisplayNodeCLog();
                    command_accepted=SUCCESS;
                 break;
             case '3':
                 SetEnvStat(ENV_EMACS);
                 if(!(GET_BIT(ACS_EDIT_DIRS))) {
                     command_accepted=NOTALLOWED;
                     break;
                 }
                 EditDirFile();
                 command_accepted=SUCCESS;
                 break;
             case '4':
                 SetEnvStat(ENV_EMACS);
                 if(!(GET_BIT(ACS_EDIT_ANY))) {
                     command_accepted=NOTALLOWED;
                     break;
                 }
                 EditAnyFile();
                 command_accepted=SUCCESS;
                 break;
             case '5':
                 SetEnvStat(ENV_SYSOP);
                 if(!(GET_BIT(ACS_SYSOP_COMMANDS))) {
                     command_accepted=NOTALLOWED;
                     break;
                 }
                 MyDirAnyWhere();
                 command_accepted=SUCCESS;
                 break;
             case 'A':
                 /* user must have minimum access to use this command */
                 if(User.Sec_Status <= Cmds->PSAcLvl[0]) {
                     command_accepted=NOTALLOWED;
                     break;
                 }
                 if(!GET_BIT(ACS_DOWNLOAD)) { command_accepted=NOTALLOWED; break;}
                 if(MAINMENU_Li[1]>' ') { command_accepted=SUCCESS; break; }
                 SetEnvStat(ENV_FILES);               /* 11w */
                 AlterFlags();
                 command_accepted=SUCCESS;
                 break;
             case 'B':
                 if(!(GET_BIT(ACS_BULLETINS))) {
                     command_accepted=NOTALLOWED;
                     break;
                 }
                 SetEnvStat(ENV_BULLETINS);              /* 11w */
                 command_accepted=Bulletins();
                 break;
             case 'C':
                 SetEnvStat(ENV_MAIL);                   /* 11w */
                 if(!(GET_BIT(ACS_COMMENT_TO_SYSOP))) {
                     command_accepted=NOTALLOWED;
                     break;
                 }
//(JOE) MCI security added
                 MCIViewSafe=FALSE;
                 command_accepted=CommentToSYSOP();
                 MCIViewSafe=TRUE;
                 break;
             case 'D':
                 if(!(GET_BIT(ACS_DOWNLOAD))) {
                     command_accepted=NOTALLOWED;
                     break;
                 }
                 SetEnvStat(ENV_DOWNLOADING);            /* 11w */
                 command_accepted=BeginDLF();
                 rfinal[0]='\0';
                 break;
             case 'E':
                 SetEnvStat(ENV_MAIL);                  /* 11w */
                 if(!(GET_BIT(ACS_ENTER_MESSAGE))) {
                     command_accepted=NOTALLOWED;
                     break;
                 }
//(JOE) MCI added for security
                 command_accepted=CallMsgFuncs(2,0); //EnterMSG();
                 break;
             case 'F':
                 if(MAINMENU_Li[1]=='s' || MAINMENU_Li[1]=='S')
                 {
                   if(!(GET_BIT(ACS_CONFERENCE_ACCOUNTING))) {
                     command_accepted=NOTALLOWED;
                     break;
                   }
                   FileStatus(0); command_accepted=0;
                   break;
                 }
                 if(!(GET_BIT(ACS_FILE_LISTINGS))) {
                     command_accepted=NOTALLOWED;
                     break;
                 }
                 SetEnvStat(ENV_FILES);
                 command_accepted=DisplayFileList();
                 no_scrn_clr = TRUE;
                 break;
             case 'G':
                 SetEnvStat(ENV_LOGOFF);
                 AEPutStr("\r\n");

                 if(GET_BIT(ACS_UPLOAD)) {
                     command_accepted=PartUpload_OK(0);
                     if(command_accepted==FAILURE) {  /* NO leave yet file un finished */
                         strcpy(MAINMENU_Li,"URG");   /* loop again */
                         goto FORCENTRY;
                     }
                     if(command_accepted==ABORT) {
                         AEPutStr("\r\n");
                         break; /* goto MAINMENU */
                     }
                 }
                 mystat=CheckFlagged();
                 if(!mystat) {
                     AEPutStr("\r\n");
                     break;
                 }
                 Goodbye();
                 return(STANDARD_LOGOFF);                 /* goodbye */
                 break;
             case 'H':
                 /* no chat unless validated */
                 command_accepted=HELP();
                 break;
case '^': 
                 sprintf(GSTR1,"%shelp/%s",Cmds->BBSLoc,&MAINMENU_Li[1]);
                 while(1)
                 {
                 if(ch=ChecktoDisplay(GSTR1,GSTR2,0,1)) {
                     ch=DoPause();
                    if(ch<0)  return(ch);
                     AEPutStr("\r\n");
                    break;
                  }
                  else if(MAINMENU_Li[1]!='\0') { MAINMENU_Li[strlen(MAINMENU_Li)-1]='\0';
                     sprintf(GSTR1,"%shelp/%s",Cmds->BBSLoc,&MAINMENU_Li[1]);
                      continue;
                       }
                  break;
                 }
                  command_accepted=SUCCESS;
                  break;
             case '>':
                 sprintf(MAINMENU_Li,"J %d",RelConf(CN)+1);
             case '<':
                 if(!(GET_BIT(ACS_JOIN_CONFERENCE)))
                 {
                   command_accepted=NOTALLOWED;
                   break; 
                 }
                 SaveMsgPointers(CN);
                 if(MAINMENU_Li[0]=='<')
                 {
                   sprintf(MAINMENU_Li,"J %d",RelConf(CN)-1);
                 }
                 
                 SetEnvStat(ENV_JOIN);
                 command_accepted=Join_Conference(0);
                 AEPutStr("\r\n");
                 break;
             case 'J':                              /* Join Conference */
                 /* no chat unless validated */
                 if(!(GET_BIT(ACS_JOIN_CONFERENCE))) {
                     command_accepted=NOTALLOWED;
                     break;
                 }
                 SaveMsgPointers(CN);
                 
                 SetEnvStat(ENV_JOIN);                 /* 11w */
                 command_accepted=Join_Conference(0);
                 AEPutStr("\r\n");
                 break;

             case 'M':
                 command_accepted=SUCCESS;
                 if(AnsiColor) {
                     AnsiColor=0;
                     AEPutStr("\r\nAnsi Color off\r\n\r\n");
                 } else {
                     AnsiColor=1;
                     AEPutStr("\r\nAnsi Color On\r\n\r\n");
                 }
                 break;
             case 'N':
                 if(!(GET_BIT(ACS_NEW_FILES_SINCE))) {
                     command_accepted=NOTALLOWED;
                     break;
                 }
                 SetEnvStat(ENV_FILES);               /* 11w */
                 command_accepted=MyNewFiles();
                 no_scrn_clr = TRUE;
                 break;
             case 'O':
                 if(PagesAllowed==0)
                 {
                      SetEnvStat(ENV_MAIL);                   /* 11w */
                 if(!(GET_BIT(ACS_COMMENT_TO_SYSOP))) {
                     command_accepted=NOTALLOWED;
                     break;
                 }
                 MCIViewSafe=FALSE;
                 command_accepted=CommentToSYSOP();
                 MCIViewSafe=TRUE;
                 break;
                 }
                 if(PagesAllowed!=-1) PagesAllowed -=1;
                 /* no chat unless validated */
                 if(!(GET_BIT(ACS_PAGE_SYSOP))) {
                     command_accepted=NOTALLOWED;
                     break;
                 }
                 SetEnvStat(ENV_REQ_CHAT);             /* 11w */
                 PagedFlag=1;
                 command_accepted=SUCCESS;
                 if(SySChat==0&& !(GET_BIT(ACS_OVERRIDE_CHAT))) {
                     sprintf(string,"\r\nSorry, %s, is not around right now\r\n",Cmds->SysopName);
                     AEPutStr(string);
                     AEPutStr("You can use 'C' to leave a comment.\r\n\r\n");
                 } else
                     command_accepted=CCom();                  /* chat */
                 
                 break;
             case 'Q': if(GET_BIT(ACS_QUIET_NODE)) {Server(SV_QUIETNODE);} command_accepted=0; break;
             case 'R':
                 if(MAINMENU_Li[1]=='L' || MAINMENU_Li[1]=='l')
                 {
                    if(GET_BIT(ACS_RELOGON))
                    {
                 SetEnvStat(ENV_LOGOFF);
                 AEPutStr("\r\n");
                 templogon=Whence_The_Logon; if(templogon==SYSOP_LOGON) templogon=LOCAL_LOGON;
                 relogon=1;
                 if(GET_BIT(ACS_UPLOAD)) {
                     command_accepted=PartUpload_OK(0);
                     if(command_accepted==FAILURE) {  /* NO leave yet file un finished */
                         strcpy(MAINMENU_Li,"URG");   /* loop again */
                         goto FORCENTRY;
                     }
                     if(command_accepted==ABORT) {
                         AEPutStr("\r\n");
                         break; /* goto MAINMENU */
                     }
                 }
                 mystat=CheckFlagged();
                 if(!mystat) {
                     AEPutStr("\r\n");
                     break;
                 }
                 Goodbye();
                 return(STANDARD_LOGOFF);                 /* goodbye */
                 break;
                 }
               }
                 SetEnvStat(ENV_MAIL);
                 if(!(GET_BIT(ACS_READ_MSG))) {
                     command_accepted=NOTALLOWED;
                     break;
                 }
                 GetMailStatFile();
                 command_accepted=CallMsgFuncs(1,0);
                 break;
             case 'S':
                 SetEnvStat(ENV_STATS);
                 if(!(GET_BIT(ACS_DISPLAY_USER_STATS))) {
                     command_accepted=NOTALLOWED;
                     break;
                 }
                 UserStatus();
                 command_accepted=SUCCESS;
                 /*AEPutStr("\r\n");
                 for(i=0;i<80;i++)
                 {
                   if(GET_BIT(i)) AEPutStr("X"); else AEPutStr("_");
                 }
                 AEPutStr("\r\n");*/
                 break;
             case 'T':
                 AEPutStr("\r\nIt is ");
                 Time_system=time(NULL);
                 sprintf(string,"%s\r\n\r",ctime(&Time_system));
                 AEPutStr(string);

                 command_accepted=SUCCESS;
                 break;
             case 'U': 
                 /* no uploading unless validated */
                 if(!(GET_BIT(ACS_UPLOAD))) {
                     command_accepted=NOTALLOWED;
                     break;
                 }
                 SetEnvStat(ENV_UPLOADING);          /* 11w */
                 command_accepted=Upload_a_File(0);
                 if(command_accepted == NO_CARRIER) {
                     return(NO_CARRIER);
                 }
                 break;
             case 'V':
                 SetEnvStat(ENV_VIEWING);
                 if(!(GET_BIT(ACS_VIEW_A_FILE))) {
                     command_accepted=NOTALLOWED;
                     break;
                 }
                 command_accepted=View_A_File();
                 break;
             case 'W':
                 /* no account editing unless validated */
                 if(MAINMENU_Li[1]=='H' || MAINMENU_Li[1]=='h')
                 {
                    if(GET_BIT(ACS_WHO_IS_ONLINE) && Sopt->Toggles[10]) {
 SetEnvStat(ENV_DOORS); if(MAINMENU_Li[1]=='D') who(1); else who(0);} command_accepted=0;       
                 }
                 else
                 {
                 if(!(GET_BIT(ACS_EDIT_USER_INFO))) {
                     command_accepted=NOTALLOWED;
                     break;
                 }
                 SetEnvStat(ENV_STATS);
                 command_accepted=UserAccountEdit();
                 }
                 break;
/*
             case '0':
                 SetEnvStat(ENV_SHELL);
                 if(!(GET_BIT(ACS_REMOTE_SHELL))) {
                     command_accepted=NOTALLOWED;
                     break;
                 }
                 if(Cmds->RemotePass[0]!='\0') {
                     AEPutStr("\r\nEnter Remote Shell Password: ");
                     command_accepted=LineInputConverted("",string,30,KEYBOARD_TIMEOUT);
                     if(command_accepted<0)  return(SLEEP_LOGOFF);

                     if(Whence_The_Logon>=REMOTE_LOGON) {
                         command_accepted=CheckCarrier();
                         if(command_accepted==FALSE)
                             return(SLEEP_LOGOFF);
                     }
                     strupr(Cmds->RemotePass);
                     strupr(string);
                     AEPutStr("\r\n");
                     if(strcmp(string,Cmds->RemotePass)!=0) {
                         command_accepted=99;
                         AEPutStr("Remote password failed\r\n\r\n");
                         sprintf(str,"\tRemote password (%s) failed.\n",string);
                         CallersLog(str);
                         break;
                     }
                 }
                 RemoteShell();
                 command_accepted=SUCCESS;
                 break;
*/             case 'X':
                 /* no menu disable if not validated */
                 if(User.Expert=='X') {
                     AEPutStr("\r\nExpert mode off\r\n\r\n");
                     User.Expert='N';
                 } else  {
                     AEPutStr("\r\nExpert mode on\r\n\r\n");
                     User.Expert='X';
                 }
                 command_accepted=SUCCESS;
                 break;
             case 'Z':
                 /* no message zooming unless validated */
                 if((MAINMENU_Li[1]=='o'||MAINMENU_Li[1]=='O')) {
                     if(GET_BIT(ACS_ZOOM_MAIL)) {
                         command_accepted=JEZoom();  // chgd from Zoom 11w
                         break;
                     }
                     command_accepted=NOTALLOWED;
                     break;
                 }
                 if(!(GET_BIT(ACS_ZIPPY_TEXT_SEARCH))) {
                     command_accepted=NOTALLOWED;
                     break;
                 }
                 SetEnvStat(ENV_FILES);
                 command_accepted=SearchString();
                 break;
             case '?':
                 DisMenu();
                 command_accepted=SUCCESS;
                 break;
             case '\000': /* FN-KEY HIT */
                 command_accepted=SUCCESS;
                 AEPutStr("\r\n");
                 break;
             default:
                 AEPutStr("\r\nNo such command!!  Use '?' for command list.\r\n\r\n");
                 command_accepted=FAILURE;
                 break;
         }
         if(command_accepted==TIMEOUT) return(SLEEP_LOGOFF);
         if(command_accepted==NO_CARRIER) return(NO_CARRIER);
         if(command_accepted==GOODBYE)   {
             Goodbye();
             return(STANDARD_LOGOFF);
         }
         if(command_accepted==NOTALLOWED)
             AEPutStr("\r\nCommand requires higher access.\r\n\r\n");
         else AEPutStr("\r\n");
 
 return(SUCCESS);
}

void DisplaySysopULStats(void)
{
 int i,num,num2,t;
 char str[100],str2[100];
 FILE *fp;

 t=0;
 if(!GET_BIT(ACS_ULSTATS)) return;

 for(i=0; i<Boards_Are_Active; i++)  {
     num=0;
     num2=0;
     sprintf(str,"%sSysopStats/NumULs_%d",Cmds->BBSLoc,i+1);
     if((fp = fopen(str,"r"))) {
         fgets(str2,20,fp);
         fclose(fp);
         if(User.Slot_Number==1)DeleteFile(str);
         sscanf(str2,"%d",&num);
     }

     strcat(str,"HOLD");
     if((fp = fopen(str,"r"))) {
         fgets(str2,20,fp);
         fclose(fp);
         if(User.Slot_Number==1)DeleteFile(str);
         sscanf(str2,"%d",&num2);
     }
     if(num!=0||num2!=0) {
         t=1;
         GetConfName(str,str2,i);
         sprintf(str2,"%s has %d new uploads, %d upload, %d hold\r\n",str,(num+num2),num,num2);
         AEPutStr(str2);
     }
 }
 GetConfName(str,str2,CN-1);
 if(t)   AEPutStr("\r\n");
}


int GetMailStatFile(void)
{
 BPTR fd;
 LONG stat;
 char string[100];

 strcpy(string,MsgBase_Location);
 strcat(string,"MailStats");
 fd=Open(string,MODE_OLDFILE);
 
 if(fd==NULL) {     /* if The mailstat file doesnt exist creat one */
     fd=Open(string,MODE_NEWFILE);
     if(fd==NULL) {
         MyError(2); // MyError(2);
         return(FAILURE);
     }

     MailStat.LowestNotDel=0;
     MailStat.LowestKey=1;
     MailStat.HighMsgNum=1;
     stat=Write(fd,(char *)&MailStat,sizeof(struct MailStat));
 } else
     stat=Read(fd,(char *)&MailStat,sizeof(struct MailStat));

 if(stat!=sizeof(struct MailStat)){
     Close(fd);  MyError(2);  return(FAILURE);
 }

 Close(fd);
 return(SUCCESS);
}

int AddFlagtoList(char *);
static int mcount;


static int JEZoom(void)
{
 FILE *fi,*fi1,*fo;
 struct MailHeader MH;
 int mystat;
 long Low, Num=0L, TimeVar;
 char FileName[100], ZoomName[80];
 char date[100], Temp[200], string[100];
 int cnt = 0;
 SetEnvStat(ENV_ZOOM);

 cnt = 0;
     // if nozoom set & user < co-sysop level skip conf
     AEPutStr("\r\n");
     sprintf(Temp,"\r\n[32m   High Msg[33m: [0m%ld",MailStat.HighMsgNum-1);
     AEPutStr(Temp);
     sprintf(Temp,"\r\n[32m   Low  Msg[33m: [0m%ld\r\n",MailStat.LowestNotDel);
     AEPutStr(Temp);
     sprintf(Temp,"[32m  Last Read[33m: [0m%ld\r\n",Last_Msg_Read_Conf);
     AEPutStr(Temp);
     AEPutStr("\r\n");
     AEPutStr("[32mZoom From [33m>: [0m");
     sprintf(Temp,"%ld",Last_Msg_Read_Conf); Low=Last_Msg_Read_Conf;
     mystat=LineInput(Temp,Temp,10,KEYBOARD_TIMEOUT);
     
     if(mystat<0) return(mystat);
     AEPutStr("\r\n");
     if(atol(Temp)>=MailStat.LowestNotDel && atol(Temp)<=MailStat.HighMsgNum && Temp[0]!='\0') Low=atol(Temp);
     sprintf(Temp,"[33mZooming Mail from message [0m%ld\r\n\r\n",Low);
     AEPutStr(Temp);

     sprintf(Temp,"%sHeaderFile",MsgBase_Location);
    
     fi=fopen(Temp,"rb");
     if(!fi) {
       AEPutStr("Message Base does not exist\r\n"); return(0);
     }
     sprintf(ZoomName,"%sZoom/C%dNd%dMail@%d",Cmds->BBSLoc,RelNum,Cmds->AcLvl[LVL_NODE_NUMBER],User.Slot_Number);
     fo=fopen(ZoomName,"a");
     if(!fo) { fclose(fi); return(0); }
     fseek(fi,(LONG)sizeof(struct MailHeader)*(LONG)(Low-MailStat.LowestKey),0);
     while(fread((APTR)&MH,sizeof(struct MailHeader),1,fi)!=NULL) {
         if(!CheckCarrier() && Whence_The_Logon==REMOTE_LOGON)
         {
            fclose(fo);
            fclose(fi);
            return(NO_CARRIER);
         }
         CheckDoorMsg(0);
         if(!strcmp(MH.ToName,User.Name) || !strcmp(MH.FromName,User.Name) || \
           MH.Status[0]=='P' || GET_BIT(ACS_SYSOP_READ))   {
             if((!MH.Recv || GET_BIT(ACS_SYSOP_READ)) \
               && MH.Status[0]!='D')  {
                 TimeVar=(long)MH.MsgDate;
                 sprintf(date,"%s",ctime(&TimeVar));
                 date[strlen(date)-1]='\0';
                 fprintf(fo,"\nDate   : %-30s  Number: %ld\n",date,MH.MsgNumb);
                 strcpy(date,MH.ToName);
                 strlwr(date);
                 TimeVar=(long)strncmp(date,"eall",4);
                 if(TimeVar==0) {
                     strcpy(date,User.Name);
                     strcat(date," (ALL)");
                 } else {
                     strcpy(date,MH.ToName);
                 }
                 fprintf(fo,"To     : %-30s  ",date);

                 if(MH.Recv!=0) {
                     TimeVar=MH.Recv;
                     sprintf(date,"%s",ctime(&TimeVar));
                     date[strlen(date)-1]='\0';
                     fprintf(fo,"Recv'd: %s\n",date);
                 } else {
                     fprintf(fo,"Recv'd: ");
                     if(StringCompare(MH.ToName,"ALL")==SUCCESS) {
                         fprintf(fo,"N/A\n");
                     } else {
                         fprintf(fo,"No\n");
                     }
                 }

                 if(MH.Status[0]=='P') {
                     strcpy(string,"Public Message");
                 } else {
                     strcpy(string,"Receiver Only");
                 }

                 fprintf(fo,"From   : %-30s  Status: %s\n",MH.FromName,string);
                 fprintf(fo,"Subject: %s\n",MH.Subject);
                 fprintf(fo,"Conf   : [%d] %s\n\n",RelNum,Conference_Name);
                 sprintf(FileName,"%s%d",MsgBase_Location,MH.MsgNumb);
                 if(fi1=fopen(FileName,"r")) {
                     while(fgets(FileName,80,fi1)!=NULL)
                         fprintf(fo,"%s",FileName);

                     fprintf(fo,"\n==========================================================================\n\n");
                     fclose(fi1);
                     AEPutStr("."); Num +=1L;
                 }
             }
         }
         Low +=1L;
     }                  /* while fread */
     fclose(fi);
     fclose(fo);
     
     Last_Msg_Read_Conf=Low;
 
 if(Num>0L) {
      SetComment(ZoomName,"F");
      AEPutStr("\r\n");
      if(Whence_The_Logon!=SYSOP_LOGON && Whence_The_Logon!=LOCAL_LOGON) {
         DTBT=0;
         TBT=0;
         TTTM=NULL;
         TTEFF=NULL;
         TTCPS=NULL;
         AEPutStr("[33mPrepare for ZoomMail Zmodem Download:\r\n");
         mystat=DoPause();
         if(mystat<0) { DeleteFile(ZoomName);return(mystat); }
             SetEnvStat(ENV_DOWNLOADING);
             Zmodem_Send(ZoomName);
             DeleteFile(ZoomName);
         }

     }
     else
         AEPutStr("\r\nNo messages to Zoom\r\n");
    return(0);
}

int IsFromIcon(char *s,char *c)
{
   struct DiskObject *dobj;
   char temp[100];
   char **oldtooltypes;
   strcpy(temp,s);
   if(temp[strlen(temp)-1]=='/') temp[strlen(temp)-1]='\0';
   dobj=GetDiskObject(temp);
   if(dobj==NULL) return(0);
   oldtooltypes=dobj->do_ToolTypes;
   if(FindToolType(oldtooltypes,c)) { FreeDiskObject(dobj); return(1); }
   FreeDiskObject(dobj);
   return(0);
}

int GetFromIconStr(char *s,char *c,char *buf)
{
   struct DiskObject *dobj;
   char temp[100];
   char **oldtooltypes;
   char *t;
   strcpy(temp,s);
     if(temp[strlen(temp)-1]=='/') temp[strlen(temp)-1]='\0';
   dobj=GetDiskObject(temp);
   if(dobj==NULL) return(0);
   oldtooltypes=dobj->do_ToolTypes;
   if(t=FindToolType(oldtooltypes,c)) { strcpy(buf,t); FreeDiskObject(dobj); return(1); }
   FreeDiskObject(dobj);
   return(0);
}
int ConnectDef(char *s)
{
   struct DiskObject *dobj;
   char temp[100];
   char temp1[200];
   char **oldtooltypes;
   char *t;
   
   sprintf(temp,"%sNode%d/Connect.Def",Cmds->BBSLoc,Cmds->AcLvl[LVL_NODE_NUMBER]);
   dobj=GetDiskObject(temp);
   if(dobj==NULL) return(0);
   oldtooltypes=dobj->do_ToolTypes;
   strcpy(temp1,s);
   StripReturn(temp1);
   if(t=FindToolType(oldtooltypes,temp1)) { strcpy(s,t); FreeDiskObject(dobj); return(1); }
   FreeDiskObject(dobj);
   return(0);
}
int IntFromIcon(char *s,char *c)
{
   struct DiskObject *dobj;
   char temp[100];
   char **oldtooltypes;
   char *t;
   int num;
   strcpy(temp,s);
   if(temp[strlen(temp)-1]=='/') temp[strlen(temp)-1]='\0';
   dobj=GetDiskObject(temp);
   if(dobj==NULL) return(0);
   oldtooltypes=dobj->do_ToolTypes;
   if(t=FindToolType(oldtooltypes,c))
   { 
     strcpy(temp,t); num=atoi(t);FreeDiskObject(dobj); return(num); }
   FreeDiskObject(dobj);
   return(0);
}

int IsFromConf(int Conf,char *c);
int GetFromConf(int Conf,char *c,char *buf);
int IntFromConf(int Conf,char *c);

//#define CurConf(x)  dobj=(struct DiskObject *)*(MemConf+((ULONG)x))
#define CurConf(x) dobj=(struct DiskObject *)MemConf[x]
int IsFromConf(int Conf,char *c)
{
   struct DiskObject *dobj;
   char **oldtooltypes;
   CurConf(Conf);
   oldtooltypes=dobj->do_ToolTypes;
   if(FindToolType(oldtooltypes,c)) return(1); 
   return(0);
}

int GetFromConf(int Conf,char *c,char *buf)
{
   struct DiskObject *dobj;
   char **oldtooltypes;
   char *t;
   CurConf(Conf);
   oldtooltypes=dobj->do_ToolTypes;
   if(t=FindToolType(oldtooltypes,c)) { strcpy(buf,t); return(1); }
   return(0);
}
int IntFromConf(int Conf,char *c)
{
   struct DiskObject *dobj;
   char **oldtooltypes;
   char *t;
   int num;
   CurConf(Conf);
   oldtooltypes=dobj->do_ToolTypes;
   if(t=FindToolType(oldtooltypes,c))
   { 
     num=atoi(t);return(num); }
   return(0);
}

int Wild(char *s)
{
  register int i=0;
  while(*(s+i)!='\0')
  {
     if(*(s+i)!='%' && *(s+i)!='#' && *(s+i)!='?' && *(s+i)!='/' && *(s+i)!='(' &&
     *(s+i)!=')' && *(s+i)!=' ') { i++; continue; }
     if(*(s+i)==' ') return(0);
     *s='?';
     return(1);
  }
  return(0);
}