/********************************************************************
 ** 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
 **
 ** LOCATE OBJECT
 **
 ** as usual, compile with struct equivalence
 **
 ** TABS to 4
 ********************************************************************/

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


#define FREELOCK_PKTMSG_SIZE sizeof(struct FreeLockPktMsg)
/** this is just a variation of the "doofus" format */
struct FreeLockPktMsg {
	struct	DoofusPktMsg	dpm;

	struct	NFSFreeLock			freelockreq;	/* request structure */
	struct	NFSStdReturn		freelockret;	/* return structure */
	struct	LockKey				*lk;
};




/********************************************************************/
static long handle_freelock_net(struct FreeLockPktMsg *flpm)
/********************************************************************/
{
struct	LockKey		*lk = flpm->lk;

	REMOVE_FROM_LIST(lk, first_lk);
	FreeRemember(&lk->mem, TRUE);				/* appendages */
	FreeMem(lk, LK_SIZE);						/* lock key struct */
	return(AR_FLAG_RETURNDOSMSG | AR_FLAG_FREEDOOF);
}






/********************************************************************/
long action_free_lock(struct DosPacket *dosmsg,
										struct MsgPort *dm_retport)
/********************************************************************/
{	/* FreeLock : ok */
struct	OurLock		*fl = BTOC(dosmsg->dp_Arg1);
struct	LockKey		*lk;
struct	FreeLockPktMsg *flpm = NULL;


/** REMOVE THE LOCK KEY ?? */
	if(! (lk = fl->lk))
		return(AR_FLAG_RETURNDOSMSG);

	if(lk->Type == LK_REMOTE) {
		if(!(flpm = AllocMem(FREELOCK_PKTMSG_SIZE, MEMF_PUBLIC))) {
			dosmsg->dp_Res1 = 0; dosmsg->dp_Res2 = ERROR_NO_FREE_STORE;
			return(AR_FLAG_RETURNDOSMSG);
		}
		flpm->freelockreq.request		= REQUEST_FREELOCK;
		flpm->freelockreq.remote_majic	= lk->remote.majic;
		flpm->freelockreq.remote_il		= lk->remote.remote_il;
		flpm->lk = lk;
		INIT_DOOFPKTMSG(&flpm->dpm,
				handle_freelock_net,						/* our routine to call */
				netrepport,									/* net reply port */
				dosmsg, dm_retport,							/* dos msg & reply port */
				FREELOCK_PKTMSG_SIZE,						/* saved stuff */
				lk->remote.machine, lk->remote.service,		/* FileArg1 */
				&flpm->freelockreq, sizeof(struct NFSFreeLock),/* net-service-request */
				NULL, 0,									/* send-body */
				NULL, 0,									/* result-body */
				&flpm->freelockret, sizeof(struct NFSStdReturn));
															/* return stuff */
		PutMsg(NET_SERV_PORT(lk), flpm);
		return(0);
	}

/** OTHERWISE A LOCAL LOCK */
	REMOVE_FROM_LIST(lk, first_lk);
	FreeRemember(&lk->mem, TRUE);					/* appendages */
	FreeMem(lk, LK_SIZE);							/* lock key struct */
{ char tt[40]; spf(tt, 40, "freelock: lkey=%lx/%ld", lk, LK_SIZE); MyPrint(win1, tt); }

	return(AR_FLAG_RETURNDOSMSG);
}
