xref: /reactos/drivers/filesystems/ext2/src/access.c (revision 50cf16b3)
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 
16 extern PEXT2_GLOBAL Ext2Global;
17 
18 /* DEFINITIONS *************************************************************/
19 
20 int 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 
51 int Ext2CheckFileAccess(PEXT2_VCB Vcb, PEXT2_MCB Mcb, int attempt)
52 {
53     return Ext2CheckInodeAccess(Vcb, &Mcb->Inode, attempt);
54 }
55