#include "AK.h"

/* from ConPackets.c -  C. Scheppner, A. Finkel, P. Lindsay  CBM
   inits global vars AK_window and AK_conUnit */
LONG findWindow(void) 
{
  struct InfoData *id;
  struct MsgPort  *conid;
  struct Process  *me;
  LONG myargs[8] ,nargs, res1;
  
  /* Alloc to insure longword alignment */
  id = (struct InfoData *)AllocMem(sizeof(struct InfoData),
				   MEMF_PUBLIC|MEMF_CLEAR);
  if(! id) return(0);
  me = (struct Process *) FindTask(NULL);
  conid = (struct MsgPort *) me->pr_ConsoleTask;
  
  myargs[0]=((ULONG)id) >> 2;
  nargs = 1;
  res1 = (LONG)sendpkt(conid,ACTION_DISK_INFO,myargs,nargs);
  AK_window = (struct Window *)id->id_VolumeNode;
  AK_conUnit = (struct ConUnit *)
    ((struct IOStdReq *)id->id_InUse)->io_Unit;
  FreeMem(id,sizeof(struct InfoData));
  return(res1);
}


LONG sendpkt(pid,action,args,nargs)
     struct MsgPort *pid;  /* process indentifier (handlers message port ) */
     LONG action,       /* packet type (what you want handler to do )   */
       args[],          /* a pointer to a argument list */
       nargs;           /* number of arguments in list  */
{
  struct MsgPort        *replyport;
  struct StandardPacket *packet;
  
  LONG  count, *pargs, res1;
  
  replyport = (struct MsgPort *) CreatePort(NULL,0);
  if(!replyport) return(NULL);
  
  packet = (struct StandardPacket *) 
    AllocMem((long)sizeof(struct StandardPacket),MEMF_PUBLIC|MEMF_CLEAR);
  if(!packet) 
    {
      DeletePort(replyport);
      return(NULL);
    }
  
  packet->sp_Msg.mn_Node.ln_Name = (char *)&(packet->sp_Pkt);
  packet->sp_Pkt.dp_Link         = &(packet->sp_Msg);
  packet->sp_Pkt.dp_Port         = replyport;
  packet->sp_Pkt.dp_Type         = action;
  
  /* copy the args into the packet */
  pargs = &(packet->sp_Pkt.dp_Arg1);       /* address of first argument */
  for(count=0;count < nargs;count++) 
    pargs[count]=args[count];
  
  PutMsg(pid, (struct Message *) packet); /* send packet */
  
  WaitPort(replyport);
  GetMsg(replyport); 
  
  res1 = packet->sp_Pkt.dp_Res1;
  
  FreeMem(packet,(long)sizeof(struct StandardPacket));
  DeletePort(replyport); 
  
  return(res1);
}

