/********************************************************************
 ** 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
 **
 ** "FREELOCK" file support
 **
 ** TABS to 4
 ********************************************************************/

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

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


struct FreeLockDosMsg {
	struct DosMsg	dm;
	struct NFSStdReturn freelockret;				/* net-send this back */
	struct PktMsgRecv	*pmr;
	struct InternalLock *il;
};
#define FREELOCKMSG_SIZE sizeof(struct FreeLockDosMsg)


/********************************************************************/
	static void free_retret_freelock(struct PktMsgRecv *pmr)
/********************************************************************/
{
struct FreeLockDosMsg	*fldm = (void *)pmr->user.user2;
struct InternalLock		*il = fldm->il;

#ifdef DEBUG
	fpf(out, "nfs_freelock: Freeing memory\n");
#endif

	REMOVE_FROM_LIST(il, il_first);
	FreeMem(il, IL_SIZE);
	FreeMem(fldm, FREELOCKMSG_SIZE);			/* dos msg */
	FREE_PKTMSGRECV(pmr);						/* server msg */
}


/********************************************************************/
	static void handle_freelock(struct FreeLockDosMsg *fldm)
/********************************************************************/
{
struct PktMsgRecv *pmr = fldm->pmr;

	fldm->freelockret.remote_res1 = fldm->dm.sp.sp_Pkt.dp_Res1;
	fldm->freelockret.remote_res2 = fldm->dm.sp.sp_Pkt.dp_Res2;
	PUT_STDMSG(&pmr->pm.smsg, pmr->dmaport, TYPE_INTERNAL_SEND);

#ifdef DEBUG
	fpf(out, "nfs_freelock: return going home\n");
#endif
}


/********************************************************************/
	void *srv_freelock(struct PktMsgRecv *pmr)
/********************************************************************/
{
struct NFSFreeLock		*req = (void *)pmr->req_body;
struct InternalLock		*il = GET_INTERNALLOCK(req->remote_il, req->remote_majic);
struct FreeLockDosMsg	*fldm;

	if(!il) return(&nfs_res_ok);				/* filehandle doesn't exist! */
	ACT_ALLOCMSG_THINGY(fldm, FREELOCKMSG_SIZE);	/* get dosmsgpkt+return memory */


#ifdef DEBUG
	fpf(out, "nfs_freelock: lock=%lx, port=%lx\n", il, il->reallock->fl_Task);
#endif

	fldm->pmr = pmr;
	fldm->il = il;
	ACT_INIT_RETURN_PMR(pmr, free_retret_freelock, fldm, &fldm->freelockret, req);
	INIT_DOS_MSG(&fldm->dm, dosport, handle_freelock);
	fldm->dm.sp.sp_Pkt.dp_Type = ACTION_FREE_LOCK;
	fldm->dm.sp.sp_Pkt.dp_Arg1 = CTOB(il->reallock);
	PutMsg(il->reallock->fl_Task, fldm);
	return(NULL);
}
