//                           SKEL-FAKE v1.0

//                           (FAKE REPORTER)

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

#include <proto/all.h>
#include <stdio.h>
#include <stdlib.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 MyMessage send;

struct User *User;
struct SystemData *SystemData;
struct NodeData *NodeData;
struct Today *Today;

struct MsgPort *MyPort = NULL;
struct MyMessage *msg;

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

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

struct MsgPort *TempestPort;

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

int main(int argc,char *argv[])
{
 char string1[255],string2[255];
 register int fd;
 if(!DoorStart(argv[1])) { PutStr("TempesT Door\n"); exit(0); }
 pl("\f[44;37mDSKEL-FR v3.50 (Fake Reporter)[0m\r\n\r\n");

 CONTINUE:

 pl("[35m[[0mQ = Quit[35m] [36mEnter Filename of Fake[0m: ");
 input(string1,30);
 if(string1[0] == ' ')
    CloseStuff();
 if(string1[1] == NULL)
    if((string1[0] == 'q') || (string1[0] == 'Q'))
        CloseStuff();
 strcpy(string2,"FAKES:");
 strcat(string2,string1);
 fd=Open(string2,MODE_NEWFILE);
 Close(fd);
 goto CONTINUE;
}



//************************
//*****  Door Start  ***** // MUST BE INCLUDED IN ALL DOORS!
//************************
int DoorStart(TEXT *node)
{
 char string[60];
 send.carrier=0;
 sprintf(string,"%s:TEMPEST_DOOR",node);
 TempestPort=FindPort(string);
 if(TempestPort==NULL) return(int)FALSE;
 MyPort=CreateMsgPort();
 if(MyPort==NULL) return(int)FALSE;
 DOORIO(0);
 User=*&send.User;
 SystemData=*&send.SystemData;
 NodeData=*&send.NodeData;
 Today=*&send.Today;
 return(int)TRUE;
}
//********************
//*****  DoorIO  ***** // MUST BE INCLUDED IN ALL DOORS!
//********************
int DOORIO(WORD Command)
{
 if(send.carrier) return(0);
 send.Command=Command;
 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 *)TempestPort,(struct Message *)&send);
 Wait(1 << MyPort->mp_SigBit);
 GetMsg(MyPort);
 if((send.carrier)&&(send.Command!=999)) CloseStuff();
 return(1);
}
//*************************
//*****  Close Stuff  ***** // MUST BE INCLUDED IN ALL DOORS!
//*************************
VOID CloseStuff(VOID)
{
 DOORIO(999);
 while(msg=(struct MyMessage *)GetMsg(MyPort)) ReplyMsg((struct Message *)msg);
 if(MyPort) DeleteMsgPort(MyPort);
 exit(0);
}
//*******************
//*****  Input  ***** // Command 20
//*******************
VOID input(TEXT *mstring,int len)
{
 send.Value1=len;
 send.text1 =mstring;
 DOORIO(20);
}
//*****************************
//*****  PL (Print Line)  ***** // Command 1
//*****************************
VOID pl(TEXT *string)
{
 send.text1=string;
 DOORIO(1);
}
