
//                            SKEL-BAL v1.0

//                         (BBS ADD/LIST DOOR)

//**********************
//*****  Includes  *****
//**********************

#include <proto/all.h>
#include <stdio.h>

#include <stdarg.h>
#include <string.h>
#include <tempest/headers.h>

//********************************
//*****  Structures/Defines  *****
//********************************

 struct MyMessage
  {
   struct Message Msg; // for Exec message routines
   ULONG  Command;     // Command to be executed.

   char   *text1,
          *text2,
          *text3;
   int    Value1,
          Value2;
   ULONG  LongValue;
   LONGBITS Flags;
   int    carrier;
   struct User       *User;
   struct SystemData *SystemData;
   struct NodeData   *NodeData;
   struct Today      *Today;
  };

struct BBSLIST
 {
  char Name[21],
       Number[21],
       Location[21],
       Sysop[21],
       Groups[21],
       Support[21],
       Nodes[3],
       Megs[5],
       Baud[6];
 };

struct BBSLIST BL;
struct User *User;
struct MsgPort *MyPort = NULL;
struct MyMessage *msg;
struct MyMessage send;

int  DoorStart(TEXT *);
int  DOORIO(VOID);
VOID CloseStuff(VOID);

VOID input(TEXT *,int);
VOID LineInput(TEXT *,TEXT *,int);
VOID pl(TEXT *,...);

char MyName[60],st[60];
char string1[255],string2[255];

//******************
//*****  Main  *****
//******************

VOID main(int argc,char *argv[])
{
 int Test = 1;
 if(!DoorStart(argv[1])) { PutStr("Tempest Door!\n"); exit(0); }
 while(Test)
  {
   pl("\f[33m[[0mDSKEL-BAL v3.15[33m] [36mBBS Add/List Door   By Michael Bockert [33m[[0m05-24-94[33m]\r\n");
   pl("[32m~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n");
   pl("[[33mA[32m] -- [36mAdd a number to database.\r\n");
   pl("[32m[[33mD[32m] -- [36mDelete a number from database.\r\n");
   pl("[32m[[33mE[32m] -- [36mEdit a number in database.\r\n");
   pl("[32m[[33mL[32m] -- [36mList Numbers in the database.\r\n");
   pl("[32m[[33mS[32m] -- [36mSearch for a number in database.\r\n");
   pl("[32m[[33mQ[32m] -- [31mQuit back to the BBS.\r\n\r\n");
   pl("[36mSelect [32m[[33mA,D,E,L,S,Q[32m] : [0m");
   input(string1,1);
   if((string1[0] == 'q') || (string1[0] == 'Q')) Test = 0;
   if((string1[0] == 'a') || (string1[0] == 'A')) New();
   if((string1[0] == 'l') || (string1[0] == 'L')) List();
   if((string1[0] == 'e') || (string1[0] == 'E')) Edit();
  }
 CloseStuff();
}

//*************************
//*****  List Entrys  *****
//*************************

List(VOID)
{
 int fd,stat,lines;
 lines=0;
 fd=Open("DOORS:DSKEL-BAL.Data",MODE_OLDFILE);
 if(fd==0) { pl("Error reading Doors:DSKEL-BAL.Data\n\r"); return(0); }

 pl("\f");
 ReadRecord:
 stat=Read(fd,(char *)&BL,sizeof(struct BBSLIST));
 if(stat<=0)
  {
   pl("[36mHit any key:");
   hotkey(string1);
   Close(fd);
   return(0);
  }
 pl("   [34m[[33mName[34m] [0m%-20s      [34m[ [0m%s [33mNodes[34m]      [[33mSysop[34m] [0m%-20s\r\n",
     BL.Name,BL.Nodes,BL.Sysop);
 pl("  [34m[[33mPhone[34m] [0m%-20s     [34m[[0m%4s [33mMegs[34m]     [[33mGroups[34m] [0m%-20s\r\n",
     BL.Number,BL.Megs,BL.Groups);
 pl("[34m[[33mLocated[34m] [0m%-20s    [34m[[0m%5s [33mBaud[34m]    [[33mSupport[34m] [0m%-20s\r\n\r\n",
                    BL.Location,BL.Baud,BL.Support);
 lines+=4;
 if(lines+4>User->Length)
  {
   pl("[36mHit any key:");
   hotkey(string1);
   lines=0;
   pl("\r\n\r\n");
  }
 goto ReadRecord;
}

//***************************
//*****  Add New Entry  *****
//***************************

New(VOID)
{
 int fd;
 pl("\f                    [34m[--------------------][0m\r\n");
 pl("           BBS Name: ");
 input(BL.Name,20);
 pl("\r\n                    [34m[--------------------][0m\r\n");
 pl("       Phone Number: ");
 input(BL.Number,20);
 pl("\r\n                    [34m[--------------------][0m\r\n");
 pl("             Groups: ");
 input(BL.Groups,20);
 pl("\r\n                    [34m[--------------------][0m\r\n");
 pl("           Location: ");
 input(BL.Location,20);
 pl("\r\n                    [34m[--------------------][0m\r\n");
 pl("              Sysop: ");
 input(BL.Sysop,20);
 pl("\r\n                    [34m[--------------------][0m\r\n");
 pl("  Formats Supported: ");
 input(BL.Support,20);
 pl("\r\n                    [34m[-][0m\r\n");
 pl("            # Nodes: ");
 input(BL.Nodes,1);
 pl("\r\n                    [34m[----][0m\r\n");
 pl("    Megs of Storage: ");
 input(BL.Megs,4);
 pl("\r\n                    [34m[-----][0m\r\n");
 pl("      Max Buad Rate: ");
 input(BL.Baud,5);
 pl("\r\n[36mSave to database [34m[[33my/n[34m] [0m");
 input(string1,1);
 if((string1[0] =='n') || (string1[0] == 'N')) return(0);

//***********************************
//*****  Write DSKEL-BAL.Data  ******
//***********************************

 fd=Open("DOORS:DSKEL-BAL.Data",MODE_OLDFILE);
 if(fd==0)
  {
   fd=Open("DOORS:DSKEL-BAL.Data",MODE_NEWFILE);
   if(fd==0)
    {
     pl("Error writing Doors:DSKEL-BAL.Data!\r\n");
     CloseStuff();
   }
  }
 else
   Seek(fd,0,OFFSET_END);
 Write(fd,(char *)&BL ,sizeof(struct BBSLIST));
 Close(fd);
 return(0);
}

//*************************
//*****  Edit Entrys  *****
//*************************

Edit(VOID)
{
 char string[255];
 int fd,Slot;
 long Position;
 pl("Edit which Entry?: ");
 input(string,3);
 Slot = atoi(string);
 fd=Open("DOORS:DSKEL-BAL.Data",MODE_OLDFILE);
 if(fd==0)
  {
   pl("Error reading Doors:DSKEL-BAL.Data\n\r"); return(0);
  }
 Slot--;
 Position = Slot * sizeof(struct BBSLIST);
 Seek(fd,Position,0);
 Read(fd,(char *)&BL,sizeof(struct BBSLIST));
 Close(fd);
 pl("\f                    [34m[--------------------][0m\r\n");
 pl("           BBS Name: ");
 LineInput(BL.Name,string,20);
 strcpy(BL.Name,string);
 pl("\r\n                    [34m[--------------------][0m\r\n");
 pl("       Phone Number: ");
 LineInput(BL.Number,string,20);
 strcpy(BL.Number,string);
 pl("\r\n                    [34m[--------------------][0m\r\n");
 pl("             Groups: ");
 LineInput(BL.Groups,string,20);
 strcpy(BL.Groups,string);
 pl("\r\n                    [34m[--------------------][0m\r\n");
 pl("           Location: ");
 LineInput(BL.Location,string,20);
 strcpy(BL.Location,string);
 pl("\r\n                    [34m[--------------------][0m\r\n");
 pl("              Sysop: ");
 LineInput(BL.Sysop,string,20);
 strcpy(BL.Sysop,string);
 pl("\r\n                    [34m[--------------------][0m\r\n");
 pl("  Formats Supported: ");
 LineInput(BL.Support,string,20);
 strcpy(BL.Support,string);
 pl("\r\n                    [34m[-][0m\r\n");
 pl("            # Nodes: ");
 LineInput(BL.Nodes,string,1);
 strcpy(BL.Nodes,string);
 pl("\r\n                    [34m[----][0m\r\n");
 pl("    Megs of Storage: ");
 LineInput(BL.Megs,string,4);
 strcpy(BL.Megs,string);
 pl("\r\n                    [34m[-----][0m\r\n");
 pl("      Max Buad Rate: ");
 LineInput(BL.Baud,string,5);
 strcpy(BL.Baud,string);
 pl("\r\n[36mSave changes to database [34m[[33my/n[34m] [0m");
 input(string1,1);
 if((string1[0] =='n') || (string1[0] == 'N')) return(0);

//***********************************
//*****  Write DSKEL-BAL.Data  ******
//***********************************

 fd=Open("DOORS:DSKEL-BAL.Data",MODE_OLDFILE);
 if(fd==0)
    pl("Error writing Doors:DSKEL-BAL.Data!\r\n");
 else
 Seek(fd,Position,0);
 Write(fd,(char *)&BL ,sizeof(struct BBSLIST));
 Close(fd);
 return(0);
}









//************************
//*****  Door Start  ***** // MUST BE INCLUDED IN ALL DOORS!
//************************

int DoorStart(TEXT *node)
{
 struct MsgPort *HisPort;
 send.carrier=0;
 sprintf(st,"%s:TEMPEST_DOOR",node);
 HisPort = FindPort(st);
 if(HisPort==NULL) return (FALSE);
 sprintf(MyName,"%s:DOOR_PORT",node);
 MyPort = CreatePort(MyName,0L);
 if(MyPort==NULL)
  {
   PutStr("Cant open port");
   return(int)FALSE;
  }
 DOORIO();
 User=*&send.User;
 return (int)TRUE;
}

//********************
//*****  DoorIO  ***** // MUST BE INCLUDED IN ALL DOORS!
//********************

int DOORIO(VOID)
{
 struct MsgPort *HisPort;
 if(send.carrier) return(0);
 HisPort = FindPort(st);
 if(HisPort!=NULL)
  {
   send.Msg.mn_Node.ln_Type = NT_MESSAGE;
   send.Msg.mn_Length = sizeof(send);
   send.Msg.mn_ReplyPort = MyPort;
   send.carrier=0;
   PutMsg((struct MsgPort *)HisPort,(struct Message *)&send);
   Wait(1 << MyPort->mp_SigBit);
   GetMsg(MyPort);
   if(send.carrier) CloseStuff();
   return(1);
  }
 return(0);
}

//*************************
//*****  Close Stuff  ***** // MUST BE INCLUDED IN ALL DOORS!
//*************************

VOID CloseStuff(VOID)
{
 send.Command=999;
 DOORIO();
 while(msg=(struct MyMessage *)GetMsg(MyPort)) ReplyMsg((struct Message *)msg);
 if(MyPort) DeletePort(MyPort);
 exit(0);
}

//*********************
//*****  Hot Key  ***** // Command 16
//*********************

int hotkey(TEXT *character)
{
 send.Command=16;
 send.text1=character;
 DOORIO();
 return((int)character[0]);
}

//*******************
//*****  Input  ***** // Command 20
//*******************

VOID input(TEXT *mstring,int len)
{
 send.Command=20;
 send.Value1=len;
 send.text1 =mstring;
 DOORIO();
}

//************************
//*****  Line Input  ***** // Command 22
//************************

VOID LineInput(TEXT *ostring,TEXT *mstring,int len)
{
 send.Command=22;
 send.Value1=len;
 send.text1=mstring;
 send.text2=ostring;
 DOORIO();
}

//*****************************
//*****  PL (Print Line)  ***** // Command 1 with a twist
//*****************************

VOID pl(TEXT *fmt,...)
{
 va_list args;
 char s[255];
 va_start(args,fmt);
 vsprintf(s,fmt,args);
 va_end(args);
 send.Command=1;
 send.text1=&s[0];
 DOORIO();
}
