release the dnode lock after EACCESS in path walk
[lunaix-os.git] / lunaix-os / includes / lunaix / fs_acl.h
1 #ifndef __LUNAIX_FS_ACL_H
2 #define __LUNAIX_FS_ACL_H
3
4 #include <lunaix/usrscope.h>
5 #include "compiler.h"
6
7 #define FSACL_READ     4
8 #define FSACL_WRITE    2
9 #define FSACL_EXEC     1
10
11 #define FSACL_MASK     03777
12 #define FSACL_RWXMASK  0777
13 #define FSACL_U(x)    (((x) & 0b111) << 6)
14 #define FSACL_G(x)    (((x) & 0b111) << 3)
15 #define FSACL_O(x)    ((x) & 0b111)
16
17 #define FSACL_uR      FSACL_U(FSACL_READ)
18 #define FSACL_uW      FSACL_U(FSACL_WRITE)
19 #define FSACL_uX      FSACL_U(FSACL_EXEC)
20
21 #define FSACL_gR      FSACL_G(FSACL_READ)
22 #define FSACL_gW      FSACL_G(FSACL_WRITE)
23 #define FSACL_gX      FSACL_G(FSACL_EXEC)
24
25 #define FSACL_oR      FSACL_O(FSACL_READ)
26 #define FSACL_oW      FSACL_O(FSACL_WRITE)
27 #define FSACL_oX      FSACL_O(FSACL_EXEC)
28
29 #define FSACL_suid    04000
30 #define FSACL_sgid    02000
31 #define FSACL_svtx    01000
32
33 // permitted read (any usr or group matched)
34 #define FSACL_RD      (FSACL_uRD | FSACL_gRD)
35 // permitted write (any usr or group matched)
36 #define FSACL_WR      (FSACL_uWR | FSACL_gWR)
37 // permitted execute (any usr or group matched)
38 #define FSACL_X       (FSACL_uX | FSACL_gX)
39
40 #define FSACL_u_      0
41 #define FSACL_g_      0
42 #define FSACL_o_      0
43
44 // any read
45 #define FSACL_aR      (FSACL_uR | FSACL_gR | FSACL_oR)
46 // any write
47 #define FSACL_aW      (FSACL_uW | FSACL_gW | FSACL_oW)
48 // any execute
49 #define FSACL_aX      (FSACL_uX | FSACL_gX | FSACL_oX)
50
51 #define __fsacl_sel(scope, type)    (FSACL_##scope##type)
52 #define FSACL_u(r, w, x)            \
53         (v__(__fsacl_sel(u, r)) | v__(__fsacl_sel(u, w)) | v__(__fsacl_sel(u, x)))
54
55 #define FSACL_g(r, w, x)            \
56         (v__(__fsacl_sel(g, r)) | v__(__fsacl_sel(g, w)) | v__(__fsacl_sel(g, x)))
57
58 #define FSACL_o(r, w, x)            \
59         (v__(__fsacl_sel(o, r)) | v__(__fsacl_sel(o, w)) | v__(__fsacl_sel(o, x)))
60
61 #define FSACL_DEFAULT               \
62         (FSACL_u(R, W, X) | FSACL_g(R, W, X) | FSACL_o(R, _, X))
63
64 #define fsacl_test(acl, type)   ((acl) & (FSACL_##type))
65
66 static inline bool must_inline
67 fsacl_allow_ops(unsigned int ops, unsigned int acl, uid_t uid, gid_t gid)
68 {
69     return !!(acl & ops & check_current_acl(uid, gid));
70 }
71
72 #endif /* __LUNAIX_FS_ACL_H */