48489518703f466a7006292fcd374ed3b2858c02
[util-vserver.git] / kernel / xid.h
1 #ifndef _VX_XID_H
2 #define _VX_XID_H
3
4 #ifndef CONFIG_VSERVER
5 #warning config options missing
6 #endif
7
8 #define XID_TAG_SB(sb)  (sb->s_flags & MS_TAGXID)
9
10 #define XID_TAG(in)     (!(in) || \
11         (((struct inode *)in)->i_sb && \
12         XID_TAG_SB(((struct inode *)in)->i_sb)))
13
14
15 #ifdef CONFIG_XID_TAG_NFSD
16 #define XID_TAG_NFSD    1
17 #else
18 #define XID_TAG_NFSD    0
19 #endif
20
21
22 #ifdef CONFIG_INOXID_NONE
23
24 #define MAX_UID         0xFFFFFFFF
25 #define MAX_GID         0xFFFFFFFF
26
27 #define INOXID_XID(tag, uid, gid, xid)  (0)
28
29 #define XIDINO_UID(tag, uid, xid)       (uid)
30 #define XIDINO_GID(tag, gid, xid)       (gid)
31
32 #endif
33
34
35 #ifdef CONFIG_INOXID_GID16
36
37 #define MAX_UID         0xFFFFFFFF
38 #define MAX_GID         0x0000FFFF
39
40 #define INOXID_XID(tag, uid, gid, xid)  \
41         ((tag) ? (((gid) >> 16) & 0xFFFF) : 0)
42
43 #define XIDINO_UID(tag, uid, xid)       (uid)
44 #define XIDINO_GID(tag, gid, xid)       \
45         ((tag) ? (((gid) & 0xFFFF) | ((xid) << 16)) : (gid))
46
47 #endif
48
49
50 #ifdef CONFIG_INOXID_UGID24
51
52 #define MAX_UID         0x00FFFFFF
53 #define MAX_GID         0x00FFFFFF
54
55 #define INOXID_XID(tag, uid, gid, xid)  \
56         ((tag) ? ((((uid) >> 16) & 0xFF00) | (((gid) >> 24) & 0xFF)) : 0)
57
58 #define XIDINO_UID(tag, uid, xid)       \
59         ((tag) ? (((uid) & 0xFFFFFF) | (((xid) & 0xFF00) << 16)) : (uid))
60 #define XIDINO_GID(tag, gid, xid)       \
61         ((tag) ? (((gid) & 0xFFFFFF) | (((xid) & 0x00FF) << 24)) : (gid))
62
63 #endif
64
65
66 #ifdef CONFIG_INOXID_UID16
67
68 #define MAX_UID         0x0000FFFF
69 #define MAX_GID         0xFFFFFFFF
70
71 #define INOXID_XID(tag, uid, gid, xid)  \
72         ((tag) ? (((uid) >> 16) & 0xFFFF) : 0)
73
74 #define XIDINO_UID(tag, uid, xid)       \
75         ((tag) ? (((uid) & 0xFFFF) | ((xid) << 16)) : (uid))
76 #define XIDINO_GID(tag, gid, xid)       (gid)
77
78 #endif
79
80
81 #ifdef CONFIG_INOXID_INTERN
82
83 #define MAX_UID         0xFFFFFFFF
84 #define MAX_GID         0xFFFFFFFF
85
86 #define INOXID_XID(tag, uid, gid, xid)  \
87         ((tag) ? (xid) : 0)
88
89 #define XIDINO_UID(tag, uid, xid)       (uid)
90 #define XIDINO_GID(tag, gid, xid)       (gid)
91
92 #endif
93
94
95 #ifdef CONFIG_INOXID_RUNTIME
96
97 #define MAX_UID         0xFFFFFFFF
98 #define MAX_GID         0xFFFFFFFF
99
100 #define INOXID_XID(tag, uid, gid, xid)  (0)
101
102 #define XIDINO_UID(tag, uid, xid)       (uid)
103 #define XIDINO_GID(tag, gid, xid)       (gid)
104
105 #endif
106
107
108 #ifdef CONFIG_INOXID_NONE
109 #define vx_current_fsxid(sb)    (0)
110 #else
111 #define vx_current_fsxid(sb)    \
112         (XID_TAG_SB(sb) ? current->xid : 0)
113 #endif
114
115 #define INOXID_UID(tag, uid, gid)       \
116         ((tag) ? ((uid) & MAX_UID) : (uid))
117 #define INOXID_GID(tag, uid, gid)       \
118         ((tag) ? ((gid) & MAX_GID) : (gid))
119
120
121 static inline uid_t vx_map_uid(uid_t uid)
122 {
123         if ((uid > MAX_UID) && (uid != -1))
124                 uid = -2;
125         return (uid & MAX_UID);
126 }
127
128 static inline gid_t vx_map_gid(gid_t gid)
129 {
130         if ((gid > MAX_GID) && (gid != -1))
131                 gid = -2;
132         return (gid & MAX_GID);
133 }
134
135
136 #ifdef  CONFIG_VSERVER_LEGACY
137 #define FIOC_GETXID     _IOR('x', 1, long)
138 #define FIOC_SETXID     _IOW('x', 2, long)
139 #define FIOC_SETXIDJ    _IOW('x', 3, long)
140 #endif
141
142 int vx_parse_xid(char *string, xid_t *xid, int remove);
143 void vx_propagate_xid(struct nameidata *nd, struct inode *inode);
144
145 #endif /* _VX_XID_H */