/********************************************************************
 ** NETWORK FILE SYSTEM SERVICE
 **
 ** (c) Spak, Darrell Tam, c9107253@ee.newcastle.edu.au (1994)
 ** phone (Australia) 049-829-710
 **                    49-829-710
 ** (c) SST Jan-Feb-Mar 1994
 **
 ** "SEEK" file support
 **
 ** TABS to 4
 ********************************************************************/

#include "/snd/everything.h"
#include <st/st_proto.h>

#include "nfsinternal.h"
#include "nfsglobs_protos.h"


#define IFH_SEEKMSG_SIZE (sizeof(struct IFHSeekMsg))
struct IFHSeekMsg {
	struct IFHDosMsg	dm;
	struct NFSStdReturn seekret;
};

/********************************************************************/
	static void free_retret_seek(struct PktMsgRecv *pmr)
/********************************************************************/
{
#ifdef DEBUG
	fpf(out, "nfs_seek: Freeing memory\n");
#endif

	FreeMem((void *)pmr->user.user2, IFH_SEEKMSG_SIZE);
	FREE_PKTMSGRECV(pmr);			/* 	everything the server sent */
}


/********************************************************************/
	static void handle_seek_dos(struct IFHSeekMsg *ifhsm)
/********************************************************************/
{
struct PktMsgRecv *pmr = ifhsm->dm.pktmsg;
#ifdef DEBUG
	fpf(out, "nfs_seek: result going home\n");
#endif

	ifhsm->seekret.remote_res1 = IFHMSG_RES1(&ifhsm->dm);
	ifhsm->seekret.remote_res2 = IFHMSG_RES2(&ifhsm->dm);
	PUT_STDMSG(&pmr->pm.smsg, pmr->dmaport, TYPE_INTERNAL_SEND);
}


/********************************************************************/
	void *srv_seek(struct PktMsgRecv *pmr)
/********************************************************************/
{
struct NFSSeek		*req = (void *)pmr->req_body;
struct InternalFH	*ifh = GET_INTERNALFH(req->remote_ifh, req->remote_majic);
struct IFHSeekMsg	*ifhsm;

	if(!ifh) return(&nfs_res_notfound);				/* filehandle doesn't exist! */
	ACT_ALLOCMSG_THINGY(ifhsm, IFH_SEEKMSG_SIZE);	/* get dosmsgpkt+return memory */

#ifdef DEBUG
	fpf(out, "nfs_seek: pos=%ld, mode=%ld\n", 
							req->position, req->mode);
#endif

	ACT_INIT_RETURN_PMR(pmr, free_retret_seek, ifhsm, &ifhsm->seekret, req);

	INIT_ARGS_IFHDOSMSG(&ifhsm->dm,
			ACTION_SEEK, ifh->realfh.fh_Arg1, req->position, req->mode);

	ACT_PUT_IFHDOSMSG(ifhsm, dosport, handle_seek_dos, ifh, pmr);
	return(NULL);
}
