/************************************************************
* MultiUser - MultiUser Task/File Support System				*
* ---------------------------------------------------------	*
* Protection Bits Management											*
* ---------------------------------------------------------	*
* © Copyright 1993-1994 Geert Uytterhoeven						*
* All Rights Reserved.													*
************************************************************/


#include <exec/execbase.h>
#include <proto/exec.h>
#include <proto/dos.h>

#include "Protection.h"
#include "Misc.h"
#include "Task.h"
#include "Config.h"
#include "Locale.h"
#include "LibHeader.h"


	/*
	 *		Set the Default Protection Bits
	 *
	 *		Public Library Function
	 */

BOOL __asm __saveds muSetDefProtectionA(register __a0 struct TagItem *taglist)
{
	struct muTags tags;

	if (!InterpreteTagList(taglist, &tags))
		return(FALSE);
	if (tags.Global)
		return(SetLevelDefProtect(tags.Task, tags.DefProtection));
	else
		return(SetTaskDefProtect(tags.Task, tags.DefProtection));
}


	/*
	 *		Get the Default Protection Bits
	 *
	 *		Public Library Function
	 */

ULONG __asm __saveds muGetDefProtection(register __d0 struct Task *task)
{
	if (!task)
		task = SysBase->ThisTask;
	return(GetTaskDefProtect(task));
}


	/*
	 *		Set the protection bits for a file or directory
	 *
	 *		Public Library Function
	 */

BOOL __asm __saveds muSetProtection(register __d1 STRPTR name,
												register __d2 LONG mask,
												register __a6 struct muBase *muBase)
{
	return(muBase->OLDSetProtection(name, mask, DOSBase));
}


	/*
	 *		Disallow setting the full protection bits
	 *
	 *		Public Library Function
	 */

BOOL __asm muLimitDOSSetProtection(register __d0 BOOL flag,
											  register __a6 struct muBase *muBase)
{
	if (flag)
		muBase->Config.Flags |= muCFGF_LimitDOSSetProtection;
	else
		muBase->Config.Flags &= ~muCFGF_LimitDOSSetProtection;
	return(TRUE);
}


	/*
	 *		Replacement for the dos.library SetProtection() function
	 */

BOOL __asm __saveds NEWSetProtection(register __d1 STRPTR name,
												 register __d2 LONG mask,
												 register __a6 struct DosLibrary *dosbase)
{
	BPTR fl;
	struct FileInfoBlock *fib;

	if ((muBase->Config.Flags & muCFGF_LimitDOSSetProtection) &&
		 (fl = Lock(name, ACCESS_READ))) {
		if (fib = AllocDosObject(DOS_FIB, NULL)) {
			if (Examine(fl, fib))
				mask = (mask&0x000000ff)|(fib->fib_Protection&0xffffff00);
			FreeDosObject(DOS_FIB, fib);
		}
		UnLock(fl);
	}
	return(muBase->OLDSetProtection(name, mask, dosbase));
}
