[net.micro.amiga] SendPacket routine...

phillip@cbmvax.cbm.UUCP (Phillip Lindsay) (09/02/86)

[eat me I'm yours]

Here is a general purpose subroutine to send AmigaDos packets...It works
well with Aztec 16or32...Have not tried it under Lattice.
==============================================================================
  Phillip Lindsay - Commodore Business Machines - Amiga Technical Support
    uucp: {ihnp4|seismo|caip}!cbmvax!phillip
    arpa: cbmvax!phillip@seismo -or- phillip@cbmvax.UUCP@{seismo | harvard}
    Tel.: (215) 431-9180
==============================================================================

***CUT HERE 
/* sendpacket.c -                       send packet to dos handler            */
/*                                      Phillip Lindsay - Commodore-Amiga     */

#include "exec/types.h"
#include "exec/ports.h"
#include "exec/io.h"
#include "exec/memory.h"
#include "libraries/dos.h"
#include "libraries/dosextens.h"
#include <stdio.h>

#include "functions.h"           /* aztec C include */

#define ACTION_SCREEN_MODE 994L  /* The packet type we will be playing with */
#define DOSTRUE 	    -1L  /* AmigaDos TRUE */
#define MAXARGS              7L  /* limit in packet structure (dosextens.h) */

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; 

 if(nargs > MAXARGS) exit(FALSE); 
 
 replyport = (struct MsgPort *) CreatePort(NULL,NULL); /* make reply port */
 if(!replyport) return(NULL);

 packet = (struct StandardPacket *) 
   AllocMem((long)sizeof(*packet),MEMF_PUBLIC | MEMF_CLEAR);
 if(!packet) 
   {
    FreeMem(packet,(long)sizeof(*packet));
    return(NULL);
   }

 packet->sp_Msg.mn_Node.ln_Name = (char *) &(packet->sp_Pkt); /* link packet- */
 packet->sp_Pkt.dp_Link         = &(packet->sp_Msg);        /* to message    */
 packet->sp_Pkt.dp_Port         = replyport;         /* set-up reply port   */
 packet->sp_Pkt.dp_Type         = action;           /* what to do... */

 /* move all the arguments to the packet */
 pargs = &(packet->sp_Pkt.dp_Arg1);        /* address of first argument */
 for(count=NULL;count < nargs;count++) 
   pargs[count]=args[count];

 PutMsg(pid,packet); /* send packet */

#ifdef DEBUG
  kprintf("Waiting for packet...\n"); 
#endif

 WaitPort(replyport); /* wait for packet to come back */
 GetMsg(replyport);   /* pull message */

 res1 = packet->sp_Pkt.dp_Res1; /* get result */

/* all done clean up */
 FreeMem(packet,(long)sizeof(*packet)); 
 DeletePort(replyport); 

 return(res1);   
  
}

/* end of sendpkt.c */


/* start of example */

#define NARGS	1L                      /* number of arguments */
#define ESC    27L

main()
{

 struct MsgPort *conid;         /* for process id     */
 long arg[NARGS]                /* array of arguments */
      ,res1;                    /* holds result       */ 
 struct Process *myprocess;     /* me!                */
 UBYTE a_char;                  /* our input          */

 myprocess = (struct Process *) FindTask(NULL);     

 conid = (struct MsgPort *) myprocess->pr_ConsoleTask; /* get console handler */

 arg[0]=DOSTRUE;         /* arg1=TRUE - set RAW mode */      
 res1 = sendpkt(conid,ACTION_SCREEN_MODE,arg,NARGS);

 if(!res1) exit(TRUE);  /* error? */

 puts("In RAW: mode...type something...press ESC to exit.");
 while((a_char=getchar()) != ESC) putchar(a_char);

 arg[0]=FALSE; /* turn RAW mode off */
 res1 = sendpkt(conid,ACTION_SCREEN_MODE,arg,NARGS);
 
}

/* eof */
-- 
==============================================================================
  Phillip Lindsay - Commodore Business Machines - Amiga Technical Support
    uucp: {ihnp4|seismo|caip}!cbmvax!phillip
    arpa: cbmvax!phillip@seismo -or- phillip@cbmvax.UUCP@{seismo | harvard}
    Tel.: (215) 431-9180
==============================================================================