/********************************************************************
 ** NETWORK FILESYSTEM - DOS HANDLER
 **
 ** (c) Spak, Darrell Tam, c9107253@ee.newcastle.edu.au (1994)
 ** phone (Australia) 049-829-710
 **                    49-829-710
 ** (c) SST 1994
 **
 ** NET-READ 
 **
 ** TABS to 4
 ********************************************************************/

#include "/snd/everything.h"
#include "deadheads.h"
#include "root_protos.h"
#include "globs_protos.h"
#include "xtra_protos.h"

/** another variation for reading */
#define READ_PKTMSG_SIZE (sizeof(struct ReadPktMsg))
struct ReadPktMsg {
	struct DoofusPktMsg	dpm;

	struct	NFSRead				readreq;	/* request packet struct */
	struct	NFSStdReturn		readret;	/* what the server sends back */
	struct	FileArg1			*fa1;
};


/********************************************************************/
static long handle_read_net(struct ReadPktMsg *rpm)
/********************************************************************/
{
struct DosPacket *dosmsg = rpm->dpm.dp_original;
	dosmsg->dp_Res1 = rpm->readret.remote_res1;
	dosmsg->dp_Res2 = rpm->readret.remote_res2;
	if(rpm->dpm.net.pm.smsg.result != PAR_OK)
		{ dosmsg->dp_Res1 = 0; dosmsg->dp_Res2 = ABORT_BUSY; }

	return(AR_FLAG_RETURNDOSMSG | AR_FLAG_FREEDOOF);
}


/********************************************************************/
   long action_read(struct DosPacket *dosmsg,
							struct MsgPort *dm_retport)
/********************************************************************/
{ /* arg1, buffer, length : actual length */
struct FileArg1 *fa1 = (void *)dosmsg->dp_Arg1;
struct ReadPktMsg *rpm;

{ char tt[100]; spf(tt, 100, "read: mem=%lx, len=%ld", (void *)dosmsg->dp_Arg2, dosmsg->dp_Arg3); MyPrint(win1, tt); }

/** CHECK THIS FILE ARG1 */
	if(!fa1) {
		dosmsg->dp_Res1 = 0; dosmsg->dp_Res2 = ERROR_ACTION_NOT_KNOWN;
		return(AR_FLAG_RETURNDOSMSG);
	}
/** SEND OFF TO THE REMOTE MACHINE */
	if(!(rpm = AllocMem(READ_PKTMSG_SIZE, MEMF_PUBLIC))) {
		dosmsg->dp_Res1 = 0; dosmsg->dp_Res2 = ERROR_NO_FREE_STORE;
		return(AR_FLAG_RETURNDOSMSG);
	}
	rpm->readreq.request 	= REQUEST_READ;
	rpm->readreq.remote_ifh = fa1->remote.remote_ifh;
	rpm->readreq.remote_majic = fa1->remote.majic;
	rpm->fa1 = fa1;
	INIT_DOOFPKTMSG(&rpm->dpm,
				handle_read_net,							/* our routine to call */
				netrepport,
				dosmsg, dm_retport,							/* original stuff */
				READ_PKTMSG_SIZE,
				fa1->remote.machine, fa1->remote.service,
				&rpm->readreq, sizeof(struct NFSRead),		/* net-service-request */
				NULL, 0,									/* send-body */
				(void *)dosmsg->dp_Arg2, dosmsg->dp_Arg3,	/* result-body */
				&rpm->readret, sizeof(struct NFSStdReturn));
															/* return stuff */

	PutMsg(NET_SERV_PORT(fa1), rpm);
	return(0);
}
