gregg@cbnewsc.att.com (gregg.g.wonderly) (11/04/90)
I am trying to put together some code that will send ACTION_READ packets to a handler after opening a file with Open(). I need to double buffer these reads with other I/O. Does anybody have some pointers? Below is the test program that I have been using. The assignment of packet->dp_Arg1 = handle->fh_Args came from looking at the MSH handler. I do not know what is really required here. If I put something like handle, or CTOB(handle) in there it GURUs. With this value in there The PutMsg() succeeds, but there is no response via Wait(). I do not have the AmigaDos tech manual, and the autodocs and ROMKERNEL of course do not contain any real DOS.LIBRARY information, so I am at a loss as to exactly what is required. The headers and such give hints, but evidently there is some information missing. Thanks for any information you can provide. ------------------------------- Test Program ------------------------------- #include <stdio.h> #include <exec/types.h> #include <libraries/dos.h> #include <libraries/dosextens.h> #include <exec/memory.h> typedef struct FileHandle HANDLE; typedef struct DosPacket PACKET; #define BTOC(x) (void *)((long)(x) << 2) #define CTOB(x) (void *)((long)(x) >> 2) main( argc, argv ) int argc; char **argv; { long n, fh; int sig; HANDLE *handle; PACKET *packet; struct MsgPort *msgpt; struct Message *msg, *tmsg; char buf[1024]; if( (fh = Open( argv[1], MODE_OLDFILE )) == NULL ) { fprintf( stderr, "Can not open %s\n", argv[1]); exit( 1 ); } /* Read something and write it out. */ n = Read( fh, buf, 1024 ); Write( Output(), buf, n ); /* Get real pointer to DosFileHandle */ handle = BTOC(fh); /* Get the msgport to send to. */ msgpt = (struct MsgPort *) handle->fh_Type; /* Allocate a dos packet. */ if(( packet = (PACKET *)AllocMem( sizeof( PACKET ), MEMF_PUBLIC | MEMF_CLEAR ) ) == NULL ) { fprintf( stderr, "alloc failed\n"); Close( fh ); exit( 1 ); } /* Put together the packet. */ packet->dp_Action = ACTION_READ; /* Is this what is really required? */ packet->dp_Arg1 = (LONG) handle->fh_Args; packet->dp_Arg2 = (LONG) buf; packet->dp_Arg3 = (LONG) sizeof(buf); /* Get a port */ if( (packet->dp_Port = (struct MsgPort *) CreatePort( 0L, 0 )) == NULL) { fprintf( stderr, "can get port\n"); Close( fh ); FreeMem( packet, sizeof( PACKET ) ); exit( 1 ); } /* Allocate a message to send. */ if ((packet->dp_Link = (struct Message *) AllocMem( sizeof( struct Message ), MEMF_PUBLIC | MEMF_CLEAR ) ) == NULL ) { fprintf( stderr, "alloc failed\n"); Close( fh ); FreeMem( packet, sizeof( PACKET ) ); exit( 1 ); } /* Fill in the message */ tmsg = packet->dp_Link; tmsg->mn_Node.ln_Name = (char *) packet; /* MSH looks here */ tmsg->mn_Node.ln_Succ = NULL; tmsg->mn_Node.ln_Pred = NULL; tmsg->mn_ReplyPort = packet->dp_Port; /* Required? */ tmsg->mn_Length = sizeof( *packet ); /* Correct Length? */ /* Send the message */ if( (long)msgpt < 0) PutMsg( -(long)msgpt, tmsg ); else PutMsg( msgpt, tmsg ); /* Wait for the return */ sig = Wait( (1 << packet->dp_Port->mp_SigBit) | SIGBREAKF_CTRL_C ); if( sig & (1<<packet->dp_Port->mp_SigBit) ) { msg = (struct Message *)GetMsg( packet->dp_Port ); printf( "%d bytes read\n", packet->dp_Res1 ); Write( Output(), buf, packet->dp_Res1 ); } else { printf( "\n***BREAK***\n"); } /* Clean up */ DeletePort( packet->dp_Port ); FreeMem( tmsg, sizeof( struct Message ) ); FreeMem( packet, sizeof( PACKET ) ); Close( fh ); exit(0); } -- ----- gregg.g.wonderly@att.com (AT&T bell laboratories)