home *** CD-ROM | disk | FTP | other *** search
- /* 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>
-
- #ifdef MANX
- #include "functions.h" /* aztec C include */
- #endif
-
- #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);
-
- }
-
-
-
-