Reactos
at master 54 lines 1.7 kB view raw
1/* 2 * COPYRIGHT: See COPYRIGHT.TXT 3 * PROJECT: Ext2 File System Driver for WinNT/2K/XP 4 * FILE: access.c 5 * PROGRAMMER: Matt Wu <mattwu@163.com> 6 * HOMEPAGE: http://www.ext2fsd.com 7 * UPDATE HISTORY: 8 */ 9 10/* INCLUDES *****************************************************************/ 11 12#include "ext2fs.h" 13 14/* GLOBALS ***************************************************************/ 15 16extern PEXT2_GLOBAL Ext2Global; 17 18/* DEFINITIONS *************************************************************/ 19 20int Ext2CheckInodeAccess(PEXT2_VCB Vcb, struct inode *in, int attempt) 21{ 22 int granted = 0; 23 24 uid_t uid = Vcb->uid; 25 gid_t gid = Vcb->gid; 26 27 if (IsFlagOn(Vcb->Flags, VCB_USER_EIDS)) { 28 uid = Vcb->euid; 29 gid = Vcb->egid; 30 } 31 32 if (!uid || uid == in->i_uid) { 33 /* grant all access for inode owner or root */ 34 granted = Ext2FileCanRead | Ext2FileCanWrite | Ext2FileCanExecute; 35 } else if (gid == in->i_gid) { 36 if (Ext2IsGroupReadOnly(in->i_mode)) 37 granted = Ext2FileCanRead | Ext2FileCanExecute; 38 else if (Ext2IsGroupWritable(in->i_mode)) 39 granted = Ext2FileCanRead | Ext2FileCanWrite | Ext2FileCanExecute; 40 } else { 41 if (Ext2IsOtherReadOnly(in->i_mode)) 42 granted = Ext2FileCanRead | Ext2FileCanExecute; 43 else if (Ext2IsOtherWritable(in->i_mode)) 44 granted = Ext2FileCanRead | Ext2FileCanWrite | Ext2FileCanExecute; 45 46 } 47 48 return IsFlagOn(granted, attempt); 49} 50 51int Ext2CheckFileAccess(PEXT2_VCB Vcb, PEXT2_MCB Mcb, int attempt) 52{ 53 return Ext2CheckInodeAccess(Vcb, &Mcb->Inode, attempt); 54}