#include "bbs.h"
extern struct myst my_struct;

//#define CO_SYSOPLEVEL 240     /* My CO_SYSOP LEVEL */
extern int rzmsg;
extern long NumOfZMsgs, Last_Msg_Read_Conf,Last_New_Read_Conf;
int FWDFlag,NoDirF,TEMPFlag,ReplyFlag,Comment,PrivateFlag,NonStop,stat,Lines=0;
long FWDToMsg,MSGNUM,DelMSGNUM,CurrentSeekPos,AlreadyRecvd;
char FWDDir,AttachedFile[255];
char MsgBuf[100][80];
BPTR gfh;
struct User tuser;
struct UserKeys tuserkeys;
void DeleteMsgFiles(long num);
void AttachMsgFiles(long num,char *s);
/* static functions */
int Edit(void);
int doormsgcode=0;
extern int XIMPort;
static int fileattach=0;
static int Readit(void);
static void CreateFile(char *s)
{
 FILE *f;

 if(f=fopen(GSTR3,"w"))  {
     fprintf(f,"DO NOT DELETE!\n");
     fclose(f);
 }
}

static BPTR LockMsgBase(void)
{
 BPTR lock;
 UWORD loop=0;
 LONG error;

 sprintf(GSTR3,"%sMailLock",MsgBase_Location);
 do  {
     if(!(lock=Lock(GSTR3,ACCESS_WRITE))) {
         error=IoErr();
         if(error==205)        CreateFile(GSTR3);
         Delay(120L);
         SendChar('.');
     }
 } while(!lock&&loop++<30);

 if(!lock) {
     sprintf(GSTR3,"\tError %ld trying to Lock MSGBASE\n",IoErr());
     CallersLog(GSTR3);
 }
 return(lock);
}

static void MsgToHeader(void)
{
 AEPutStr("\r\n                       [32m([33m------------------------------[32m)[0m\r\n");
 AEPutStr("     [36mTo[33m: [32m([33mEnter[32m)[0m=[32m'[33mALL[32m'[32m?[0m ");
}

static int SaveStatOnly(void)
{
long error;
char string[255];
BPTR fd;

 strcpy(string,MsgBase_Location);
 strcat(string,"MailStats");
 if(!(fd=Open(string,MODE_NEWFILE))) {
     MyError(2);
     return(FAILURE);
 }

 error=Write(fd,(char *)&MailStat,sizeof(struct MailStat));
 if(error!=sizeof(struct MailStat))  {
     AEPutStr("Wasn't the same!\r\n");
     Close(fd);
     MyError(2); 
     return(FAILURE);
 }
 Close(fd);
 return(SUCCESS);
}


static int Save_MessageHeader(void)
{
 extern int stat;
 long error;
 Seek(gfh,0,OFFSET_END);
 error=Write(gfh,(char *)&MailHeader,sizeof(struct MailHeader));
 if(error!=sizeof(struct MailHeader))    return(FAILURE);

 Seek(gfh,CurrentSeekPos,OFFSET_BEGINNING);

 MailStat.HighMsgNum+=1;
 if(MailStat.HighMsgNum==2)  MailStat.LowestNotDel=1;

 stat=SaveStatOnly();
 if(stat==FAILURE)   return(stat);
 return(SUCCESS);
}

static int CheckToForward(char *str,char *name,int check)
{
 int stat,error=0;
 strcpy(GSTR3,Conference_Location);
  if(GSTR3[strlen(GSTR3)-1]=='/') GSTR3[strlen(GSTR3)-1]='\0';
 if(GetFromConf(CN-1,"FORWARDMAIL",str)) {
         if(str[strlen(str)-1]=='\n')    str[strlen(str)-1]='\0';
         if(check) {
             Load_Account(1,&tuser,&tuserkeys);
             if(StringCompare(name,tuser.Name)==SUCCESS) {
                 if(stat=Find_User_From_Name(1,str,&tuser,&tuserkeys)) {
                     sprintf(GSTR3,"    [36mForwarding mail To[33m:[0m %s\r\n",tuserkeys.UserName);
                     AEPutStr(GSTR3);
                     strcpy(name,tuserkeys.UserName);
                     error=1;
                 }
             }
         } else  {
             if(stat=Find_User_From_Name(1,str,&tuser,&tuserkeys)) {
                 sprintf(GSTR3,"    [36mForwarding mail To[33m:[0m %s\r\n",tuserkeys.UserName);
                 AEPutStr(GSTR3);
                 strcpy(name,tuserkeys.UserName);
                 error=1;
             }
         }
 }
 return(error);
}

int CallMsgFuncs(WORD which,int pass);

int CommentToSYSOP(void)
{
 extern struct User tuser;
 extern struct UserKeys tuserkeys;
 int stat;
 char str[255];

 stat=Load_Account(1,&tuser,&tuserkeys);
 strcpy(MailHeader.ToName,tuser.Name);

 AEPutStr("\r\n                       [32m([33m------------------------------[32m)[0m\r\n");
 sprintf(str,"     [36mTo[33m: [32m([33mEnter[32m)[0m=[32m'[33mALL[32m'[32m?[0m %s\r\n",MailHeader.ToName);
 AEPutStr(str);
 CheckToForward(str,MailHeader.ToName,0);
 AEPutStr("[36mSubject[33m: [32m([33mBlank[32m)[0m=[33mabort[32m?[0m ");
 stat=LineInput("",str,30,KEYBOARD_TIMEOUT);
if(stat<0)  return(stat);

 if(str[0]=='\0') {
     AEPutStr("\r\n");
     return(SUCCESS);
 }
 strcpy(MailHeader.Subject,str);
 MailHeader.Status[0]='R';
 Comment=1;
 stat=CallMsgFuncs(2,0);
 if(stat<0)  return(stat);
 return(SUCCESS);
}

static int SecondWord(char *s)
{
 int loop;

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

int LoadMsg(char *s)
{
FILE *f;
char *p;

 Lines=0;

 strcpy(MsgBuf[0],s);
 if(f=fopen(MsgBuf[0],"r"))  {
     while(fgets(MsgBuf[Lines],79,f)!=NULL &&Lines<99) {
         MsgBuf[Lines][strlen(MsgBuf[Lines])-1]='\0';
         Lines++;
     }
     fclose(f);
     return(1);
 }
return(0);
}

static int EnterMSG(void)
{
 int AFlag;
 long i,i2,i3;
 BPTR rzmsglock;
 char str[255],string[255];
 FILE *f;
 BPTR msgbaselock;
 AFlag=0;
 AttachedFile[0]='\0';
 if(Comment==1)  {
     Comment=0;
     goto SkipAll;
 }
 if(ReplyFlag==1)    goto SkipBegin;
 else {
     i=CommandSplit();
     if(i>1) {
         if(i=SecondWord(MAINMENU_Li))
          if(strlen(&MAINMENU_Li[i])<=30 && i>0)
          {   
             strcpy(MailHeader.ToName,MAINMENU_Li+i);
             MsgToHeader();
             AEPutStr(MailHeader.ToName);
             AEPutStr("\r\n");
             goto SkipEntry;
         }
        }
     }
 

 MsgToHeader();
 stat=LineInput("",MailHeader.ToName,30,KEYBOARD_TIMEOUT);
 if(stat<0)  return(stat);

SkipEntry:

 MailHeader.Status[0]='P';
 if(strlen(MailHeader.ToName)==0) {
     AFlag=1;
     strcpy(MailHeader.ToName,"ALL");
 } else {
     strcpy(str,MailHeader.ToName);
     strlwr(str);                           /* convert string to lower case */
     stat=strncmp(str,"eall",4);            /* looking for eall             */

     if(stat==0) {
           if(GET_BIT(ACS_EALL_LEVEL)) {
             AFlag=2;
             strcpy(MailHeader.ToName,"EALL");
         } else {
             AEPutStr("\r\nUser does not exist!!\r\n\r\n");
             return(FAILURE);
         }
     } else  {
         stat=strncmp(str,"sysop",5);
         if(stat==0)
             Load_Account(1,&tuser,&tuserkeys);
         else {
             stat=ChooseAName(MailHeader.ToName,&tuser,&tuserkeys,1);
             if(stat<0)  return(stat);
         }
         strcpy(MailHeader.ToName,tuserkeys.UserName);
         if(!IsTempConf(&tuser,CN-1))  {
             AEPutStr("\r\nUser does not have access to this conference!\r\n\r\n");
             return(FAILURE);
           }
     }
 }

 CheckToForward(str,MailHeader.ToName,1);
 AEPutStr("[36mSubject[33m: [32m([33mBlank[32m)[0m=[33mabort[32m?[0m ");
 stat=LineInput("",MailHeader.Subject,30,KEYBOARD_TIMEOUT);
 if(stat<0)  return(stat);
 if(strlen(MailHeader.Subject)==0) {
     AEPutStr("\r\n");
     return(FAILURE);
 }

SkipBegin:
 if(!AFlag) {
     AEPutStr("         [36mPrivate ");
     stat=YesNo(2);
     if(stat<0)  return(stat);
     if(stat)     MailHeader.Status[0]='R';
     else         MailHeader.Status[0]='P';
 }

 if(ReplyFlag==1) {
     ReplyFlag=0; 
     AEPutStr("  [36mQuote in Reply ");
     stat=YesNo(2);
     if(stat<0)  return(stat);
     if(stat) {
         sprintf(GSTR1,"%s%d",MsgBase_Location,MailHeader.MsgNumb);
         if(stat=LoadMsg(GSTR1)) {
             AEPutStr("\r\n");
             gnsflag=0;
             LineCount=0;
             for(i=0; i<Lines; i++) {
                 sprintf(str,"%2d> %s\r\n",i+1,MsgBuf[i]);
                 AEPutStr(str);
                 if(stat=CheckForPause())
                     break;
             }
             for(;;)  {
                 AEPutStr("\r\n Enter Startline,Endline or (*=ALL, A=Abort): ");
                 stat=LineInput("",str,6,KEYBOARD_TIMEOUT);
                 if(stat<0)  return(stat);
                 stat=FirstCharValue(str);
                 if(stat=='A'||stat=='a') {
                     i=(-1);
                     Lines=0;
                     break;
                 }
                 if(stat=='*')  {
                     i=1;
                     i2=Lines;
                 } else  sscanf(str,"%d,%d",&i,&i2);

                 if((i>0&&i<=Lines)&&(i2>0&&i2<=Lines)&&(i<=i2))
                     break;

             }
             if(i!=(-1)) {
                 for(i3=0; i3<=(i2-i); i3++) {
                    if(i3<97)
                   {
                     strcpy(str,MsgBuf[i+i3-1]);
                     strcpy(MsgBuf[i3],str);
                   }
                 }
                 
                 if(i3<97)    Lines=i3;
                 else         Lines=97;
                 sprintf(MsgBuf[Lines]," ^^^-[ %s ]",MailHeader.FromName);
                 while(strlen(MsgBuf[Lines])<70) strcat(MsgBuf[Lines],"-");
                 Lines++;*\
                 strcpy(MsgBuf[Lines++]," ");
                 MsgBuf[Lines][0]='\0';
             } else  {
                 for(i=0; i<100; i++)
                     MsgBuf[i][0]='\0';
             }
         }
     } else {
         for(i=0; i<100; i++)
             MsgBuf[i][0]='\0';
         Lines=0;
     }
 } else {

SkipAll:
     for(i=0; i<100; i++)         MsgBuf[i][0]='\0';
     Lines=0;
 }

 stat=Edit();
 if(stat==TIMEOUT||stat==NO_CARRIER)  return(stat);

 if(stat<0) {
     AEPutStr("\r\n");     return(FAILURE);
 }
   
 AEPutStr("Saving...");
 MailHeader.Recv=0L;
 MailHeader.MsgDate=time(NULL);
 strcpy(MailHeader.FromName,User.Name);
 if(msgbaselock=LockMsgBase()) {
     GetMailStatFile();
     MailHeader.MsgNumb=MailStat.HighMsgNum;
     stat=Save_MessageHeader();
     if(stat!=FAILURE) {
         sprintf(string,"Message Number %ld...",MailHeader.MsgNumb);
         AEPutStr(string);
         sprintf(GSTR3,"%s%ld",MsgBase_Location,MailHeader.MsgNumb);
         if(!(f=fopen(GSTR3,"w"))) {
             AEPutStr("Failed!\r\n\r\n"); rzmsg=NULL;
             return(FAILURE);
         }
         for(i=0; i<Lines; i++)
             fprintf(f,"%s\n",MsgBuf[i]);
         fclose(f);
         AEPutStr("done!\r\n\r\n");

         if(AttachedFile[0]!='\0') {
             SetComment(GSTR3,AttachedFile);
             AttachedFile[0]='\0';
         }
     } else    AEPutStr("Failed!\r\n\r\n");
     UnLock(msgbaselock);
    if(rzmsg)
    {
       sprintf(GSTR1,"%sF%ld",MsgBase_Location,MailHeader.MsgNumb);
       if(rzmsglock=CreateDir(GSTR1)) UnLock(rzmsglock);
       SetEnvStat(ENV_UPLOADING); 
       AEPutStr("\r\n");           /* 11w */
             stat    = Upload_a_File(0); rzmsg=NULL;
             sprintf(GSTR1,"%sF%ld",MsgBase_Location,MailHeader.MsgNumb);
             DeleteFile(GSTR1);
             if(stat == GOODBYE) { fileattach=FALSE;
                 Goodbye();
                 return(STANDARD_LOGOFF);
             }
             if(stat == NO_CARRIER) {
                 return(NO_CARRIER);
             }
             return(stat);
    }
 } else
     AEPutStr("ERROR! Another task has the MsgBase locked!\r\nMessage has not been saved!\r\n\r\n");
 rzmsg=NULL;
  return(SUCCESS);
}

 int Edit(void)
{
 register int c;
 int cn,j,x,back,BKFlag;
 static char str[200],SPACE[90],str2[10],temp[170];

/* Clear msg buffer */
 rzmsg=NULL;
 str[0]='\0';
 x=0;
 BKFlag=0;

 AEPutStr("\r\n");
 AEPutStr("   Enter your text. (Enter) alone to end. (75 chars/line, 100 lines, max)\r\n");
 AEPutStr("   (*-------*-------*-------*-------*-------*-------*-------*-------*-------*--)\r\n");
if(Lines!=0)
	{
	for(j=0; j<Lines; j++)
		{
		sprintf(SPACE,"%2d> %s\r\n",j+1,MsgBuf[j]);
		AEPutStr(SPACE);
		}
	}
/*removed (JOE)

 if(Lines!=0) {
     for(j=0; j<Lines; j++) {
         sprintf(SPACE,"%2d> %s\r\n",j+1,MsgBuf[j]);
         AEPutStr(SPACE);
     }
 }
*/
 SPACE[0]='\0';

 do {
     BEG_IN:
     strcpy(MsgBuf[Lines],SPACE);
     sprintf(str,"%2d> %s",Lines+1,MsgBuf[Lines]);
     AEPutStr(str);

     for(;;) {
         Next2:


         c=ReadChar(KEYBOARD_TIMEOUT);
         if(c<0)  return(c);
         /*if(c==('X'-'A'+1))
         {
           sprintf(GSTR1,"%sNode%d/PlayPen/",Cmds->BBSLoc,Cmds->AcLvl[VL_NODE_NUMBER]);
           if(Zmodem_Receive(GSTR1,0))
           MsgFiles();
           goto Next2;
         }*/
         if(c=='\r') {
             if(SPACE[0]=='\0') {
                 MsgBuf[Lines][0]='\0';
                 BKFlag=1;
                 break;
             }
             strcpy(MsgBuf[Lines],SPACE);
             SPACE[0]='\0';
             AEPutStr("\r\n");
             x=0;
             break;
         }
         if(c=='\30') {
             while(x) {
                 AEPutStr("\b \b");
                 --x;
             }
             SPACE[x]='\0';
             goto Next2;
         }
         if(c=='\b' || c=='\177') {
             if(x>0) {
                 x-=1;
                 SPACE[x]='\0';
                 AEPutStr("\b \b");
                 goto Next2;
             }
             goto Next2;
         }
         if(c=='\t') {
             c=x%8;
             if(x+(8-c)>72)       c='\t';
             else {
                 for(;c<8; c++) {
                     str2[0]=(char)' ';
                     str2[1]='\0';
                     SendChar(' ');
                     strcat(SPACE,str2);
                     x++;
                 }
             }
         }
         if(c<' ')
             goto Next2;

         x+=1;
         SendChar(c);
         str2[0]=(char)c;
         str2[1]='\0';
         strcat(SPACE,str2);
         if(x>75) {
             back=0;
             for(cn=x; cn>=0; cn--)  {
                 if(SPACE[cn-1]==' ') {
                     back=x-cn;
                     SPACE[cn-1]='\0';
                     break;
                 }
             }
             if(back==0) {
                 strcpy(MsgBuf[Lines],SPACE);
                 AEPutStr("\r\n");
                 SPACE[0]='\0';
                 x=0;
                 break;
             }
             str[0]='\0';
             for(cn=(x-back); cn<x; cn++) {
                 str2[0]=SPACE[cn];
                 str2[1]='\0';
                 strcat(str,str2);
             }
             x=strlen(str);
             strcpy(MsgBuf[Lines],SPACE);
             strcpy(SPACE,str);
             for(cn=0; cn<x; cn++)
                 AEPutStr("\b \b");
             AEPutStr("\r\n");
             break;
         }
     }

     Lines+=1;
     if(Lines==98&&BKFlag==0)
         AEPutStr("\r\nWarning two lines remaining.\r\n\r\n");

 } while(BKFlag==0&&Lines<100);

 if(Lines<100)    Lines-= 1;
 else             Lines = 100;

 AEPutStr("\r\n");

 do {
   if(User.Sec_Status > (USHORT) my_struct.cosysop_level)
         AEPutStr("\r\n[33mA[32m)[36mbort, [33mC[32m)[36mont, [33mD[32m)[36mel, [33mE[32m)[36mdit, [33mF[32m)[36mile, ");
     else
         AEPutStr("\r\n[33mA[32m)[36mbort, [33mC[32m)[36mont, [33mD[32m)[36mel, [33mE[32m)[36mdit, ");
    AEPutStr("[33mL[32m)[36mist, [33mS[32m)[36mave Option[0m? ");

     stat=LineInput("",str,10,KEYBOARD_TIMEOUT);
     if(stat<0)      break;
     if(str[0]=='D'||str[0]=='d') {
         do {
             if(Lines==0) {
                 AEPutStr("\r\nNo lines to delete.\r\n");
                 stat=0;
                 break;
             }
/*
             if(Lines==89)   Lines+=1;
*/
             sprintf(str,"\r\n[36mLine number to delete [32m[[33m1[32m..[33m%d[32m][0m? ",Lines);
             AEPutStr(str);
             stat=LineInput("",str,5,KEYBOARD_TIMEOUT);
             if(stat<0)  break;
             if(str[0]=='\0') { stat=0; break; }
             sscanf(str,"%d",&stat);

             if(stat<1||stat>Lines)  {
                 sprintf(str,"\r\nLine %d does not exist.\r\n",stat);
                 AEPutStr(str);
             }
         } while(stat<1||stat>Lines);

         if(stat<0)  break;
         if(stat==0) continue;
         sprintf(str,"\r\n%2d> %s\r\n",stat,MsgBuf[stat-1]);
         AEPutStr(str);
         AEPutStr("\r\n[36mIs this the correct line [32m([33mY[32m/[33mN[32m)[0m? ");
         cn=YesNo(0);
         if(cn<0)  break;

         if(cn) {
             for(j=(stat-1); j<Lines; j++)
                     strcpy(MsgBuf[j],MsgBuf[j+1]);

             sprintf(str,"\r\nDeleted line %d.\r\n",stat);
             Lines-=1;
             AEPutStr(str);
         }
         continue;
     }

     if(str[0]=='C'||str[0]=='c') {
         AEPutStr("\r\n");
         Lines-=1;
         if(Lines<0)   Lines=0;
         strcpy(SPACE,MsgBuf[Lines]);
         BKFlag=0;
         x=strlen(SPACE);
         goto BEG_IN;
     }
     if(str[0]=='E'||str[0]=='e') {
         if(Lines<1) {
             AEPutStr("\r\nNo Lines to edit!\r\n");
             continue;
         }
LoopHere:
         sprintf(str,"\r\n[36mLine number to edit [32m[[33m1[32m..[33m%d[32m][0m? ",Lines);
         AEPutStr(str);

         stat=LineInput("",str,5,KEYBOARD_TIMEOUT);
         if(stat<0)              return(TIMEOUT);
         if(str[0]=='\0')            continue;

         sscanf(str,"%d",&x);
         if(x<1||x>Lines) {
             sprintf(str,"\r\nLine %d does not exist.\r\n",x);
             AEPutStr(str);
             goto LoopHere;
         }
         sprintf(SPACE,"\r\n%2d> %s\r\n",x,MsgBuf[x-1]);
         AEPutStr(SPACE);
         AEPutStr("\r\n    Old string;New string");
         AEPutStr("\r\n   (------------------------------------------------------------)");
         AEPutStr("\r\n   :");

         stat=LineInput("",str,60,KEYBOARD_TIMEOUT);
         if(stat<0)          return(TIMEOUT);
         if(str[0]=='\0')    continue;

         stat=ProcessLine(str,MsgBuf[x-1],temp);
         if(stat==0) {
             AEPutStr("\r\nString not found!\r\n");
             continue;
         } else {
             AEPutStr("\r\n    NewLine:\r\n    --------\r\n   >");
             AEPutStr(temp);
             AEPutStr("\r\n\r\nCorrect ");

             stat=YesNo(1);
             if(stat<0)   return(stat);
             if(!stat)       continue;

             strcpy(MsgBuf[x-1],temp);
         }
         continue;
     }

     if(str[0]=='L'||str[0]=='l') {
         AEPutStr("\r\n");
         for(j=0; j<Lines; j++) {
             sprintf(SPACE,"%2d> %s\r\n",j+1,MsgBuf[j]);
             AEPutStr(SPACE);
         }
         continue;
     }

     if(str[0]=='F'||str[0]=='f') {
         if(GET_BIT(ACS_ATTACH_FILES) && fileattach) {
             for(;;) {
                 if(XIMPort==CONSOLE_PORT) asl(AttachedFile); else
                 {
                 AEPutStr("\r\nEnter path/filename to attach ('5 <DIR>'=DIR): ");
                 stat=LineInput("",AttachedFile,250,KEYBOARD_TIMEOUT);
                 if(stat<0)      return(stat);
                 if(AttachedFile[0]=='5'&&AttachedFile[1]==' ') {
                     strcpy(MAINMENU_Li,AttachedFile);
                     AttachedFile[0]='\0';
                     MyDirAnyWhere();
                     continue;
                 }
                 }
                 if(AttachedFile[0]!='\0') {
            if(FindAssign(AttachedFile))
          {
             AEPutStr("\r\nDevice not Mounted.\r\n");
             AEPutStr("\r\n");
             AttachedFile[0]='\0'; continue;
          }
                     strlwr(AttachedFile);

                     if(Restricted(AttachedFile)){AttachedFile[0]='\0'; continue; }
                      else{
  AEPutStr("Delete file when message is deleted ");
						stat=YesNo(2);
						if(stat<0)   {  return(stat);  }
                              strlwr(AttachedFile);
						if(stat){  AttachedFile[0]=toupper(AttachedFile[0]); }
					  }
                 }
                 break;
             }
         } else
             AEPutStr("\r\nCommand requires higher access.\r\n");

     }
     if(str[0]=='S'||str[0]=='s') {
         User.Messages_Posted++;
         return(SUCCESS);
     }
     if(fileattach && (str[0]=='X'||str[0]=='x') && (GET_BIT(ACS_PRI_MSGFILES) || GET_BIT(ACS_PUB_MSGFILES)))
     {
       rzmsg=1;
       User.Messages_Posted++;
       return(SUCCESS);
     }
     if(str[0]=='A'||str[0]=='a') {
         AEPutStr("\r\nAbort message entry (y/n)? ");
         stat=YesNo(0);
         if(stat<0)          break;
         
         if(stat)            return(-1); 
     }
 } while(stat>=0);
 return(stat);
}


static int Load_MessageHeader(void)
{
long HeadPoint,size,FilePos,error,temp;
 HeadPoint=MSGNUM-MailStat.LowestKey;
 size=(long)sizeof(struct MailHeader);
 FilePos=(long)size*(long)HeadPoint;
 temp=FilePos-CurrentSeekPos;
 if(temp) {
     error=Seek(gfh,temp,OFFSET_CURRENT);
     if(error<0) {
         MyError(2);
         return(FAILURE);
     }
 }
 
  error=FRead(gfh,(char *)&MailHeader,sizeof(struct MailHeader),1);
 if(error!=1) {
     MyError(2);
     return(FAILURE);
 }

 CurrentSeekPos=Seek(gfh,0,OFFSET_CURRENT);
 return(SUCCESS);
}

static int Save_OverHeader(void)
{
 long HeadPoint,size,FilePos,error,temp;

 HeadPoint=DelMSGNUM-MailStat.LowestKey;
 size=(long)sizeof(struct MailHeader);
 FilePos=(long)size*(long)HeadPoint;
 temp=FilePos-CurrentSeekPos;

 error=Seek(gfh,temp,OFFSET_CURRENT);
 if(error<0) {
     MyError(2);
     return(FAILURE);
 }

 error=Write(gfh,(char *)&MailHeader,sizeof(struct MailHeader));
 if(error!=sizeof(struct MailHeader))    {
     MyError(2);
     return(FAILURE);
 }
 Seek(gfh,CurrentSeekPos,OFFSET_BEGINNING);
 return(SUCCESS);
}

static int CheckAttachedFile(long msgnumb,int flag)
{
 int stat;
 char str[250];
 struct FileInfoBlock *FBlock;
 BPTR FLock;
 int filetype=0;
 GSTR1[0]='\0';

 DTBT=0;
 TBT=0;
 TTTM=NULL;
 TTEFF=NULL;
 TTCPS=NULL;

 sprintf(str,"%s%ld",MsgBase_Location,msgnumb);

 if(FBlock=(struct FileInfoBlock *)AllocDosObject(DOS_FIB,NULL)) {
	    if(FLock=Lock(str,ACCESS_READ))	
         {
 		 if(Examine(FLock,FBlock)) {
 			if(FBlock->fib_Comment[0]!='\0'){
 				strcpy(GSTR1,FBlock->fib_Comment); filetype=1;
			 }
 		   
	       }
         UnLock(FLock);
            if(filetype==0)
           {
            sprintf(str,"%sF%ld",MsgBase_Location,msgnumb);
            if(FLock=Lock(str,ACCESS_READ))
            {
              UnLock(FLock); filetype=2;
            }
           }
         }
	    FreeDosObject(DOS_FIB,FBlock);
	}
     
       
 if(filetype) {
 	if(flag) {
	    	AEPutStr("...This message has an attached file(s), Download? (y/N/goodbye)? ");
 			stat=ReadChar(KEYBOARD_TIMEOUT);
	    		if(stat<0)
 				return(stat);
               if(stat=='n' || stat=='N')AEPutStr("No\r\n");
               if(stat=='y' || stat=='Y')
               {
 					AEPutStr("Yes\r\n\r\n");
                         if(filetype==2)AttachMsgFiles(msgnumb,GSTR1);
                         
	    				Zmodem_Send(GSTR1);
               }
               if(stat=='g' || stat=='G')
               {
 					AEPutStr("Goodbye\r\n\r\n");
                         if(filetype==2)AttachMsgFiles(msgnumb,GSTR1);
	    				Zmodem_Send(GSTR1);
		    			AEPutStr("\r\n");
			    		stat=PGoodbye();
				    	if(stat==GOODBYE)	ModemOffHook();
     				return(stat);
               }

 					
	    				stat=0;
 		AEPutStr("\r\n");
		} else	{
          
          if(filetype==2) DeleteMsgFiles(msgnumb);
 		stat=isupper(GSTR1[0]);
	    	if(stat) {
 			DeleteFile(GSTR1);
	    		AEPutStr("\r\nDeleted attached file(s) ");
		    	AEPutStr(GSTR1);
           }
		}
	}
 return(SUCCESS);
}

static int DeleteMSG(void)
{
char string[255];
BPTR msgbaselock;

 if(User.Sec_Status<210) {
	    if(StringCompare(MailHeader.FromName,User.Name)==SUCCESS)
		    goto GoAheadDel;
	    if(StringCompare(MailHeader.ToName,User.Name)==SUCCESS)
		    goto GoAheadDel;
	    AEPutStr("\r\nMessage not deleted, not your mail.\r\n\r\n");
	    return(FAILURE);
	}

GoAheadDel:
 if(msgbaselock=LockMsgBase()) {
	   GetMailStatFile();
    DelMSGNUM=MSGNUM-FWDFlag;
    if(MailStat.LowestNotDel==DelMSGNUM)    MailStat.LowestNotDel+=1;
    stat=SaveStatOnly();
    MailHeader.Status[0]='D';
    CheckAttachedFile(DelMSGNUM,0);
    sprintf(string,"%s%ld",MsgBase_Location,DelMSGNUM);
    stat=DeleteFile(string);
    stat=Save_OverHeader();
    sprintf(string,"\r\nMessage %d deleted...\r\n",DelMSGNUM);
    AEPutStr(string);
    UnLock(msgbaselock);
 }
 else  AEPutStr("Can't Lock MsgBase, Message not Deleted!\r\n");
 return(SUCCESS);
}


static int DisplayMessage(void)
{
 long TimeVar;
 char str[255],string[255],date[100];

 TimeVar=(long)MailHeader.MsgDate;
 sprintf(date,"%s",ctime(&TimeVar));
 date[strlen(date)-1]='\0';

 if(GET_BIT(ACS_CLEAR_SCREEN_MSG)) SendChar(12);

 sprintf(str,"\r\n[32mDate   [33m: [0m%-30s   [32mNumber[33m: [0m%ld\r\n",date,MailHeader.MsgNumb);
 AEPutStr(str);
 strcpy(date,MailHeader.ToName);
 strlwr(date);
 TimeVar=(long)strncmp(date,"eall",4);
 if(TimeVar==0) {
  strcpy(date,User.Name);
     strcat(date," (ALL)");
 } else
      strcpy(date,MailHeader.ToName);

 sprintf(str,"[32mTo     [33m: [0m%-30s  ",date);
 AEPutStr(str);
 if(MailHeader.Recv!=0) {
     TimeVar=MailHeader.Recv;
     sprintf(date,"%s",ctime(&TimeVar));
     date[strlen(date)-1]='\0';
     sprintf(str," [32mRecv'd[33m: [0m%s\r\n",date);
     AEPutStr(str);
 } else {
     AEPutStr(" [32mRecv'd[33m: [0m");
     if(StringCompare(MailHeader.ToName,"ALL")==SUCCESS)
          AEPutStr("N/A\r\n");
     else
          AEPutStr("No\r\n");
 }

 if(MailHeader.Status[0]=='P')
     strcpy(string,"Public Message");
 else
     strcpy(string,"Private");
 
 sprintf(str,"[32mFrom   [33m: [0m%-30s   [32mStatus[33m: [0m%s\r\n",MailHeader.FromName,string);
 AEPutStr(str);
 sprintf(str,"[32mSubject[33m: [0m%s\r\n\r\n",MailHeader.Subject);
 AEPutStr(str);

 AlreadyRecvd=MailHeader.Recv;

 if(StringCompare(MailHeader.ToName,User.Name)==SUCCESS) {
     if(MailHeader.Recv==0)  {
      MailHeader.Recv=time(NULL);
         DelMSGNUM=MailHeader.MsgNumb;
         Save_OverHeader();
     }
 }

 sprintf(GSTR3,"%s%ld",MsgBase_Location,MailHeader.MsgNumb);

 if(NonStop) {
  stat=MenuSend(GSTR3);
     if(stat==FAILURE)
          NonStop=0;
 } else {
      gnsflag=0;                                   /* 11w */
      (void)MenuSend24(GSTR3,5);
 }

     stat=CheckAttachedFile(MailHeader.MsgNumb,1);
     return(stat);

}

static void EditEMessage(long number)
{
 sprintf(GSTR1,"%s%d",MsgBase_Location,number);
 EditEmacs(GSTR1);
}

/* 11w addition */
int GetAValidName(char *Name,char *Default,char *str)
{

 if(strlen(Name)==0) {
	    strcpy(str,Default); return(0);
 }
 strcpy(str,Name);
 strlwr(str);
 if(!strncmp(str,"all",3))  {
     strupr(str); return(1);
 }
 if(!strncmp(str,"eall",4))  {
     strupr(str); return(1);
 }
 if(!strncmp(str,"sysop",5))
		Load_Account(1,&tuser,&tuserkeys);
	else {
		stat=ChooseAName(Name,&tuser,&tuserkeys,1);
		if(stat<0)	{
			*(str)='\0';return(0);
		}
	}

	strcpy(str,tuserkeys.UserName);
	if(!IsTempConf(&tuser,CN-1))	{
     AEPutStr("\r\nUser does not have access to this conference, try another!\r\n\r\n");
 	  *(str)='\0';return(0);
 }
 return(0);
}
/* 11w addition */

static int EditHeader(void)
{
 int AFlag;
 struct MailHeader MH;
 char string[200];

 MH=MailHeader;
 MH.Status[0]='P';
 AEPutStr("\r\n");
 sprintf(string,"     [36mFrom[33m: [32m([33mEnter[32m)[0m=[32m'[33m%s[32m'[32m?[0m ",MailHeader.FromName);
 AEPutStr(string);
 stat=LineInput("",string,30,KEYBOARD_TIMEOUT);
 if(stat<0)  return(stat);
 AFlag=GetAValidName(string,MailHeader.FromName,MH.FromName);

 if(MH.FromName[0]=='\0') return(2);

 if(AFlag) {
   AEPutStr("Invalid From Name. Aborting.\r\n");
   return(2);
 }
 sprintf(string,"     [36m  To[33m: [32m([33mEnter[32m)[0m=[32m'[33m%s[32m'[32m?[0m ",MailHeader.ToName);
 AEPutStr(string);
 stat=LineInput("",string,30,KEYBOARD_TIMEOUT);
 if(stat<0)  return(stat);
 AFlag=GetAValidName(string,MailHeader.ToName,MH.ToName);

 if(MH.ToName[0]=='\0') return(2);
 sprintf(string,"  [36mSubject[33m: [32m([33mEnter[32m)[0m=[32m'[33m%s[32m'[32m?[0m ",MailHeader.Subject);
 AEPutStr(string);
 stat=LineInput("",string,30,KEYBOARD_TIMEOUT);
 if(stat<0) return(stat);
 if(string[0]>=' ') strcpy(MH.Subject,string);

 if(!AFlag) {
 	AEPutStr("         [36mPrivate ");
	    stat=YesNo(2);
 	if(stat<0)  return(stat);
	    if(stat)		MH.Status[0]='R';
 	else    		MH.Status[0]='P';
	}

 MH.Recv = 0L;
 MailHeader=MH;
 DelMSGNUM=MSGNUM-FWDFlag;
 Save_OverHeader();
 return(1);
}

static int ReplyToMSG(void);

static int READMsg(void)
{
 int UNum;
 char str[255],string[255];

 NonStop=ReplyFlag=TEMPFlag=NumOfZMsgs=0;
 FWDFlag=1;
 FWDDir='+';
 MSGNUM=Last_Msg_Read_Conf+1;
 if(MSGNUM<MailStat.LowestKey) MSGNUM=MailStat.LowestKey;
 AEPutStr("\r\n");

 stat=CommandSplit();
 if(stat>1) {
  if((Command[stat-1][0]=='N'||Command[stat-1][0]=='n')&&(Command[stat-1][1]=='S'||Command[stat-1][1]=='s'))
     NonStop=1;

 if(Command[1][0]=='S'||Command[1][0]=='s') {
     if(MSGNUM>(MailStat.HighMsgNum-1)) {
         AEPutStr("No new messages.\r\n");
         AEPutStr("\r\n");
         return(FAILURE);
     }
     goto GoNextMsg;
 }
 stat=FirstChar(Command[1]);
 if(stat>=0) {
     if(Command[1][stat]=='-'||Command[1][stat]=='+'||isdigit(Command[1][stat])) {
         strcpy(str,Command[1]);
         goto PassItIN;
     }
 }
}

NoPass:

 FOREVER {
     BackPrompt:
     if(FWDFlag==1)   sprintf(str,"%ld%c%ld",MSGNUM,FWDDir,MailStat.HighMsgNum-1);
     else             sprintf(str,"%ld%c%ld",MSGNUM,FWDDir,MailStat.LowestKey);

     if((MSGNUM>(MailStat.HighMsgNum-1))||(MSGNUM<MailStat.LowestKey))
         strcpy(str,"QUIT");
//(RTS)
     if(User.Sec_Status > (USHORT) my_struct.cosysop_level)
         sprintf(string,"[33mA[32m>[36mgain [33mD[32m>[36melete [33mF[32m>[36mile [33mR[32m>[36meply [33mQ[32m>[36muit [32m<[33mCR[32m>[0m=[33mNext [32m([0m %s[32m )[0m? ",str);
     else
         sprintf(string,"[33mA[32m>[36mgain [33mD[32m>[36melete [33mR[32m>[36meply [33mQ[32m>[36muit [32m<[33mCR[32m>[0m=[33mNext [32m([0m %s[32m )[0m? ",str);

     if(NonStop==0)  {
         AEPutStr(string);
         NoDirF=1;
         stat=LineInput("",str,10,KEYBOARD_TIMEOUT);
         if(stat<0) return(stat);
     }
    
     if((str[0]=='N'||str[0]=='n')&&(str[1]=='S'||str[1]=='s'))
         NonStop=1;

     if((strlen(str)==0)||(NonStop))  {
         NoDirF=1;     goto GoNextMsg;
     }
     if(TEMPFlag) {
         if((PrivateFlag==0)||(StringCompare(MailHeader.ToName,User.Name)== \
          SUCCESS)||(StringCompare(MailHeader.FromName,User.Name)==SUCCESS)){
          if(GET_BIT(ACS_SYSOP_READ) || PrivateFlag==0)
          { 
             switch(tolower(str[0])) {
                 case 'f':
                     stat=CheckAttachedFile(MailHeader.MsgNumb,1);
                     if(stat<0)  return(stat);
                     goto NextMenu;
                 case 'a':
                     stat=DisplayMessage();
                     if(stat<0)  return(stat);
                     goto NextMenu;
                 case 'd':
                     stat=DeleteMSG();
                     NoDirF=1;
                     goto GoNextMsg;
                 case 'r':
                     stat=ReplyToMSG();
                     if(stat<0) return(stat);
                     NoDirF=1; 
                     goto GoNextMsg;
             }      
           }                    /* end switch */
         }             /* end if */
         if((str[0]=='E'||str[0]=='e')&&(GET_BIT(ACS_MSG_EDIT))) {
               /* 11w add */
               if(str[1]=='H' || str[1]=='h')
               {
                 if((stat=EditHeader())<0) return(stat);
               }else
               /* 11w end */
                 EditEMessage(MailHeader.MsgNumb);
             stat=DisplayMessage();
             if(stat<0)  return(stat);
             goto NextMenu;
         }
         if((str[0]=='U'||str[0]=='u')&&(GET_BIT(ACS_ACCOUNT_EDITING))) {
             strcpy(str,MailHeader.FromName);
             UNum=Find_User_From_Name(1,str,&tuser,&tuserkeys);
             stat=Load_Account(UNum,&tuser,&tuserkeys);
             if(stat==FAILURE) {
                 AEPutStr("Warning, error while loading account\r\n");
                 goto NextMenu;
             }
             AEPutStr("\014");
             CallersLog("\tAccount editing from mail.\n");
             sprintf(GSTR1,"%sCommands/SysCmd/",Cmds->BBSLoc);
             sprintf(GSTR2,"ACCOUNTS %d",tuser.Slot_Number);
             if(!CustomCommand(GSTR1,GSTR2,1))
             (void)EditInfo(UNum,&tuser,&tuserkeys);
             AEPutStr("\014");
             stat=DisplayMessage();
             if(stat<0)   return(stat);
             goto NextMenu;
         }
     }
     if(str[0]=='Q'||str[0]=='q') {
         AEPutStr("\r\n");
         return(SUCCESS);
     }

     PassItIN:
     if(NonStop==0)     NoDirF=0;
     else     {
         NoDirF=1;
         FWDFlag=1;
         FWDDir='+';
     }
     if(str[strlen(str)-1]=='+') {
         if(FWDFlag==(-1))  MSGNUM+=2;
         NoDirF=1;

         FWDToMsg=MailStat.HighMsgNum;
         FWDFlag=1;
         FWDDir='+';
         stat=FirstChar(str);
         if(stat>=0&&str[stat]=='+')   goto GoNextMsg;
         str[strlen(str)-1]=' ';
     }
     if(str[strlen(str)-1]=='-')  {
         if(FWDFlag==1) {
             MSGNUM=MSGNUM-1;
             MSGNUM=MSGNUM-TEMPFlag;
         }
         NoDirF=1;
         FWDToMsg=MailStat.LowestKey;
         FWDFlag=-1;
         FWDDir='-';
         stat=FirstChar(str);
         if(stat>=0&&str[stat]=='-')     goto GoNextMsg;
         str[strlen(str)-1]=' ';
     }
     strcat(str," ");

     stat=FirstChar(str);
     if(stat>=0)  {
         if(isdigit(str[stat])) {
             sscanf(str,"%ld",&MSGNUM);
 GoNextMsg:
    if(doormsgcode==2) { doormsgcode=0; return(SUCCESS); }
    if(doormsgcode==1) doormsgcode=2; 
    
    if(stat >=0 || str[stat]=='+' || str[stat] == '-') {
     //(RTS)
          if(User_keys.Userflags & USER_SCRNCLR)       AEPutStr("\f");
    }
             stat=Readit();
             if(stat<FAILURE) return(NO_CARRIER);
             if(stat==10)            return(10);
             if(stat==FAILURE) {
                 AEPutStr("\r\n");
                 if(NumOfZMsgs!=0)   return(SUCCESS);
                 else                return(FAILURE);
             }
         }
     }
     NextMenu:
     AEPutStr("\r\n");
 }
 return(SUCCESS);
}

static void NoMorePlus(void)
{
 char str[100];

 if(NonStop==0) {
     if(NoDirF==0) {
         sprintf(str,"\r\nThe last message in this conference is %ld\r\n",MailStat.HighMsgNum-1);
         AEPutStr(str);
     }
 }
 NonStop=0;
}

static void NoMoreMinus(void)
{
 char str[100];

 if(NonStop==0) {
     if(NoDirF==0) {
         sprintf(str,"\r\nThe first message in this conference is %ld\r\n",MailStat.LowestNotDel);
         AEPutStr(str);
     }
 }
 NonStop=0;
}

static int Readit(void)
{
TEMPFlag=1;

 do {
     if(MSGNUM>MailStat.HighMsgNum-1) {
         NoMorePlus();         return(FAILURE);
     }
     if(MSGNUM<MailStat.LowestKey)  {
         NoMoreMinus();         return(FAILURE);
     }

     stat=Load_MessageHeader();
     if(stat==FAILURE) {
         AEPutStr("\r\nMSG Base Error!!!\r\n");       return(FAILURE);
     }

     PrivateFlag=0;
     if((MailHeader.Status[0]=='R')&& !(GET_BIT(ACS_SYSOP_READ)))  {
         if((StringCompare(MailHeader.ToName,User.Name)!=SUCCESS)&& \
           (StringCompare(MailHeader.FromName,User.Name)!=SUCCESS)) {
             PrivateFlag=1;
             if(NoDirF!=0)      goto NextMSG;
             AEPutStr("\r\nThat message is Private.\r\n\r\n");
             NonStop=0;
             return(SUCCESS);
         }
     }
     if(MailHeader.Status[0]=='D') {
         PrivateFlag=1;
         if(NoDirF!=0)        goto NextMSG;
         AEPutStr("\r\nThat message has been deleted.\r\n\r\n");
         NonStop=0;
         MSGNUM=MSGNUM+FWDFlag;
         return(SUCCESS);
     }

     NumOfZMsgs+=1;
     stat=DisplayMessage();
     if(stat<0)                 return(stat);

     if(MSGNUM>Last_Msg_Read_Conf)     Last_Msg_Read_Conf=MSGNUM;

     MSGNUM=MSGNUM+FWDFlag;
     return(SUCCESS);

     NextMSG:
     if(MSGNUM>Last_Msg_Read_Conf)     Last_Msg_Read_Conf=MSGNUM;
     MSGNUM=MSGNUM+FWDFlag;
 } while((MSGNUM<MailStat.HighMsgNum)&&(MSGNUM>=MailStat.LowestKey));

 if(MSGNUM>=MailStat.HighMsgNum)  NoMorePlus();
 else NoMoreMinus();

 return(FAILURE);
}

static int ReplyPrompt(void);

static int SearchNewMail(int cn)
{
int MailFLAG;
long msgcnt=0,dcnt=0;

 MailFLAG=0;
 NonStop=0;

 if(MailStat.HighMsgNum<Last_New_Read_Conf)
     Last_New_Read_Conf=MailStat.LowestKey;

 MSGNUM=Last_New_Read_Conf;

 if(MSGNUM<=0)
     Last_New_Read_Conf=MSGNUM=MailStat.LowestKey;
 if(MSGNUM<MailStat.LowestKey) MSGNUM=MailStat.LowestKey;
 if(MSGNUM>=MailStat.HighMsgNum) {
     if(cn)     AEPutStr("Sorry, No mail today!\r\n");
     else       AEPutStr("\r\n");
     return(SUCCESS);
 }

 if(!cn)     AEPutStr("\r\nNew Mail Scan.....");

 do {
     if(MSGNUM>=MailStat.HighMsgNum) {
         Last_New_Read_Conf=MailStat.HighMsgNum;
         goto GetOUT;
     }
     msgcnt++;
     if(msgcnt>9) {
         msgcnt=0;
         dcnt++;
         if(dcnt>9) {
             if(dcnt>17) {
                 dcnt=0;
             }
             AEPutStr("\b \b");
         } else   AEPutStr(".");

     }

 stat=Load_MessageHeader();
 if(MailHeader.Status[0]=='D')goto GetNextMSG;
 if((StringCompare(MailHeader.ToName,User.Name)==SUCCESS)|| \
           (StringCompare(MailHeader.ToName,"eall")==SUCCESS)) 
    {
     if(MailFLAG==1) {
         msgcnt=dcnt=0;
         stat=DisplayMessage();
         if(stat<0)  return(stat);
         Last_New_Read_Conf=MSGNUM+1;

         stat=ReplyPrompt();
         if(stat==FAILURE)   return(SUCCESS);
         if(stat<0)  return(stat);

         AEPutStr("\r\nContinuing New Mail Scan...");
     }
     if(MailFLAG==0) {
         AEPutStr("Found mail!\r\n\r\nWould you like to read it now ");
         stat=YesNo(1);
         if(stat<0) return(stat);
         if(stat) {
             MailFLAG=1;
             msgcnt=dcnt=0;
             stat=DisplayMessage();
             if(stat<0)  return(stat);
             Last_New_Read_Conf=MSGNUM+1;
             stat=ReplyPrompt();
             if(stat==FAILURE)       return(SUCCESS);
             if(stat<0)  return(stat);

             AEPutStr("\r\nContinuing New Mail Scan...");
         } else {
             AEPutStr("\r\n");
             return(SUCCESS);
         }
        }
 }
 GetNextMSG:
 MSGNUM+=1;
 } while(MSGNUM<=MailStat.HighMsgNum);

GetOUT:

if(MailFLAG==0)  AEPutStr("No mail today!\r\n");
 else            AEPutStr("No more mail!\r\n");

 return(SUCCESS);
}



static int newmailsearch = FALSE;



static int ReplyPrompt(void)
{
int UNum;
char str[255],string[255];
//char str1[256];
for(;;) {
 FWDFlag=0;
  sprintf(string,"[33mA[32m>[36mgain [33mD[32m>[36melete [33mR[32m>[36meply [33mQ[32m>[36muit [32m<[33mCR[32m>[0m=[33mNext [32m([0m %ld [32m)[0m? ",MSGNUM);
 

 if(NonStop==0) {
     AEPutStr(string);
     stat=LineInput("",str,10,KEYBOARD_TIMEOUT);
     if(stat<0) return(stat);
 }  
    if((str[0]=='N'||str[0]=='n')&&(str[1]=='S'||str[1]=='s'))
        NonStop=1;

 if((strlen(str)==0)||(NonStop))     return(SUCCESS);

 if((str[0]=='A'||str[0]=='a')) {
         stat=DisplayMessage();
         if(stat<0) return(stat);
         continue;
     }
 if((str[0]=='D'||str[0]=='d'))  {
     if((PrivateFlag==0)||StringCompare(MailHeader.ToName,User.Name)==SUCCESS) {
         stat=DeleteMSG();
         return(SUCCESS);
     } else {
         AEPutStr("\r\nNot your message.\r\n");
         continue;
     }
 }
 if((str[0]=='E'||str[0]=='e')&&(GET_BIT(ACS_MSG_EDIT))) {
       if(str[1]=='H' || str[1]=='h')
       {
         if((stat=EditHeader())<0) return(stat);
       }else
     EditEMessage(MailHeader.MsgNumb);
     stat=DisplayMessage();
     if(stat<0)  return(stat);
     continue;
 }
 if((str[0]=='U'||str[0]=='u')) {
     if(GET_BIT(ACS_ACCOUNT_EDITING)) {
         strcpy(str,MailHeader.FromName);
         UNum=Find_User_From_Name(1,str,&tuser,&tuserkeys);
         stat=Load_Account(UNum,&tuser,&tuserkeys);
         if(stat==FAILURE) {
             AEPutStr("Warning, error while loading account\r\n");
             continue;
         }

         AEPutStr("\014");
         CallersLog("\tAccount editing from mail.\n");
         (void)EditInfo(UNum,&tuser,&tuserkeys);
         AEPutStr("\014");
         stat=DisplayMessage();
         if(stat<0) return(stat);
         continue;
     }
 }
 if(str[0]=='Q'||str[0]=='q') {
     AEPutStr("\r\n");
     return(FAILURE);
 }
//(RTS)

 if((str[0]=='r'||str[0]=='R'))  {
     if((PrivateFlag==0)||(StringCompare(MailHeader.ToName,User.Name)==SUCCESS) 
         || !strnicmp(MailHeader.ToName,"EALL",4)) {
         stat=ReplyToMSG();
         return(SUCCESS);
     } else {
         AEPutStr("\r\nNot your message.\r\n");
         continue;
     }
 }
 AEPutStr("\r\nNo such command!!\r\n");
}
return(SUCCESS);
}

static int ReplyToMSG(void)
{
char str[255],frm[255];

 DelMSGNUM=MailHeader.MsgNumb;
 strcpy(frm,MailHeader.ToName);
 AEPutStr("\r\n                       [32m([33m------------------------------[32m)[0m\r\n");
 strcpy(MailHeader.ToName,MailHeader.FromName);
 sprintf(str,"     [36mTo[33m: [32m([33mEnter[32m)[0m=[32m'[33mALL[32m'[32m?[0m %s\r\n",MailHeader.ToName);
 AEPutStr(str);
  CheckToForward(str,MailHeader.ToName,1);
 AEPutStr("[36mSubject[33m: [32m([33mBlank[32m)[0m=[33mabort[32m?[0m ");
 stat=LineInput(MailHeader.Subject,str,30,KEYBOARD_TIMEOUT);
 if(stat<0) { return(stat); }
 strcpy(MailHeader.Subject,str);
 if(strlen(MailHeader.Subject)==0) return(SUCCESS);

 MailHeader.Recv=0L;

 ReplyFlag=1;
 stat=EnterMSG();
 if(stat<0)  return(stat);

 if(StringCompare(frm,User.Name)==SUCCESS) {
     AEPutStr("Delete original message ");
     stat=YesNo(2);
     if(stat<0)  return(stat);
     if(stat)    DeleteMSG();
 }
return(SUCCESS);
}

int CallMsgFuncs(WORD which,int pass)
{
int stat;
 fileattach=TRUE;
 strcpy(GSTR3,MsgBase_Location);
 strcat(GSTR3,"HeaderFile");
 gfh=Open(GSTR3,MODE_OLDFILE);
 if(gfh==NULL) {
     gfh=Open(GSTR3,MODE_NEWFILE);
     if(gfh==NULL) {
         MyError(2); fileattach=FALSE;
         return(FAILURE);
     }
 }
 CurrentSeekPos=0;
 stat=FAILURE;
 MCIViewSafe=FALSE;
 switch(which) {
     case 1:
         stat=READMsg();         break;
     case 2:
         stat=EnterMSG();        break;
     case 3:
         newmailsearch = TRUE;
         stat=SearchNewMail(pass);
         newmailsearch = FALSE;
         break;
 }
 Close(gfh);
 fileattach=FALSE;
 MCIViewSafe=TRUE;
 return(stat);
}


void AttachMsgFiles(long num,char *s)
{
  char image[100];
  char str[100];
  struct FileInfoBlock *FBlock;
 BPTR FLock;
 strcpy(s,"");
 sprintf(str,"%sF%ld",MsgBase_Location,num);

 if(FBlock=(struct FileInfoBlock *)AllocDosObject(DOS_FIB,NULL)) {
	    if(FLock=Lock(str,ACCESS_READ))	{
 		if(Examine(FLock,FBlock)) {
              while(ExNext(FLock,FBlock))
              {
                sprintf(image,"%sF%ld/%s ",MsgBase_Location,num,FBlock->fib_FileName);
                if(strlen(image)+strlen(s)<1024)
                {
                  AEPutStr("\r\nFlagging >:");AEPutStr(FBlock->fib_FileName);
                 
                  strcat(s,image);
                }
                  
			}
               AEPutStr("\r\n");
		}
              UnLock(FLock); 
         }
	    FreeDosObject(DOS_FIB,FBlock);
	}
     
}       

void DeleteMsgFiles(long num)
{
    char image[100];
  struct FileInfoBlock *FBlock;
 BPTR FLock;
 char str[100];
 sprintf(str,"%sF%ld",MsgBase_Location,num);

 if(FBlock=(struct FileInfoBlock *)AllocDosObject(DOS_FIB,NULL)) {
exp:
	    if(FLock=Lock(str,ACCESS_READ))	{

 		if(Examine(FLock,FBlock)) {
              while(ExNext(FLock,FBlock))
              {
                sprintf(image,"%sF%ld/%s",MsgBase_Location,num,FBlock->fib_FileName);
                //UnLock(FLock);
                DeleteFile(image);// goto exp;
			}
               AEPutStr("\r\n");
		}
          UnLock(FLock);   
         }
	    FreeDosObject(DOS_FIB,FBlock);
         DeleteFile(str);
	}
     
}   