#include <stdio.h>
#include <stdlib.h>
#include <exec/exec.h>
#include <exec/types.h>
#include "dh0:code/code20/defines.h"
#define ACCESS_READ -2
struct Commands cmds;
char BBSLoc[200];
char Temp[200];
int nodes=0;
void sr(char *str);
void BBS(void);
void Configs();
void CheckUlPaths(char *str);
void CheckPaths(char *str);
void CheckNeeded(char *str);
int Ndirs(char *str);
void CheckConfig(char *str,int node);
void CheckNode(char *str);
void Nodes(void);
int TLock(char *str);
BOOL WAit=FALSE;
char WAitStr[256];
int end(int nothing);
int end(int nothing)
{
  if(WAit)
  {
    printf("Press RETURN to continue\n");
    gets(WAitStr);
  }
  exit(0);
}
main(int argc,char *argv[])
{
   FILE *fi;
   if(argc<3 || argc>4)
   {
     printf("AX Validation v1.1 written by ByteMaster\n");
     printf("This is an AmiExpress 1.1w+ utility\n");
     printf("Usage: AXVal <bbs location> <nodes> [WAit]\n");
     printf("   ie: AXVal BBS: 9 WAit\n");
     printf("\n");
     end(0);
   }
   if(argc==4) WAit=TRUE;
   printf("AX Validation v1.0 written by Joseph Hodge\n");
   strcpy(BBSLoc,argv[1]); sr(BBSLoc); strupr(BBSLoc);
   nodes=atoi(argv[2]);
   BBS();
   Configs();
   Nodes();
   printf("\n\nBBS structure appears to be intact!\n\n");
   
   end(0);
}

void BBS(void)
{
  char t[200];
  printf("-> Searching for BBS Location\n");
  if(!TLock(BBSLoc))
  {
    printf("Error! Can't locate BBS location %s\n",BBSLoc);
    end(0);
  }
  printf("\n");
  sprintf(t,"%sZoom",BBSLoc);
  if(!TLock(t))
  {
    printf("    Error! Can't locate %s\n",t);
    end(0);
  }
  sprintf(t,"%sScreens",BBSLoc);
  if(!TLock(t))
  {
    printf("    WARNING! Can't locate %s\n",t);
  }
  sprintf(t,"%sScreens/BullBatch",BBSLoc);
  if(!TLock(t))
  {
    printf("    WARNING! Can't locate %s\n",t);
  }
  sprintf(t,"%sCommands",BBSLoc);
  if(!TLock(t))
  {
    printf("    WARNING! Can't locate %s\n",t);
  }
  sprintf(t,"%sUser.Data",BBSLoc);
  if(!TLock(t))
  {
    printf("SERIOUS WARNING! can't locate %s\n",t);
  }
    sprintf(t,"%sUser.Keys",BBSLoc);
  if(!TLock(t))
  {
    printf("SERIOUS WARNING! can't locate %s\n",t);
  }
  
}
void Nodes(void)
{
  char t[200];
  register int i=0;
  printf("--> Scanning for node directories\n");
  while(i<nodes)
  {
    sprintf(t,"%sNode%d",BBSLoc,i);
    if(!TLock(t))
    {
      printf("    Error! Can't locate %s\n",t);
    }
    else
    {
      CheckNode(t);
    }
    i++;
  }
  printf("\n");
}
void CheckNode(char *str)
{
  char t[200];
  sprintf(t,"%s/Work",str);
  if(!TLock(t))
  {
    printf("Error! Can't locate %s\n",t);
    end(0);
  }
  sprintf(t,"%s/PlayPen",str);
  if(!TLock(t))
  {
    printf("Error! Can't locate %s\n",t);
    end(0);
  }
    sprintf(t,"%s/Screens",str);
  if(!TLock(t))
  {
    printf("WARNING! Can't locate %s\n",t);
  }
    sprintf(t,"%s/Screens/BullBatch",str);
  if(!TLock(t))
  {
    printf("WARNING! Can't locate %s\n",t);
  }
   sprintf(t,"%s/ComputerList",str);
  if(!TLock(t))
  {
    printf("Error! Can't locate %s\n",t);
    end(0);
  }

}
void Configs()
{
  register int i=0;
  printf("-> Searching for Config files\n");
  while(i<nodes)
  {
    sprintf(Temp,"%sconfig%d",BBSLoc,i);
    if(!TLock(Temp))
    {
      printf("   Can't locate %s\n",Temp);
      end(0);
    }
    else CheckConfig(Temp,i);
    i++;
  }
  printf("\n");
}

void CheckConfig(char *str,int node)
{
  FILE *fi;
  char Temp1[200];
  register int i=0;
  printf("--> Checking Config%d Conferences\n",node);
  fi=fopen(str,"rb");
  if(fi==NULL)
  {
    printf("    Can't open Config%d\n",node);
    end(0);
  }
  fread((APTR)&cmds,sizeof(struct Commands),1,fi);
  fclose(fi);
  strcpy(Temp1,cmds.BBSLoc);
  strupr(Temp1); sr(Temp1);
  if(strcmp(BBSLoc,Temp1))
  {
    printf("    Config%d has invalid BBS Location\n",node);
    end(0);
  }
  while(i<9)
  {
    if(cmds.ConfLoc[i][0]!='\0')
    {
    printf("    Checking Conference #%d - %s\n",i+1,cmds.ConfName[i]);
    if(!TLock(&cmds.ConfLoc[i]))
    {
      printf("    Error! Can't locate conference %d directory %s\n",i,cmds.ConfName[i]);
      end(0);
    }
    else
    {
       CheckNeeded(&cmds.ConfLoc[i]);
       if(Ndirs(&cmds.ConfLoc[i]))
       {CheckPaths(&cmds.ConfLoc[i]);
        CheckUlPaths(&cmds.ConfLoc[i]);}
    }
    }
    i++;
  }
}
int Ndirs(char *str)
{
  char t[200];
  FILE *fi;
  register int i;
  register int j;
  sprintf(t,"%sndirs",str);
  if(TLock(t))
  {
     fi=fopen(t,"r");
     fgets(t,80,fi);
     fclose(fi);
     i=atoi(t);
     j=1;
     while(j<=i)
     {
       sprintf(t,"%sdir%d",str,j);
       if(!TLock(t))
       {
          printf("    Error! Can't locate %s\n",t);
          end(0);
       }
       j++;
     }
     return(1);
   }
   return(0);
}
void CheckNeeded(char *str)
{
  char t[200];
  sprintf(t,"%sUpload",str);
  if(!TLock(t))
  {
    printf("    Error! Can't locate %s\n",t);
    end(0);
  }
  sprintf(t,"%smsgbase",str);
  if(!TLock(t))
  {
    printf("    Error! Can't locate %s\n",t);
    end(0);
  }
  sprintf(t,"%slcfiles",str);
  if(!TLock(t))
  {
    printf("    Error! Can't locate %s\n",t);
    end(0);
  }
  sprintf(t,"%sPartUpload",str);
  if(!TLock(t))
  {
    printf("    Error! Can't locate %s\n",t);
    end(0);
  }
}

void CheckPaths(char *str)
{
  char t[200];
  char Path[200];
  FILE *fi;
  sprintf(Path,"%spaths",str);
  if(!TLock(Path))
  {
    printf("    Error! Can't locate %s\n",Path);
    end(0);
  }
  fi=fopen(Path,"r");
  if(fi==NULL)
  {
    printf("    Error! Can't open file %s\n",Path);
    end(0);
  }
  while(fgets(t,80,fi)!=NULL)
  {
    sr(t);
    if(t[strlen(t)-1]!='/' && t[strlen(t)-1]!=':')
    {
      printf("    Error!, Directory paths in the paths file must end with a '/' or ':'\n");
      end(0);
    }
    if(strlen(t)>1 && t[strlen(t)-1]=='/')
    {
      t[strlen(t)-1]='\0';
    }
    
    if(!TLock(t))
    {
       printf("    Error! Can't locate Paths directory %s\n",t);
       fclose(fi);
       end(0);
    }
  }
  fclose(fi);
}
void CheckUlPaths(char *str)
{
  char t[200];
  char Path[200];
  FILE *fi;
  sprintf(Path,"%sulpaths",str);
  if(!TLock(Path))
  {
    return;
  }
  fi=fopen(Path,"r");
  if(fi==NULL)
  {
    printf("    Error! Can't open file %s\n",Path);
    end(0);
  }
  while(fgets(t,80,fi)!=NULL)
  {
    sr(t);
  if(t[strlen(t)-1]!='/' && t[strlen(t)-1]!=':')
    {
      printf("    Error!, Directory paths in the Ulpaths file must end with a '/' or ':'\n");
      end(0);
    }
 
    if(strlen(t)>1 && t[strlen(t)-1]=='/')
    {
      t[strlen(t)-1]='\0';
    }
    if(!TLock(t))
    {
       printf("    Error! Can't locate Paths directory %s\n",t);
       fclose(fi);
       end(0);
    }
  }
  fclose(fi);
}
void sr(char *str)
{
  register int i;
  i=strlen(str)-1;
  while(i>-1)
  {
    if(*(str+i)<=32) *(str+i)='\0'; else break;
    i--; 
  }
}

int TLock(char *str)
{
  long lock;
  if(lock=Lock(str,ACCESS_READ))
  {
    UnLock(lock); return(1);
  }
  return(0);
}