mirror of
https://github.com/reactos/reactos.git
synced 2025-01-01 03:54:02 +00:00
54 lines
1.6 KiB
C
54 lines
1.6 KiB
C
/*
|
|
* COPYRIGHT: See COPYRIGHT.TXT
|
|
* PROJECT: Ext2 File System Driver for WinNT/2K/XP
|
|
* FILE: access.c
|
|
* PROGRAMMER: Matt Wu <mattwu@163.com>
|
|
* HOMEPAGE: http://www.ext2fsd.com
|
|
* UPDATE HISTORY:
|
|
*/
|
|
|
|
/* INCLUDES *****************************************************************/
|
|
|
|
#include "ext2fs.h"
|
|
|
|
/* GLOBALS ***************************************************************/
|
|
|
|
extern PEXT2_GLOBAL Ext2Global;
|
|
|
|
/* DEFINITIONS *************************************************************/
|
|
|
|
int Ext2CheckInodeAccess(PEXT2_VCB Vcb, struct inode *in, int attempt)
|
|
{
|
|
int granted = 0;
|
|
|
|
uid_t uid = Vcb->uid;
|
|
gid_t gid = Vcb->gid;
|
|
|
|
if (IsFlagOn(Vcb->Flags, VCB_USER_EIDS)) {
|
|
uid = Vcb->euid;
|
|
gid = Vcb->egid;
|
|
}
|
|
|
|
if (!uid || uid == in->i_uid) {
|
|
/* grant all access for inode owner or root */
|
|
granted = Ext2FileCanRead | Ext2FileCanWrite | Ext2FileCanExecute;
|
|
} else if (gid == in->i_gid) {
|
|
if (Ext2IsGroupReadOnly(in->i_mode))
|
|
granted = Ext2FileCanRead | Ext2FileCanExecute;
|
|
else if (Ext2IsGroupWritable(in->i_mode))
|
|
granted = Ext2FileCanRead | Ext2FileCanWrite | Ext2FileCanExecute;
|
|
} else {
|
|
if (Ext2IsOtherReadOnly(in->i_mode))
|
|
granted = Ext2FileCanRead | Ext2FileCanExecute;
|
|
else if (Ext2IsOtherWritable(in->i_mode))
|
|
granted = Ext2FileCanRead | Ext2FileCanWrite | Ext2FileCanExecute;
|
|
|
|
}
|
|
|
|
return IsFlagOn(granted, attempt);
|
|
}
|
|
|
|
int Ext2CheckFileAccess(PEXT2_VCB Vcb, PEXT2_MCB Mcb, int attempt)
|
|
{
|
|
return Ext2CheckInodeAccess(Vcb, &Mcb->Inode, attempt);
|
|
}
|