3414edf656f3e01a2028343646b4a30921ab415f
[ira/wip.git] / source4 / torture / basic / denytest.c
1 /* 
2    Unix SMB/CIFS implementation.
3    SMB torture tester - deny mode scanning functions
4    Copyright (C) Andrew Tridgell 2001
5    
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10    
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15    
16    You should have received a copy of the GNU General Public License
17    along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #include "includes.h"
21 #include "torture/torture.h"
22 #include "system/filesys.h"
23 #include "libcli/raw/libcliraw.h"
24 #include "libcli/libcli.h"
25 #include "libcli/security/security.h"
26 #include "torture/util.h"
27 #include "torture/smbtorture.h"
28 #include "libcli/util/clilsa.h"
29 #include "cxd_known.h"
30
31 extern int torture_failures;
32
33 #define CHECK_MAX_FAILURES(label) do { if (++failures >= torture_failures) goto label; } while (0)
34
35 enum deny_result {A_0=0, A_X=1, A_R=2, A_W=3, A_RW=5};
36
37 static const char *denystr(int denymode)
38 {
39         const struct {
40                 int v;
41                 const char *name; 
42         } deny_modes[] = {
43                 {DENY_DOS, "DENY_DOS"},
44                 {DENY_ALL, "DENY_ALL"},
45                 {DENY_WRITE, "DENY_WRITE"},
46                 {DENY_READ, "DENY_READ"},
47                 {DENY_NONE, "DENY_NONE"},
48                 {DENY_FCB, "DENY_FCB"},
49                 {-1, NULL}};
50         int i;
51         for (i=0;deny_modes[i].name;i++) {
52                 if (deny_modes[i].v == denymode) return deny_modes[i].name;
53         }
54         return "DENY_XXX";
55 }
56
57 static const char *openstr(int mode)
58 {
59         const struct {
60                 int v;
61                 const char *name; 
62         } open_modes[] = {
63                 {O_RDWR, "O_RDWR"},
64                 {O_RDONLY, "O_RDONLY"},
65                 {O_WRONLY, "O_WRONLY"},
66                 {-1, NULL}};
67         int i;
68         for (i=0;open_modes[i].name;i++) {
69                 if (open_modes[i].v == mode) return open_modes[i].name;
70         }
71         return "O_XXX";
72 }
73
74 static const char *resultstr(enum deny_result res)
75 {
76         const struct {
77                 enum deny_result res;
78                 const char *name; 
79         } results[] = {
80                 {A_X, "X"},
81                 {A_0, "-"},
82                 {A_R, "R"},
83                 {A_W, "W"},
84                 {A_RW,"RW"}};
85         int i;
86         for (i=0;ARRAY_SIZE(results);i++) {
87                 if (results[i].res == res) return results[i].name;
88         }
89         return "*";
90 }
91
92 static const struct {
93         int isexe;
94         int mode1, deny1;
95         int mode2, deny2;
96         enum deny_result result;
97 } denytable2[] = {
98 {1,   O_RDWR,   DENY_DOS,      O_RDWR,   DENY_DOS,     A_RW},
99 {1,   O_RDWR,   DENY_DOS,    O_RDONLY,   DENY_DOS,     A_R},
100 {1,   O_RDWR,   DENY_DOS,    O_WRONLY,   DENY_DOS,     A_W},
101 {1,   O_RDWR,   DENY_DOS,      O_RDWR,   DENY_ALL,     A_0},
102 {1,   O_RDWR,   DENY_DOS,    O_RDONLY,   DENY_ALL,     A_0},
103 {1,   O_RDWR,   DENY_DOS,    O_WRONLY,   DENY_ALL,     A_0},
104 {1,   O_RDWR,   DENY_DOS,      O_RDWR, DENY_WRITE,     A_0},
105 {1,   O_RDWR,   DENY_DOS,    O_RDONLY, DENY_WRITE,     A_0},
106 {1,   O_RDWR,   DENY_DOS,    O_WRONLY, DENY_WRITE,     A_0},
107 {1,   O_RDWR,   DENY_DOS,      O_RDWR,  DENY_READ,     A_0},
108 {1,   O_RDWR,   DENY_DOS,    O_RDONLY,  DENY_READ,     A_0},
109 {1,   O_RDWR,   DENY_DOS,    O_WRONLY,  DENY_READ,     A_0},
110 {1,   O_RDWR,   DENY_DOS,      O_RDWR,  DENY_NONE,     A_RW},
111 {1,   O_RDWR,   DENY_DOS,    O_RDONLY,  DENY_NONE,     A_R},
112 {1,   O_RDWR,   DENY_DOS,    O_WRONLY,  DENY_NONE,     A_W},
113 {1,   O_RDWR,   DENY_DOS,      O_RDWR,   DENY_FCB,     A_0},
114 {1,   O_RDWR,   DENY_DOS,    O_RDONLY,   DENY_FCB,     A_0},
115 {1,   O_RDWR,   DENY_DOS,    O_WRONLY,   DENY_FCB,     A_0},
116 {1, O_RDONLY,   DENY_DOS,      O_RDWR,   DENY_DOS,     A_RW},
117 {1, O_RDONLY,   DENY_DOS,    O_RDONLY,   DENY_DOS,     A_R},
118 {1, O_RDONLY,   DENY_DOS,    O_WRONLY,   DENY_DOS,     A_W},
119 {1, O_RDONLY,   DENY_DOS,      O_RDWR,   DENY_ALL,     A_0},
120 {1, O_RDONLY,   DENY_DOS,    O_RDONLY,   DENY_ALL,     A_0},
121 {1, O_RDONLY,   DENY_DOS,    O_WRONLY,   DENY_ALL,     A_0},
122 {1, O_RDONLY,   DENY_DOS,      O_RDWR, DENY_WRITE,     A_RW},
123 {1, O_RDONLY,   DENY_DOS,    O_RDONLY, DENY_WRITE,     A_R},
124 {1, O_RDONLY,   DENY_DOS,    O_WRONLY, DENY_WRITE,     A_W},
125 {1, O_RDONLY,   DENY_DOS,      O_RDWR,  DENY_READ,     A_0},
126 {1, O_RDONLY,   DENY_DOS,    O_RDONLY,  DENY_READ,     A_0},
127 {1, O_RDONLY,   DENY_DOS,    O_WRONLY,  DENY_READ,     A_0},
128 {1, O_RDONLY,   DENY_DOS,      O_RDWR,  DENY_NONE,     A_RW},
129 {1, O_RDONLY,   DENY_DOS,    O_RDONLY,  DENY_NONE,     A_R},
130 {1, O_RDONLY,   DENY_DOS,    O_WRONLY,  DENY_NONE,     A_W},
131 {1, O_RDONLY,   DENY_DOS,      O_RDWR,   DENY_FCB,     A_0},
132 {1, O_RDONLY,   DENY_DOS,    O_RDONLY,   DENY_FCB,     A_0},
133 {1, O_RDONLY,   DENY_DOS,    O_WRONLY,   DENY_FCB,     A_0},
134 {1, O_WRONLY,   DENY_DOS,      O_RDWR,   DENY_DOS,     A_RW},
135 {1, O_WRONLY,   DENY_DOS,    O_RDONLY,   DENY_DOS,     A_R},
136 {1, O_WRONLY,   DENY_DOS,    O_WRONLY,   DENY_DOS,     A_W},
137 {1, O_WRONLY,   DENY_DOS,      O_RDWR,   DENY_ALL,     A_0},
138 {1, O_WRONLY,   DENY_DOS,    O_RDONLY,   DENY_ALL,     A_0},
139 {1, O_WRONLY,   DENY_DOS,    O_WRONLY,   DENY_ALL,     A_0},
140 {1, O_WRONLY,   DENY_DOS,      O_RDWR, DENY_WRITE,     A_0},
141 {1, O_WRONLY,   DENY_DOS,    O_RDONLY, DENY_WRITE,     A_0},
142 {1, O_WRONLY,   DENY_DOS,    O_WRONLY, DENY_WRITE,     A_0},
143 {1, O_WRONLY,   DENY_DOS,      O_RDWR,  DENY_READ,     A_RW},
144 {1, O_WRONLY,   DENY_DOS,    O_RDONLY,  DENY_READ,     A_R},
145 {1, O_WRONLY,   DENY_DOS,    O_WRONLY,  DENY_READ,     A_W},
146 {1, O_WRONLY,   DENY_DOS,      O_RDWR,  DENY_NONE,     A_RW},
147 {1, O_WRONLY,   DENY_DOS,    O_RDONLY,  DENY_NONE,     A_R},
148 {1, O_WRONLY,   DENY_DOS,    O_WRONLY,  DENY_NONE,     A_W},
149 {1, O_WRONLY,   DENY_DOS,      O_RDWR,   DENY_FCB,     A_0},
150 {1, O_WRONLY,   DENY_DOS,    O_RDONLY,   DENY_FCB,     A_0},
151 {1, O_WRONLY,   DENY_DOS,    O_WRONLY,   DENY_FCB,     A_0},
152 {1,   O_RDWR,   DENY_ALL,      O_RDWR,   DENY_DOS,     A_0},
153 {1,   O_RDWR,   DENY_ALL,    O_RDONLY,   DENY_DOS,     A_0},
154 {1,   O_RDWR,   DENY_ALL,    O_WRONLY,   DENY_DOS,     A_0},
155 {1,   O_RDWR,   DENY_ALL,      O_RDWR,   DENY_ALL,     A_0},
156 {1,   O_RDWR,   DENY_ALL,    O_RDONLY,   DENY_ALL,     A_0},
157 {1,   O_RDWR,   DENY_ALL,    O_WRONLY,   DENY_ALL,     A_0},
158 {1,   O_RDWR,   DENY_ALL,      O_RDWR, DENY_WRITE,     A_0},
159 {1,   O_RDWR,   DENY_ALL,    O_RDONLY, DENY_WRITE,     A_0},
160 {1,   O_RDWR,   DENY_ALL,    O_WRONLY, DENY_WRITE,     A_0},
161 {1,   O_RDWR,   DENY_ALL,      O_RDWR,  DENY_READ,     A_0},
162 {1,   O_RDWR,   DENY_ALL,    O_RDONLY,  DENY_READ,     A_0},
163 {1,   O_RDWR,   DENY_ALL,    O_WRONLY,  DENY_READ,     A_0},
164 {1,   O_RDWR,   DENY_ALL,      O_RDWR,  DENY_NONE,     A_0},
165 {1,   O_RDWR,   DENY_ALL,    O_RDONLY,  DENY_NONE,     A_0},
166 {1,   O_RDWR,   DENY_ALL,    O_WRONLY,  DENY_NONE,     A_0},
167 {1,   O_RDWR,   DENY_ALL,      O_RDWR,   DENY_FCB,     A_0},
168 {1,   O_RDWR,   DENY_ALL,    O_RDONLY,   DENY_FCB,     A_0},
169 {1,   O_RDWR,   DENY_ALL,    O_WRONLY,   DENY_FCB,     A_0},
170 {1, O_RDONLY,   DENY_ALL,      O_RDWR,   DENY_DOS,     A_0},
171 {1, O_RDONLY,   DENY_ALL,    O_RDONLY,   DENY_DOS,     A_0},
172 {1, O_RDONLY,   DENY_ALL,    O_WRONLY,   DENY_DOS,     A_0},
173 {1, O_RDONLY,   DENY_ALL,      O_RDWR,   DENY_ALL,     A_0},
174 {1, O_RDONLY,   DENY_ALL,    O_RDONLY,   DENY_ALL,     A_0},
175 {1, O_RDONLY,   DENY_ALL,    O_WRONLY,   DENY_ALL,     A_0},
176 {1, O_RDONLY,   DENY_ALL,      O_RDWR, DENY_WRITE,     A_0},
177 {1, O_RDONLY,   DENY_ALL,    O_RDONLY, DENY_WRITE,     A_0},
178 {1, O_RDONLY,   DENY_ALL,    O_WRONLY, DENY_WRITE,     A_0},
179 {1, O_RDONLY,   DENY_ALL,      O_RDWR,  DENY_READ,     A_0},
180 {1, O_RDONLY,   DENY_ALL,    O_RDONLY,  DENY_READ,     A_0},
181 {1, O_RDONLY,   DENY_ALL,    O_WRONLY,  DENY_READ,     A_0},
182 {1, O_RDONLY,   DENY_ALL,      O_RDWR,  DENY_NONE,     A_0},
183 {1, O_RDONLY,   DENY_ALL,    O_RDONLY,  DENY_NONE,     A_0},
184 {1, O_RDONLY,   DENY_ALL,    O_WRONLY,  DENY_NONE,     A_0},
185 {1, O_RDONLY,   DENY_ALL,      O_RDWR,   DENY_FCB,     A_0},
186 {1, O_RDONLY,   DENY_ALL,    O_RDONLY,   DENY_FCB,     A_0},
187 {1, O_RDONLY,   DENY_ALL,    O_WRONLY,   DENY_FCB,     A_0},
188 {1, O_WRONLY,   DENY_ALL,      O_RDWR,   DENY_DOS,     A_0},
189 {1, O_WRONLY,   DENY_ALL,    O_RDONLY,   DENY_DOS,     A_0},
190 {1, O_WRONLY,   DENY_ALL,    O_WRONLY,   DENY_DOS,     A_0},
191 {1, O_WRONLY,   DENY_ALL,      O_RDWR,   DENY_ALL,     A_0},
192 {1, O_WRONLY,   DENY_ALL,    O_RDONLY,   DENY_ALL,     A_0},
193 {1, O_WRONLY,   DENY_ALL,    O_WRONLY,   DENY_ALL,     A_0},
194 {1, O_WRONLY,   DENY_ALL,      O_RDWR, DENY_WRITE,     A_0},
195 {1, O_WRONLY,   DENY_ALL,    O_RDONLY, DENY_WRITE,     A_0},
196 {1, O_WRONLY,   DENY_ALL,    O_WRONLY, DENY_WRITE,     A_0},
197 {1, O_WRONLY,   DENY_ALL,      O_RDWR,  DENY_READ,     A_0},
198 {1, O_WRONLY,   DENY_ALL,    O_RDONLY,  DENY_READ,     A_0},
199 {1, O_WRONLY,   DENY_ALL,    O_WRONLY,  DENY_READ,     A_0},
200 {1, O_WRONLY,   DENY_ALL,      O_RDWR,  DENY_NONE,     A_0},
201 {1, O_WRONLY,   DENY_ALL,    O_RDONLY,  DENY_NONE,     A_0},
202 {1, O_WRONLY,   DENY_ALL,    O_WRONLY,  DENY_NONE,     A_0},
203 {1, O_WRONLY,   DENY_ALL,      O_RDWR,   DENY_FCB,     A_0},
204 {1, O_WRONLY,   DENY_ALL,    O_RDONLY,   DENY_FCB,     A_0},
205 {1, O_WRONLY,   DENY_ALL,    O_WRONLY,   DENY_FCB,     A_0},
206 {1,   O_RDWR, DENY_WRITE,      O_RDWR,   DENY_DOS,     A_0},
207 {1,   O_RDWR, DENY_WRITE,    O_RDONLY,   DENY_DOS,     A_R},
208 {1,   O_RDWR, DENY_WRITE,    O_WRONLY,   DENY_DOS,     A_0},
209 {1,   O_RDWR, DENY_WRITE,      O_RDWR,   DENY_ALL,     A_0},
210 {1,   O_RDWR, DENY_WRITE,    O_RDONLY,   DENY_ALL,     A_0},
211 {1,   O_RDWR, DENY_WRITE,    O_WRONLY,   DENY_ALL,     A_0},
212 {1,   O_RDWR, DENY_WRITE,      O_RDWR, DENY_WRITE,     A_0},
213 {1,   O_RDWR, DENY_WRITE,    O_RDONLY, DENY_WRITE,     A_0},
214 {1,   O_RDWR, DENY_WRITE,    O_WRONLY, DENY_WRITE,     A_0},
215 {1,   O_RDWR, DENY_WRITE,      O_RDWR,  DENY_READ,     A_0},
216 {1,   O_RDWR, DENY_WRITE,    O_RDONLY,  DENY_READ,     A_0},
217 {1,   O_RDWR, DENY_WRITE,    O_WRONLY,  DENY_READ,     A_0},
218 {1,   O_RDWR, DENY_WRITE,      O_RDWR,  DENY_NONE,     A_0},
219 {1,   O_RDWR, DENY_WRITE,    O_RDONLY,  DENY_NONE,     A_R},
220 {1,   O_RDWR, DENY_WRITE,    O_WRONLY,  DENY_NONE,     A_0},
221 {1,   O_RDWR, DENY_WRITE,      O_RDWR,   DENY_FCB,     A_0},
222 {1,   O_RDWR, DENY_WRITE,    O_RDONLY,   DENY_FCB,     A_0},
223 {1,   O_RDWR, DENY_WRITE,    O_WRONLY,   DENY_FCB,     A_0},
224 {1, O_RDONLY, DENY_WRITE,      O_RDWR,   DENY_DOS,     A_0},
225 {1, O_RDONLY, DENY_WRITE,    O_RDONLY,   DENY_DOS,     A_R},
226 {1, O_RDONLY, DENY_WRITE,    O_WRONLY,   DENY_DOS,     A_0},
227 {1, O_RDONLY, DENY_WRITE,      O_RDWR,   DENY_ALL,     A_0},
228 {1, O_RDONLY, DENY_WRITE,    O_RDONLY,   DENY_ALL,     A_0},
229 {1, O_RDONLY, DENY_WRITE,    O_WRONLY,   DENY_ALL,     A_0},
230 {1, O_RDONLY, DENY_WRITE,      O_RDWR, DENY_WRITE,     A_0},
231 {1, O_RDONLY, DENY_WRITE,    O_RDONLY, DENY_WRITE,     A_R},
232 {1, O_RDONLY, DENY_WRITE,    O_WRONLY, DENY_WRITE,     A_0},
233 {1, O_RDONLY, DENY_WRITE,      O_RDWR,  DENY_READ,     A_0},
234 {1, O_RDONLY, DENY_WRITE,    O_RDONLY,  DENY_READ,     A_0},
235 {1, O_RDONLY, DENY_WRITE,    O_WRONLY,  DENY_READ,     A_0},
236 {1, O_RDONLY, DENY_WRITE,      O_RDWR,  DENY_NONE,     A_0},
237 {1, O_RDONLY, DENY_WRITE,    O_RDONLY,  DENY_NONE,     A_R},
238 {1, O_RDONLY, DENY_WRITE,    O_WRONLY,  DENY_NONE,     A_0},
239 {1, O_RDONLY, DENY_WRITE,      O_RDWR,   DENY_FCB,     A_0},
240 {1, O_RDONLY, DENY_WRITE,    O_RDONLY,   DENY_FCB,     A_0},
241 {1, O_RDONLY, DENY_WRITE,    O_WRONLY,   DENY_FCB,     A_0},
242 {1, O_WRONLY, DENY_WRITE,      O_RDWR,   DENY_DOS,     A_0},
243 {1, O_WRONLY, DENY_WRITE,    O_RDONLY,   DENY_DOS,     A_R},
244 {1, O_WRONLY, DENY_WRITE,    O_WRONLY,   DENY_DOS,     A_0},
245 {1, O_WRONLY, DENY_WRITE,      O_RDWR,   DENY_ALL,     A_0},
246 {1, O_WRONLY, DENY_WRITE,    O_RDONLY,   DENY_ALL,     A_0},
247 {1, O_WRONLY, DENY_WRITE,    O_WRONLY,   DENY_ALL,     A_0},
248 {1, O_WRONLY, DENY_WRITE,      O_RDWR, DENY_WRITE,     A_0},
249 {1, O_WRONLY, DENY_WRITE,    O_RDONLY, DENY_WRITE,     A_0},
250 {1, O_WRONLY, DENY_WRITE,    O_WRONLY, DENY_WRITE,     A_0},
251 {1, O_WRONLY, DENY_WRITE,      O_RDWR,  DENY_READ,     A_0},
252 {1, O_WRONLY, DENY_WRITE,    O_RDONLY,  DENY_READ,     A_R},
253 {1, O_WRONLY, DENY_WRITE,    O_WRONLY,  DENY_READ,     A_0},
254 {1, O_WRONLY, DENY_WRITE,      O_RDWR,  DENY_NONE,     A_0},
255 {1, O_WRONLY, DENY_WRITE,    O_RDONLY,  DENY_NONE,     A_R},
256 {1, O_WRONLY, DENY_WRITE,    O_WRONLY,  DENY_NONE,     A_0},
257 {1, O_WRONLY, DENY_WRITE,      O_RDWR,   DENY_FCB,     A_0},
258 {1, O_WRONLY, DENY_WRITE,    O_RDONLY,   DENY_FCB,     A_0},
259 {1, O_WRONLY, DENY_WRITE,    O_WRONLY,   DENY_FCB,     A_0},
260 {1,   O_RDWR,  DENY_READ,      O_RDWR,   DENY_DOS,     A_0},
261 {1,   O_RDWR,  DENY_READ,    O_RDONLY,   DENY_DOS,     A_0},
262 {1,   O_RDWR,  DENY_READ,    O_WRONLY,   DENY_DOS,     A_W},
263 {1,   O_RDWR,  DENY_READ,      O_RDWR,   DENY_ALL,     A_0},
264 {1,   O_RDWR,  DENY_READ,    O_RDONLY,   DENY_ALL,     A_0},
265 {1,   O_RDWR,  DENY_READ,    O_WRONLY,   DENY_ALL,     A_0},
266 {1,   O_RDWR,  DENY_READ,      O_RDWR, DENY_WRITE,     A_0},
267 {1,   O_RDWR,  DENY_READ,    O_RDONLY, DENY_WRITE,     A_0},
268 {1,   O_RDWR,  DENY_READ,    O_WRONLY, DENY_WRITE,     A_0},
269 {1,   O_RDWR,  DENY_READ,      O_RDWR,  DENY_READ,     A_0},
270 {1,   O_RDWR,  DENY_READ,    O_RDONLY,  DENY_READ,     A_0},
271 {1,   O_RDWR,  DENY_READ,    O_WRONLY,  DENY_READ,     A_0},
272 {1,   O_RDWR,  DENY_READ,      O_RDWR,  DENY_NONE,     A_0},
273 {1,   O_RDWR,  DENY_READ,    O_RDONLY,  DENY_NONE,     A_0},
274 {1,   O_RDWR,  DENY_READ,    O_WRONLY,  DENY_NONE,     A_W},
275 {1,   O_RDWR,  DENY_READ,      O_RDWR,   DENY_FCB,     A_0},
276 {1,   O_RDWR,  DENY_READ,    O_RDONLY,   DENY_FCB,     A_0},
277 {1,   O_RDWR,  DENY_READ,    O_WRONLY,   DENY_FCB,     A_0},
278 {1, O_RDONLY,  DENY_READ,      O_RDWR,   DENY_DOS,     A_0},
279 {1, O_RDONLY,  DENY_READ,    O_RDONLY,   DENY_DOS,     A_0},
280 {1, O_RDONLY,  DENY_READ,    O_WRONLY,   DENY_DOS,     A_W},
281 {1, O_RDONLY,  DENY_READ,      O_RDWR,   DENY_ALL,     A_0},
282 {1, O_RDONLY,  DENY_READ,    O_RDONLY,   DENY_ALL,     A_0},
283 {1, O_RDONLY,  DENY_READ,    O_WRONLY,   DENY_ALL,     A_0},
284 {1, O_RDONLY,  DENY_READ,      O_RDWR, DENY_WRITE,     A_0},
285 {1, O_RDONLY,  DENY_READ,    O_RDONLY, DENY_WRITE,     A_0},
286 {1, O_RDONLY,  DENY_READ,    O_WRONLY, DENY_WRITE,     A_W},
287 {1, O_RDONLY,  DENY_READ,      O_RDWR,  DENY_READ,     A_0},
288 {1, O_RDONLY,  DENY_READ,    O_RDONLY,  DENY_READ,     A_0},
289 {1, O_RDONLY,  DENY_READ,    O_WRONLY,  DENY_READ,     A_0},
290 {1, O_RDONLY,  DENY_READ,      O_RDWR,  DENY_NONE,     A_0},
291 {1, O_RDONLY,  DENY_READ,    O_RDONLY,  DENY_NONE,     A_0},
292 {1, O_RDONLY,  DENY_READ,    O_WRONLY,  DENY_NONE,     A_W},
293 {1, O_RDONLY,  DENY_READ,      O_RDWR,   DENY_FCB,     A_0},
294 {1, O_RDONLY,  DENY_READ,    O_RDONLY,   DENY_FCB,     A_0},
295 {1, O_RDONLY,  DENY_READ,    O_WRONLY,   DENY_FCB,     A_0},
296 {1, O_WRONLY,  DENY_READ,      O_RDWR,   DENY_DOS,     A_0},
297 {1, O_WRONLY,  DENY_READ,    O_RDONLY,   DENY_DOS,     A_0},
298 {1, O_WRONLY,  DENY_READ,    O_WRONLY,   DENY_DOS,     A_W},
299 {1, O_WRONLY,  DENY_READ,      O_RDWR,   DENY_ALL,     A_0},
300 {1, O_WRONLY,  DENY_READ,    O_RDONLY,   DENY_ALL,     A_0},
301 {1, O_WRONLY,  DENY_READ,    O_WRONLY,   DENY_ALL,     A_0},
302 {1, O_WRONLY,  DENY_READ,      O_RDWR, DENY_WRITE,     A_0},
303 {1, O_WRONLY,  DENY_READ,    O_RDONLY, DENY_WRITE,     A_0},
304 {1, O_WRONLY,  DENY_READ,    O_WRONLY, DENY_WRITE,     A_0},
305 {1, O_WRONLY,  DENY_READ,      O_RDWR,  DENY_READ,     A_0},
306 {1, O_WRONLY,  DENY_READ,    O_RDONLY,  DENY_READ,     A_0},
307 {1, O_WRONLY,  DENY_READ,    O_WRONLY,  DENY_READ,     A_W},
308 {1, O_WRONLY,  DENY_READ,      O_RDWR,  DENY_NONE,     A_0},
309 {1, O_WRONLY,  DENY_READ,    O_RDONLY,  DENY_NONE,     A_0},
310 {1, O_WRONLY,  DENY_READ,    O_WRONLY,  DENY_NONE,     A_W},
311 {1, O_WRONLY,  DENY_READ,      O_RDWR,   DENY_FCB,     A_0},
312 {1, O_WRONLY,  DENY_READ,    O_RDONLY,   DENY_FCB,     A_0},
313 {1, O_WRONLY,  DENY_READ,    O_WRONLY,   DENY_FCB,     A_0},
314 {1,   O_RDWR,  DENY_NONE,      O_RDWR,   DENY_DOS,     A_RW},
315 {1,   O_RDWR,  DENY_NONE,    O_RDONLY,   DENY_DOS,     A_R},
316 {1,   O_RDWR,  DENY_NONE,    O_WRONLY,   DENY_DOS,     A_W},
317 {1,   O_RDWR,  DENY_NONE,      O_RDWR,   DENY_ALL,     A_0},
318 {1,   O_RDWR,  DENY_NONE,    O_RDONLY,   DENY_ALL,     A_0},
319 {1,   O_RDWR,  DENY_NONE,    O_WRONLY,   DENY_ALL,     A_0},
320 {1,   O_RDWR,  DENY_NONE,      O_RDWR, DENY_WRITE,     A_0},
321 {1,   O_RDWR,  DENY_NONE,    O_RDONLY, DENY_WRITE,     A_0},
322 {1,   O_RDWR,  DENY_NONE,    O_WRONLY, DENY_WRITE,     A_0},
323 {1,   O_RDWR,  DENY_NONE,      O_RDWR,  DENY_READ,     A_0},
324 {1,   O_RDWR,  DENY_NONE,    O_RDONLY,  DENY_READ,     A_0},
325 {1,   O_RDWR,  DENY_NONE,    O_WRONLY,  DENY_READ,     A_0},
326 {1,   O_RDWR,  DENY_NONE,      O_RDWR,  DENY_NONE,     A_RW},
327 {1,   O_RDWR,  DENY_NONE,    O_RDONLY,  DENY_NONE,     A_R},
328 {1,   O_RDWR,  DENY_NONE,    O_WRONLY,  DENY_NONE,     A_W},
329 {1,   O_RDWR,  DENY_NONE,      O_RDWR,   DENY_FCB,     A_0},
330 {1,   O_RDWR,  DENY_NONE,    O_RDONLY,   DENY_FCB,     A_0},
331 {1,   O_RDWR,  DENY_NONE,    O_WRONLY,   DENY_FCB,     A_0},
332 {1, O_RDONLY,  DENY_NONE,      O_RDWR,   DENY_DOS,     A_RW},
333 {1, O_RDONLY,  DENY_NONE,    O_RDONLY,   DENY_DOS,     A_R},
334 {1, O_RDONLY,  DENY_NONE,    O_WRONLY,   DENY_DOS,     A_W},
335 {1, O_RDONLY,  DENY_NONE,      O_RDWR,   DENY_ALL,     A_0},
336 {1, O_RDONLY,  DENY_NONE,    O_RDONLY,   DENY_ALL,     A_0},
337 {1, O_RDONLY,  DENY_NONE,    O_WRONLY,   DENY_ALL,     A_0},
338 {1, O_RDONLY,  DENY_NONE,      O_RDWR, DENY_WRITE,     A_RW},
339 {1, O_RDONLY,  DENY_NONE,    O_RDONLY, DENY_WRITE,     A_R},
340 {1, O_RDONLY,  DENY_NONE,    O_WRONLY, DENY_WRITE,     A_W},
341 {1, O_RDONLY,  DENY_NONE,      O_RDWR,  DENY_READ,     A_0},
342 {1, O_RDONLY,  DENY_NONE,    O_RDONLY,  DENY_READ,     A_0},
343 {1, O_RDONLY,  DENY_NONE,    O_WRONLY,  DENY_READ,     A_0},
344 {1, O_RDONLY,  DENY_NONE,      O_RDWR,  DENY_NONE,     A_RW},
345 {1, O_RDONLY,  DENY_NONE,    O_RDONLY,  DENY_NONE,     A_R},
346 {1, O_RDONLY,  DENY_NONE,    O_WRONLY,  DENY_NONE,     A_W},
347 {1, O_RDONLY,  DENY_NONE,      O_RDWR,   DENY_FCB,     A_0},
348 {1, O_RDONLY,  DENY_NONE,    O_RDONLY,   DENY_FCB,     A_0},
349 {1, O_RDONLY,  DENY_NONE,    O_WRONLY,   DENY_FCB,     A_0},
350 {1, O_WRONLY,  DENY_NONE,      O_RDWR,   DENY_DOS,     A_RW},
351 {1, O_WRONLY,  DENY_NONE,    O_RDONLY,   DENY_DOS,     A_R},
352 {1, O_WRONLY,  DENY_NONE,    O_WRONLY,   DENY_DOS,     A_W},
353 {1, O_WRONLY,  DENY_NONE,      O_RDWR,   DENY_ALL,     A_0},
354 {1, O_WRONLY,  DENY_NONE,    O_RDONLY,   DENY_ALL,     A_0},
355 {1, O_WRONLY,  DENY_NONE,    O_WRONLY,   DENY_ALL,     A_0},
356 {1, O_WRONLY,  DENY_NONE,      O_RDWR, DENY_WRITE,     A_0},
357 {1, O_WRONLY,  DENY_NONE,    O_RDONLY, DENY_WRITE,     A_0},
358 {1, O_WRONLY,  DENY_NONE,    O_WRONLY, DENY_WRITE,     A_0},
359 {1, O_WRONLY,  DENY_NONE,      O_RDWR,  DENY_READ,     A_RW},
360 {1, O_WRONLY,  DENY_NONE,    O_RDONLY,  DENY_READ,     A_R},
361 {1, O_WRONLY,  DENY_NONE,    O_WRONLY,  DENY_READ,     A_W},
362 {1, O_WRONLY,  DENY_NONE,      O_RDWR,  DENY_NONE,     A_RW},
363 {1, O_WRONLY,  DENY_NONE,    O_RDONLY,  DENY_NONE,     A_R},
364 {1, O_WRONLY,  DENY_NONE,    O_WRONLY,  DENY_NONE,     A_W},
365 {1, O_WRONLY,  DENY_NONE,      O_RDWR,   DENY_FCB,     A_0},
366 {1, O_WRONLY,  DENY_NONE,    O_RDONLY,   DENY_FCB,     A_0},
367 {1, O_WRONLY,  DENY_NONE,    O_WRONLY,   DENY_FCB,     A_0},
368 {1,   O_RDWR,   DENY_FCB,      O_RDWR,   DENY_DOS,     A_0},
369 {1,   O_RDWR,   DENY_FCB,    O_RDONLY,   DENY_DOS,     A_0},
370 {1,   O_RDWR,   DENY_FCB,    O_WRONLY,   DENY_DOS,     A_0},
371 {1,   O_RDWR,   DENY_FCB,      O_RDWR,   DENY_ALL,     A_0},
372 {1,   O_RDWR,   DENY_FCB,    O_RDONLY,   DENY_ALL,     A_0},
373 {1,   O_RDWR,   DENY_FCB,    O_WRONLY,   DENY_ALL,     A_0},
374 {1,   O_RDWR,   DENY_FCB,      O_RDWR, DENY_WRITE,     A_0},
375 {1,   O_RDWR,   DENY_FCB,    O_RDONLY, DENY_WRITE,     A_0},
376 {1,   O_RDWR,   DENY_FCB,    O_WRONLY, DENY_WRITE,     A_0},
377 {1,   O_RDWR,   DENY_FCB,      O_RDWR,  DENY_READ,     A_0},
378 {1,   O_RDWR,   DENY_FCB,    O_RDONLY,  DENY_READ,     A_0},
379 {1,   O_RDWR,   DENY_FCB,    O_WRONLY,  DENY_READ,     A_0},
380 {1,   O_RDWR,   DENY_FCB,      O_RDWR,  DENY_NONE,     A_0},
381 {1,   O_RDWR,   DENY_FCB,    O_RDONLY,  DENY_NONE,     A_0},
382 {1,   O_RDWR,   DENY_FCB,    O_WRONLY,  DENY_NONE,     A_0},
383 {1,   O_RDWR,   DENY_FCB,      O_RDWR,   DENY_FCB,     A_0},
384 {1,   O_RDWR,   DENY_FCB,    O_RDONLY,   DENY_FCB,     A_0},
385 {1,   O_RDWR,   DENY_FCB,    O_WRONLY,   DENY_FCB,     A_0},
386 {1, O_RDONLY,   DENY_FCB,      O_RDWR,   DENY_DOS,     A_0},
387 {1, O_RDONLY,   DENY_FCB,    O_RDONLY,   DENY_DOS,     A_0},
388 {1, O_RDONLY,   DENY_FCB,    O_WRONLY,   DENY_DOS,     A_0},
389 {1, O_RDONLY,   DENY_FCB,      O_RDWR,   DENY_ALL,     A_0},
390 {1, O_RDONLY,   DENY_FCB,    O_RDONLY,   DENY_ALL,     A_0},
391 {1, O_RDONLY,   DENY_FCB,    O_WRONLY,   DENY_ALL,     A_0},
392 {1, O_RDONLY,   DENY_FCB,      O_RDWR, DENY_WRITE,     A_0},
393 {1, O_RDONLY,   DENY_FCB,    O_RDONLY, DENY_WRITE,     A_0},
394 {1, O_RDONLY,   DENY_FCB,    O_WRONLY, DENY_WRITE,     A_0},
395 {1, O_RDONLY,   DENY_FCB,      O_RDWR,  DENY_READ,     A_0},
396 {1, O_RDONLY,   DENY_FCB,    O_RDONLY,  DENY_READ,     A_0},
397 {1, O_RDONLY,   DENY_FCB,    O_WRONLY,  DENY_READ,     A_0},
398 {1, O_RDONLY,   DENY_FCB,      O_RDWR,  DENY_NONE,     A_0},
399 {1, O_RDONLY,   DENY_FCB,    O_RDONLY,  DENY_NONE,     A_0},
400 {1, O_RDONLY,   DENY_FCB,    O_WRONLY,  DENY_NONE,     A_0},
401 {1, O_RDONLY,   DENY_FCB,      O_RDWR,   DENY_FCB,     A_0},
402 {1, O_RDONLY,   DENY_FCB,    O_RDONLY,   DENY_FCB,     A_0},
403 {1, O_RDONLY,   DENY_FCB,    O_WRONLY,   DENY_FCB,     A_0},
404 {1, O_WRONLY,   DENY_FCB,      O_RDWR,   DENY_DOS,     A_0},
405 {1, O_WRONLY,   DENY_FCB,    O_RDONLY,   DENY_DOS,     A_0},
406 {1, O_WRONLY,   DENY_FCB,    O_WRONLY,   DENY_DOS,     A_0},
407 {1, O_WRONLY,   DENY_FCB,      O_RDWR,   DENY_ALL,     A_0},
408 {1, O_WRONLY,   DENY_FCB,    O_RDONLY,   DENY_ALL,     A_0},
409 {1, O_WRONLY,   DENY_FCB,    O_WRONLY,   DENY_ALL,     A_0},
410 {1, O_WRONLY,   DENY_FCB,      O_RDWR, DENY_WRITE,     A_0},
411 {1, O_WRONLY,   DENY_FCB,    O_RDONLY, DENY_WRITE,     A_0},
412 {1, O_WRONLY,   DENY_FCB,    O_WRONLY, DENY_WRITE,     A_0},
413 {1, O_WRONLY,   DENY_FCB,      O_RDWR,  DENY_READ,     A_0},
414 {1, O_WRONLY,   DENY_FCB,    O_RDONLY,  DENY_READ,     A_0},
415 {1, O_WRONLY,   DENY_FCB,    O_WRONLY,  DENY_READ,     A_0},
416 {1, O_WRONLY,   DENY_FCB,      O_RDWR,  DENY_NONE,     A_0},
417 {1, O_WRONLY,   DENY_FCB,    O_RDONLY,  DENY_NONE,     A_0},
418 {1, O_WRONLY,   DENY_FCB,    O_WRONLY,  DENY_NONE,     A_0},
419 {1, O_WRONLY,   DENY_FCB,      O_RDWR,   DENY_FCB,     A_0},
420 {1, O_WRONLY,   DENY_FCB,    O_RDONLY,   DENY_FCB,     A_0},
421 {1, O_WRONLY,   DENY_FCB,    O_WRONLY,   DENY_FCB,     A_0},
422 {0,   O_RDWR,   DENY_DOS,      O_RDWR,   DENY_DOS,     A_0},
423 {0,   O_RDWR,   DENY_DOS,    O_RDONLY,   DENY_DOS,     A_0},
424 {0,   O_RDWR,   DENY_DOS,    O_WRONLY,   DENY_DOS,     A_0},
425 {0,   O_RDWR,   DENY_DOS,      O_RDWR,   DENY_ALL,     A_0},
426 {0,   O_RDWR,   DENY_DOS,    O_RDONLY,   DENY_ALL,     A_0},
427 {0,   O_RDWR,   DENY_DOS,    O_WRONLY,   DENY_ALL,     A_0},
428 {0,   O_RDWR,   DENY_DOS,      O_RDWR, DENY_WRITE,     A_0},
429 {0,   O_RDWR,   DENY_DOS,    O_RDONLY, DENY_WRITE,     A_0},
430 {0,   O_RDWR,   DENY_DOS,    O_WRONLY, DENY_WRITE,     A_0},
431 {0,   O_RDWR,   DENY_DOS,      O_RDWR,  DENY_READ,     A_0},
432 {0,   O_RDWR,   DENY_DOS,    O_RDONLY,  DENY_READ,     A_0},
433 {0,   O_RDWR,   DENY_DOS,    O_WRONLY,  DENY_READ,     A_0},
434 {0,   O_RDWR,   DENY_DOS,      O_RDWR,  DENY_NONE,     A_0},
435 {0,   O_RDWR,   DENY_DOS,    O_RDONLY,  DENY_NONE,     A_0},
436 {0,   O_RDWR,   DENY_DOS,    O_WRONLY,  DENY_NONE,     A_0},
437 {0,   O_RDWR,   DENY_DOS,      O_RDWR,   DENY_FCB,     A_0},
438 {0,   O_RDWR,   DENY_DOS,    O_RDONLY,   DENY_FCB,     A_0},
439 {0,   O_RDWR,   DENY_DOS,    O_WRONLY,   DENY_FCB,     A_0},
440 {0, O_RDONLY,   DENY_DOS,      O_RDWR,   DENY_DOS,     A_0},
441 {0, O_RDONLY,   DENY_DOS,    O_RDONLY,   DENY_DOS,     A_R},
442 {0, O_RDONLY,   DENY_DOS,    O_WRONLY,   DENY_DOS,     A_0},
443 {0, O_RDONLY,   DENY_DOS,      O_RDWR,   DENY_ALL,     A_0},
444 {0, O_RDONLY,   DENY_DOS,    O_RDONLY,   DENY_ALL,     A_0},
445 {0, O_RDONLY,   DENY_DOS,    O_WRONLY,   DENY_ALL,     A_0},
446 {0, O_RDONLY,   DENY_DOS,      O_RDWR, DENY_WRITE,     A_0},
447 {0, O_RDONLY,   DENY_DOS,    O_RDONLY, DENY_WRITE,     A_R},
448 {0, O_RDONLY,   DENY_DOS,    O_WRONLY, DENY_WRITE,     A_0},
449 {0, O_RDONLY,   DENY_DOS,      O_RDWR,  DENY_READ,     A_0},
450 {0, O_RDONLY,   DENY_DOS,    O_RDONLY,  DENY_READ,     A_0},
451 {0, O_RDONLY,   DENY_DOS,    O_WRONLY,  DENY_READ,     A_0},
452 {0, O_RDONLY,   DENY_DOS,      O_RDWR,  DENY_NONE,     A_0},
453 {0, O_RDONLY,   DENY_DOS,    O_RDONLY,  DENY_NONE,     A_R},
454 {0, O_RDONLY,   DENY_DOS,    O_WRONLY,  DENY_NONE,     A_0},
455 {0, O_RDONLY,   DENY_DOS,      O_RDWR,   DENY_FCB,     A_0},
456 {0, O_RDONLY,   DENY_DOS,    O_RDONLY,   DENY_FCB,     A_0},
457 {0, O_RDONLY,   DENY_DOS,    O_WRONLY,   DENY_FCB,     A_0},
458 {0, O_WRONLY,   DENY_DOS,      O_RDWR,   DENY_DOS,     A_0},
459 {0, O_WRONLY,   DENY_DOS,    O_RDONLY,   DENY_DOS,     A_0},
460 {0, O_WRONLY,   DENY_DOS,    O_WRONLY,   DENY_DOS,     A_0},
461 {0, O_WRONLY,   DENY_DOS,      O_RDWR,   DENY_ALL,     A_0},
462 {0, O_WRONLY,   DENY_DOS,    O_RDONLY,   DENY_ALL,     A_0},
463 {0, O_WRONLY,   DENY_DOS,    O_WRONLY,   DENY_ALL,     A_0},
464 {0, O_WRONLY,   DENY_DOS,      O_RDWR, DENY_WRITE,     A_0},
465 {0, O_WRONLY,   DENY_DOS,    O_RDONLY, DENY_WRITE,     A_0},
466 {0, O_WRONLY,   DENY_DOS,    O_WRONLY, DENY_WRITE,     A_0},
467 {0, O_WRONLY,   DENY_DOS,      O_RDWR,  DENY_READ,     A_0},
468 {0, O_WRONLY,   DENY_DOS,    O_RDONLY,  DENY_READ,     A_0},
469 {0, O_WRONLY,   DENY_DOS,    O_WRONLY,  DENY_READ,     A_0},
470 {0, O_WRONLY,   DENY_DOS,      O_RDWR,  DENY_NONE,     A_0},
471 {0, O_WRONLY,   DENY_DOS,    O_RDONLY,  DENY_NONE,     A_0},
472 {0, O_WRONLY,   DENY_DOS,    O_WRONLY,  DENY_NONE,     A_0},
473 {0, O_WRONLY,   DENY_DOS,      O_RDWR,   DENY_FCB,     A_0},
474 {0, O_WRONLY,   DENY_DOS,    O_RDONLY,   DENY_FCB,     A_0},
475 {0, O_WRONLY,   DENY_DOS,    O_WRONLY,   DENY_FCB,     A_0},
476 {0,   O_RDWR,   DENY_ALL,      O_RDWR,   DENY_DOS,     A_0},
477 {0,   O_RDWR,   DENY_ALL,    O_RDONLY,   DENY_DOS,     A_0},
478 {0,   O_RDWR,   DENY_ALL,    O_WRONLY,   DENY_DOS,     A_0},
479 {0,   O_RDWR,   DENY_ALL,      O_RDWR,   DENY_ALL,     A_0},
480 {0,   O_RDWR,   DENY_ALL,    O_RDONLY,   DENY_ALL,     A_0},
481 {0,   O_RDWR,   DENY_ALL,    O_WRONLY,   DENY_ALL,     A_0},
482 {0,   O_RDWR,   DENY_ALL,      O_RDWR, DENY_WRITE,     A_0},
483 {0,   O_RDWR,   DENY_ALL,    O_RDONLY, DENY_WRITE,     A_0},
484 {0,   O_RDWR,   DENY_ALL,    O_WRONLY, DENY_WRITE,     A_0},
485 {0,   O_RDWR,   DENY_ALL,      O_RDWR,  DENY_READ,     A_0},
486 {0,   O_RDWR,   DENY_ALL,    O_RDONLY,  DENY_READ,     A_0},
487 {0,   O_RDWR,   DENY_ALL,    O_WRONLY,  DENY_READ,     A_0},
488 {0,   O_RDWR,   DENY_ALL,      O_RDWR,  DENY_NONE,     A_0},
489 {0,   O_RDWR,   DENY_ALL,    O_RDONLY,  DENY_NONE,     A_0},
490 {0,   O_RDWR,   DENY_ALL,    O_WRONLY,  DENY_NONE,     A_0},
491 {0,   O_RDWR,   DENY_ALL,      O_RDWR,   DENY_FCB,     A_0},
492 {0,   O_RDWR,   DENY_ALL,    O_RDONLY,   DENY_FCB,     A_0},
493 {0,   O_RDWR,   DENY_ALL,    O_WRONLY,   DENY_FCB,     A_0},
494 {0, O_RDONLY,   DENY_ALL,      O_RDWR,   DENY_DOS,     A_0},
495 {0, O_RDONLY,   DENY_ALL,    O_RDONLY,   DENY_DOS,     A_0},
496 {0, O_RDONLY,   DENY_ALL,    O_WRONLY,   DENY_DOS,     A_0},
497 {0, O_RDONLY,   DENY_ALL,      O_RDWR,   DENY_ALL,     A_0},
498 {0, O_RDONLY,   DENY_ALL,    O_RDONLY,   DENY_ALL,     A_0},
499 {0, O_RDONLY,   DENY_ALL,    O_WRONLY,   DENY_ALL,     A_0},
500 {0, O_RDONLY,   DENY_ALL,      O_RDWR, DENY_WRITE,     A_0},
501 {0, O_RDONLY,   DENY_ALL,    O_RDONLY, DENY_WRITE,     A_0},
502 {0, O_RDONLY,   DENY_ALL,    O_WRONLY, DENY_WRITE,     A_0},
503 {0, O_RDONLY,   DENY_ALL,      O_RDWR,  DENY_READ,     A_0},
504 {0, O_RDONLY,   DENY_ALL,    O_RDONLY,  DENY_READ,     A_0},
505 {0, O_RDONLY,   DENY_ALL,    O_WRONLY,  DENY_READ,     A_0},
506 {0, O_RDONLY,   DENY_ALL,      O_RDWR,  DENY_NONE,     A_0},
507 {0, O_RDONLY,   DENY_ALL,    O_RDONLY,  DENY_NONE,     A_0},
508 {0, O_RDONLY,   DENY_ALL,    O_WRONLY,  DENY_NONE,     A_0},
509 {0, O_RDONLY,   DENY_ALL,      O_RDWR,   DENY_FCB,     A_0},
510 {0, O_RDONLY,   DENY_ALL,    O_RDONLY,   DENY_FCB,     A_0},
511 {0, O_RDONLY,   DENY_ALL,    O_WRONLY,   DENY_FCB,     A_0},
512 {0, O_WRONLY,   DENY_ALL,      O_RDWR,   DENY_DOS,     A_0},
513 {0, O_WRONLY,   DENY_ALL,    O_RDONLY,   DENY_DOS,     A_0},
514 {0, O_WRONLY,   DENY_ALL,    O_WRONLY,   DENY_DOS,     A_0},
515 {0, O_WRONLY,   DENY_ALL,      O_RDWR,   DENY_ALL,     A_0},
516 {0, O_WRONLY,   DENY_ALL,    O_RDONLY,   DENY_ALL,     A_0},
517 {0, O_WRONLY,   DENY_ALL,    O_WRONLY,   DENY_ALL,     A_0},
518 {0, O_WRONLY,   DENY_ALL,      O_RDWR, DENY_WRITE,     A_0},
519 {0, O_WRONLY,   DENY_ALL,    O_RDONLY, DENY_WRITE,     A_0},
520 {0, O_WRONLY,   DENY_ALL,    O_WRONLY, DENY_WRITE,     A_0},
521 {0, O_WRONLY,   DENY_ALL,      O_RDWR,  DENY_READ,     A_0},
522 {0, O_WRONLY,   DENY_ALL,    O_RDONLY,  DENY_READ,     A_0},
523 {0, O_WRONLY,   DENY_ALL,    O_WRONLY,  DENY_READ,     A_0},
524 {0, O_WRONLY,   DENY_ALL,      O_RDWR,  DENY_NONE,     A_0},
525 {0, O_WRONLY,   DENY_ALL,    O_RDONLY,  DENY_NONE,     A_0},
526 {0, O_WRONLY,   DENY_ALL,    O_WRONLY,  DENY_NONE,     A_0},
527 {0, O_WRONLY,   DENY_ALL,      O_RDWR,   DENY_FCB,     A_0},
528 {0, O_WRONLY,   DENY_ALL,    O_RDONLY,   DENY_FCB,     A_0},
529 {0, O_WRONLY,   DENY_ALL,    O_WRONLY,   DENY_FCB,     A_0},
530 {0,   O_RDWR, DENY_WRITE,      O_RDWR,   DENY_DOS,     A_0},
531 {0,   O_RDWR, DENY_WRITE,    O_RDONLY,   DENY_DOS,     A_0},
532 {0,   O_RDWR, DENY_WRITE,    O_WRONLY,   DENY_DOS,     A_0},
533 {0,   O_RDWR, DENY_WRITE,      O_RDWR,   DENY_ALL,     A_0},
534 {0,   O_RDWR, DENY_WRITE,    O_RDONLY,   DENY_ALL,     A_0},
535 {0,   O_RDWR, DENY_WRITE,    O_WRONLY,   DENY_ALL,     A_0},
536 {0,   O_RDWR, DENY_WRITE,      O_RDWR, DENY_WRITE,     A_0},
537 {0,   O_RDWR, DENY_WRITE,    O_RDONLY, DENY_WRITE,     A_0},
538 {0,   O_RDWR, DENY_WRITE,    O_WRONLY, DENY_WRITE,     A_0},
539 {0,   O_RDWR, DENY_WRITE,      O_RDWR,  DENY_READ,     A_0},
540 {0,   O_RDWR, DENY_WRITE,    O_RDONLY,  DENY_READ,     A_0},
541 {0,   O_RDWR, DENY_WRITE,    O_WRONLY,  DENY_READ,     A_0},
542 {0,   O_RDWR, DENY_WRITE,      O_RDWR,  DENY_NONE,     A_0},
543 {0,   O_RDWR, DENY_WRITE,    O_RDONLY,  DENY_NONE,     A_R},
544 {0,   O_RDWR, DENY_WRITE,    O_WRONLY,  DENY_NONE,     A_0},
545 {0,   O_RDWR, DENY_WRITE,      O_RDWR,   DENY_FCB,     A_0},
546 {0,   O_RDWR, DENY_WRITE,    O_RDONLY,   DENY_FCB,     A_0},
547 {0,   O_RDWR, DENY_WRITE,    O_WRONLY,   DENY_FCB,     A_0},
548 {0, O_RDONLY, DENY_WRITE,      O_RDWR,   DENY_DOS,     A_0},
549 {0, O_RDONLY, DENY_WRITE,    O_RDONLY,   DENY_DOS,     A_R},
550 {0, O_RDONLY, DENY_WRITE,    O_WRONLY,   DENY_DOS,     A_0},
551 {0, O_RDONLY, DENY_WRITE,      O_RDWR,   DENY_ALL,     A_0},
552 {0, O_RDONLY, DENY_WRITE,    O_RDONLY,   DENY_ALL,     A_0},
553 {0, O_RDONLY, DENY_WRITE,    O_WRONLY,   DENY_ALL,     A_0},
554 {0, O_RDONLY, DENY_WRITE,      O_RDWR, DENY_WRITE,     A_0},
555 {0, O_RDONLY, DENY_WRITE,    O_RDONLY, DENY_WRITE,     A_R},
556 {0, O_RDONLY, DENY_WRITE,    O_WRONLY, DENY_WRITE,     A_0},
557 {0, O_RDONLY, DENY_WRITE,      O_RDWR,  DENY_READ,     A_0},
558 {0, O_RDONLY, DENY_WRITE,    O_RDONLY,  DENY_READ,     A_0},
559 {0, O_RDONLY, DENY_WRITE,    O_WRONLY,  DENY_READ,     A_0},
560 {0, O_RDONLY, DENY_WRITE,      O_RDWR,  DENY_NONE,     A_0},
561 {0, O_RDONLY, DENY_WRITE,    O_RDONLY,  DENY_NONE,     A_R},
562 {0, O_RDONLY, DENY_WRITE,    O_WRONLY,  DENY_NONE,     A_0},
563 {0, O_RDONLY, DENY_WRITE,      O_RDWR,   DENY_FCB,     A_0},
564 {0, O_RDONLY, DENY_WRITE,    O_RDONLY,   DENY_FCB,     A_0},
565 {0, O_RDONLY, DENY_WRITE,    O_WRONLY,   DENY_FCB,     A_0},
566 {0, O_WRONLY, DENY_WRITE,      O_RDWR,   DENY_DOS,     A_0},
567 {0, O_WRONLY, DENY_WRITE,    O_RDONLY,   DENY_DOS,     A_0},
568 {0, O_WRONLY, DENY_WRITE,    O_WRONLY,   DENY_DOS,     A_0},
569 {0, O_WRONLY, DENY_WRITE,      O_RDWR,   DENY_ALL,     A_0},
570 {0, O_WRONLY, DENY_WRITE,    O_RDONLY,   DENY_ALL,     A_0},
571 {0, O_WRONLY, DENY_WRITE,    O_WRONLY,   DENY_ALL,     A_0},
572 {0, O_WRONLY, DENY_WRITE,      O_RDWR, DENY_WRITE,     A_0},
573 {0, O_WRONLY, DENY_WRITE,    O_RDONLY, DENY_WRITE,     A_0},
574 {0, O_WRONLY, DENY_WRITE,    O_WRONLY, DENY_WRITE,     A_0},
575 {0, O_WRONLY, DENY_WRITE,      O_RDWR,  DENY_READ,     A_0},
576 {0, O_WRONLY, DENY_WRITE,    O_RDONLY,  DENY_READ,     A_R},
577 {0, O_WRONLY, DENY_WRITE,    O_WRONLY,  DENY_READ,     A_0},
578 {0, O_WRONLY, DENY_WRITE,      O_RDWR,  DENY_NONE,     A_0},
579 {0, O_WRONLY, DENY_WRITE,    O_RDONLY,  DENY_NONE,     A_R},
580 {0, O_WRONLY, DENY_WRITE,    O_WRONLY,  DENY_NONE,     A_0},
581 {0, O_WRONLY, DENY_WRITE,      O_RDWR,   DENY_FCB,     A_0},
582 {0, O_WRONLY, DENY_WRITE,    O_RDONLY,   DENY_FCB,     A_0},
583 {0, O_WRONLY, DENY_WRITE,    O_WRONLY,   DENY_FCB,     A_0},
584 {0,   O_RDWR,  DENY_READ,      O_RDWR,   DENY_DOS,     A_0},
585 {0,   O_RDWR,  DENY_READ,    O_RDONLY,   DENY_DOS,     A_0},
586 {0,   O_RDWR,  DENY_READ,    O_WRONLY,   DENY_DOS,     A_0},
587 {0,   O_RDWR,  DENY_READ,      O_RDWR,   DENY_ALL,     A_0},
588 {0,   O_RDWR,  DENY_READ,    O_RDONLY,   DENY_ALL,     A_0},
589 {0,   O_RDWR,  DENY_READ,    O_WRONLY,   DENY_ALL,     A_0},
590 {0,   O_RDWR,  DENY_READ,      O_RDWR, DENY_WRITE,     A_0},
591 {0,   O_RDWR,  DENY_READ,    O_RDONLY, DENY_WRITE,     A_0},
592 {0,   O_RDWR,  DENY_READ,    O_WRONLY, DENY_WRITE,     A_0},
593 {0,   O_RDWR,  DENY_READ,      O_RDWR,  DENY_READ,     A_0},
594 {0,   O_RDWR,  DENY_READ,    O_RDONLY,  DENY_READ,     A_0},
595 {0,   O_RDWR,  DENY_READ,    O_WRONLY,  DENY_READ,     A_0},
596 {0,   O_RDWR,  DENY_READ,      O_RDWR,  DENY_NONE,     A_0},
597 {0,   O_RDWR,  DENY_READ,    O_RDONLY,  DENY_NONE,     A_0},
598 {0,   O_RDWR,  DENY_READ,    O_WRONLY,  DENY_NONE,     A_W},
599 {0,   O_RDWR,  DENY_READ,      O_RDWR,   DENY_FCB,     A_0},
600 {0,   O_RDWR,  DENY_READ,    O_RDONLY,   DENY_FCB,     A_0},
601 {0,   O_RDWR,  DENY_READ,    O_WRONLY,   DENY_FCB,     A_0},
602 {0, O_RDONLY,  DENY_READ,      O_RDWR,   DENY_DOS,     A_0},
603 {0, O_RDONLY,  DENY_READ,    O_RDONLY,   DENY_DOS,     A_0},
604 {0, O_RDONLY,  DENY_READ,    O_WRONLY,   DENY_DOS,     A_0},
605 {0, O_RDONLY,  DENY_READ,      O_RDWR,   DENY_ALL,     A_0},
606 {0, O_RDONLY,  DENY_READ,    O_RDONLY,   DENY_ALL,     A_0},
607 {0, O_RDONLY,  DENY_READ,    O_WRONLY,   DENY_ALL,     A_0},
608 {0, O_RDONLY,  DENY_READ,      O_RDWR, DENY_WRITE,     A_0},
609 {0, O_RDONLY,  DENY_READ,    O_RDONLY, DENY_WRITE,     A_0},
610 {0, O_RDONLY,  DENY_READ,    O_WRONLY, DENY_WRITE,     A_W},
611 {0, O_RDONLY,  DENY_READ,      O_RDWR,  DENY_READ,     A_0},
612 {0, O_RDONLY,  DENY_READ,    O_RDONLY,  DENY_READ,     A_0},
613 {0, O_RDONLY,  DENY_READ,    O_WRONLY,  DENY_READ,     A_0},
614 {0, O_RDONLY,  DENY_READ,      O_RDWR,  DENY_NONE,     A_0},
615 {0, O_RDONLY,  DENY_READ,    O_RDONLY,  DENY_NONE,     A_0},
616 {0, O_RDONLY,  DENY_READ,    O_WRONLY,  DENY_NONE,     A_W},
617 {0, O_RDONLY,  DENY_READ,      O_RDWR,   DENY_FCB,     A_0},
618 {0, O_RDONLY,  DENY_READ,    O_RDONLY,   DENY_FCB,     A_0},
619 {0, O_RDONLY,  DENY_READ,    O_WRONLY,   DENY_FCB,     A_0},
620 {0, O_WRONLY,  DENY_READ,      O_RDWR,   DENY_DOS,     A_0},
621 {0, O_WRONLY,  DENY_READ,    O_RDONLY,   DENY_DOS,     A_0},
622 {0, O_WRONLY,  DENY_READ,    O_WRONLY,   DENY_DOS,     A_0},
623 {0, O_WRONLY,  DENY_READ,      O_RDWR,   DENY_ALL,     A_0},
624 {0, O_WRONLY,  DENY_READ,    O_RDONLY,   DENY_ALL,     A_0},
625 {0, O_WRONLY,  DENY_READ,    O_WRONLY,   DENY_ALL,     A_0},
626 {0, O_WRONLY,  DENY_READ,      O_RDWR, DENY_WRITE,     A_0},
627 {0, O_WRONLY,  DENY_READ,    O_RDONLY, DENY_WRITE,     A_0},
628 {0, O_WRONLY,  DENY_READ,    O_WRONLY, DENY_WRITE,     A_0},
629 {0, O_WRONLY,  DENY_READ,      O_RDWR,  DENY_READ,     A_0},
630 {0, O_WRONLY,  DENY_READ,    O_RDONLY,  DENY_READ,     A_0},
631 {0, O_WRONLY,  DENY_READ,    O_WRONLY,  DENY_READ,     A_W},
632 {0, O_WRONLY,  DENY_READ,      O_RDWR,  DENY_NONE,     A_0},
633 {0, O_WRONLY,  DENY_READ,    O_RDONLY,  DENY_NONE,     A_0},
634 {0, O_WRONLY,  DENY_READ,    O_WRONLY,  DENY_NONE,     A_W},
635 {0, O_WRONLY,  DENY_READ,      O_RDWR,   DENY_FCB,     A_0},
636 {0, O_WRONLY,  DENY_READ,    O_RDONLY,   DENY_FCB,     A_0},
637 {0, O_WRONLY,  DENY_READ,    O_WRONLY,   DENY_FCB,     A_0},
638 {0,   O_RDWR,  DENY_NONE,      O_RDWR,   DENY_DOS,     A_0},
639 {0,   O_RDWR,  DENY_NONE,    O_RDONLY,   DENY_DOS,     A_0},
640 {0,   O_RDWR,  DENY_NONE,    O_WRONLY,   DENY_DOS,     A_0},
641 {0,   O_RDWR,  DENY_NONE,      O_RDWR,   DENY_ALL,     A_0},
642 {0,   O_RDWR,  DENY_NONE,    O_RDONLY,   DENY_ALL,     A_0},
643 {0,   O_RDWR,  DENY_NONE,    O_WRONLY,   DENY_ALL,     A_0},
644 {0,   O_RDWR,  DENY_NONE,      O_RDWR, DENY_WRITE,     A_0},
645 {0,   O_RDWR,  DENY_NONE,    O_RDONLY, DENY_WRITE,     A_0},
646 {0,   O_RDWR,  DENY_NONE,    O_WRONLY, DENY_WRITE,     A_0},
647 {0,   O_RDWR,  DENY_NONE,      O_RDWR,  DENY_READ,     A_0},
648 {0,   O_RDWR,  DENY_NONE,    O_RDONLY,  DENY_READ,     A_0},
649 {0,   O_RDWR,  DENY_NONE,    O_WRONLY,  DENY_READ,     A_0},
650 {0,   O_RDWR,  DENY_NONE,      O_RDWR,  DENY_NONE,     A_RW},
651 {0,   O_RDWR,  DENY_NONE,    O_RDONLY,  DENY_NONE,     A_R},
652 {0,   O_RDWR,  DENY_NONE,    O_WRONLY,  DENY_NONE,     A_W},
653 {0,   O_RDWR,  DENY_NONE,      O_RDWR,   DENY_FCB,     A_0},
654 {0,   O_RDWR,  DENY_NONE,    O_RDONLY,   DENY_FCB,     A_0},
655 {0,   O_RDWR,  DENY_NONE,    O_WRONLY,   DENY_FCB,     A_0},
656 {0, O_RDONLY,  DENY_NONE,      O_RDWR,   DENY_DOS,     A_0},
657 {0, O_RDONLY,  DENY_NONE,    O_RDONLY,   DENY_DOS,     A_R},
658 {0, O_RDONLY,  DENY_NONE,    O_WRONLY,   DENY_DOS,     A_0},
659 {0, O_RDONLY,  DENY_NONE,      O_RDWR,   DENY_ALL,     A_0},
660 {0, O_RDONLY,  DENY_NONE,    O_RDONLY,   DENY_ALL,     A_0},
661 {0, O_RDONLY,  DENY_NONE,    O_WRONLY,   DENY_ALL,     A_0},
662 {0, O_RDONLY,  DENY_NONE,      O_RDWR, DENY_WRITE,     A_RW},
663 {0, O_RDONLY,  DENY_NONE,    O_RDONLY, DENY_WRITE,     A_R},
664 {0, O_RDONLY,  DENY_NONE,    O_WRONLY, DENY_WRITE,     A_W},
665 {0, O_RDONLY,  DENY_NONE,      O_RDWR,  DENY_READ,     A_0},
666 {0, O_RDONLY,  DENY_NONE,    O_RDONLY,  DENY_READ,     A_0},
667 {0, O_RDONLY,  DENY_NONE,    O_WRONLY,  DENY_READ,     A_0},
668 {0, O_RDONLY,  DENY_NONE,      O_RDWR,  DENY_NONE,     A_RW},
669 {0, O_RDONLY,  DENY_NONE,    O_RDONLY,  DENY_NONE,     A_R},
670 {0, O_RDONLY,  DENY_NONE,    O_WRONLY,  DENY_NONE,     A_W},
671 {0, O_RDONLY,  DENY_NONE,      O_RDWR,   DENY_FCB,     A_0},
672 {0, O_RDONLY,  DENY_NONE,    O_RDONLY,   DENY_FCB,     A_0},
673 {0, O_RDONLY,  DENY_NONE,    O_WRONLY,   DENY_FCB,     A_0},
674 {0, O_WRONLY,  DENY_NONE,      O_RDWR,   DENY_DOS,     A_0},
675 {0, O_WRONLY,  DENY_NONE,    O_RDONLY,   DENY_DOS,     A_0},
676 {0, O_WRONLY,  DENY_NONE,    O_WRONLY,   DENY_DOS,     A_0},
677 {0, O_WRONLY,  DENY_NONE,      O_RDWR,   DENY_ALL,     A_0},
678 {0, O_WRONLY,  DENY_NONE,    O_RDONLY,   DENY_ALL,     A_0},
679 {0, O_WRONLY,  DENY_NONE,    O_WRONLY,   DENY_ALL,     A_0},
680 {0, O_WRONLY,  DENY_NONE,      O_RDWR, DENY_WRITE,     A_0},
681 {0, O_WRONLY,  DENY_NONE,    O_RDONLY, DENY_WRITE,     A_0},
682 {0, O_WRONLY,  DENY_NONE,    O_WRONLY, DENY_WRITE,     A_0},
683 {0, O_WRONLY,  DENY_NONE,      O_RDWR,  DENY_READ,     A_RW},
684 {0, O_WRONLY,  DENY_NONE,    O_RDONLY,  DENY_READ,     A_R},
685 {0, O_WRONLY,  DENY_NONE,    O_WRONLY,  DENY_READ,     A_W},
686 {0, O_WRONLY,  DENY_NONE,      O_RDWR,  DENY_NONE,     A_RW},
687 {0, O_WRONLY,  DENY_NONE,    O_RDONLY,  DENY_NONE,     A_R},
688 {0, O_WRONLY,  DENY_NONE,    O_WRONLY,  DENY_NONE,     A_W},
689 {0, O_WRONLY,  DENY_NONE,      O_RDWR,   DENY_FCB,     A_0},
690 {0, O_WRONLY,  DENY_NONE,    O_RDONLY,   DENY_FCB,     A_0},
691 {0, O_WRONLY,  DENY_NONE,    O_WRONLY,   DENY_FCB,     A_0},
692 {0,   O_RDWR,   DENY_FCB,      O_RDWR,   DENY_DOS,     A_0},
693 {0,   O_RDWR,   DENY_FCB,    O_RDONLY,   DENY_DOS,     A_0},
694 {0,   O_RDWR,   DENY_FCB,    O_WRONLY,   DENY_DOS,     A_0},
695 {0,   O_RDWR,   DENY_FCB,      O_RDWR,   DENY_ALL,     A_0},
696 {0,   O_RDWR,   DENY_FCB,    O_RDONLY,   DENY_ALL,     A_0},
697 {0,   O_RDWR,   DENY_FCB,    O_WRONLY,   DENY_ALL,     A_0},
698 {0,   O_RDWR,   DENY_FCB,      O_RDWR, DENY_WRITE,     A_0},
699 {0,   O_RDWR,   DENY_FCB,    O_RDONLY, DENY_WRITE,     A_0},
700 {0,   O_RDWR,   DENY_FCB,    O_WRONLY, DENY_WRITE,     A_0},
701 {0,   O_RDWR,   DENY_FCB,      O_RDWR,  DENY_READ,     A_0},
702 {0,   O_RDWR,   DENY_FCB,    O_RDONLY,  DENY_READ,     A_0},
703 {0,   O_RDWR,   DENY_FCB,    O_WRONLY,  DENY_READ,     A_0},
704 {0,   O_RDWR,   DENY_FCB,      O_RDWR,  DENY_NONE,     A_0},
705 {0,   O_RDWR,   DENY_FCB,    O_RDONLY,  DENY_NONE,     A_0},
706 {0,   O_RDWR,   DENY_FCB,    O_WRONLY,  DENY_NONE,     A_0},
707 {0,   O_RDWR,   DENY_FCB,      O_RDWR,   DENY_FCB,     A_0},
708 {0,   O_RDWR,   DENY_FCB,    O_RDONLY,   DENY_FCB,     A_0},
709 {0,   O_RDWR,   DENY_FCB,    O_WRONLY,   DENY_FCB,     A_0},
710 {0, O_RDONLY,   DENY_FCB,      O_RDWR,   DENY_DOS,     A_0},
711 {0, O_RDONLY,   DENY_FCB,    O_RDONLY,   DENY_DOS,     A_0},
712 {0, O_RDONLY,   DENY_FCB,    O_WRONLY,   DENY_DOS,     A_0},
713 {0, O_RDONLY,   DENY_FCB,      O_RDWR,   DENY_ALL,     A_0},
714 {0, O_RDONLY,   DENY_FCB,    O_RDONLY,   DENY_ALL,     A_0},
715 {0, O_RDONLY,   DENY_FCB,    O_WRONLY,   DENY_ALL,     A_0},
716 {0, O_RDONLY,   DENY_FCB,      O_RDWR, DENY_WRITE,     A_0},
717 {0, O_RDONLY,   DENY_FCB,    O_RDONLY, DENY_WRITE,     A_0},
718 {0, O_RDONLY,   DENY_FCB,    O_WRONLY, DENY_WRITE,     A_0},
719 {0, O_RDONLY,   DENY_FCB,      O_RDWR,  DENY_READ,     A_0},
720 {0, O_RDONLY,   DENY_FCB,    O_RDONLY,  DENY_READ,     A_0},
721 {0, O_RDONLY,   DENY_FCB,    O_WRONLY,  DENY_READ,     A_0},
722 {0, O_RDONLY,   DENY_FCB,      O_RDWR,  DENY_NONE,     A_0},
723 {0, O_RDONLY,   DENY_FCB,    O_RDONLY,  DENY_NONE,     A_0},
724 {0, O_RDONLY,   DENY_FCB,    O_WRONLY,  DENY_NONE,     A_0},
725 {0, O_RDONLY,   DENY_FCB,      O_RDWR,   DENY_FCB,     A_0},
726 {0, O_RDONLY,   DENY_FCB,    O_RDONLY,   DENY_FCB,     A_0},
727 {0, O_RDONLY,   DENY_FCB,    O_WRONLY,   DENY_FCB,     A_0},
728 {0, O_WRONLY,   DENY_FCB,      O_RDWR,   DENY_DOS,     A_0},
729 {0, O_WRONLY,   DENY_FCB,    O_RDONLY,   DENY_DOS,     A_0},
730 {0, O_WRONLY,   DENY_FCB,    O_WRONLY,   DENY_DOS,     A_0},
731 {0, O_WRONLY,   DENY_FCB,      O_RDWR,   DENY_ALL,     A_0},
732 {0, O_WRONLY,   DENY_FCB,    O_RDONLY,   DENY_ALL,     A_0},
733 {0, O_WRONLY,   DENY_FCB,    O_WRONLY,   DENY_ALL,     A_0},
734 {0, O_WRONLY,   DENY_FCB,      O_RDWR, DENY_WRITE,     A_0},
735 {0, O_WRONLY,   DENY_FCB,    O_RDONLY, DENY_WRITE,     A_0},
736 {0, O_WRONLY,   DENY_FCB,    O_WRONLY, DENY_WRITE,     A_0},
737 {0, O_WRONLY,   DENY_FCB,      O_RDWR,  DENY_READ,     A_0},
738 {0, O_WRONLY,   DENY_FCB,    O_RDONLY,  DENY_READ,     A_0},
739 {0, O_WRONLY,   DENY_FCB,    O_WRONLY,  DENY_READ,     A_0},
740 {0, O_WRONLY,   DENY_FCB,      O_RDWR,  DENY_NONE,     A_0},
741 {0, O_WRONLY,   DENY_FCB,    O_RDONLY,  DENY_NONE,     A_0},
742 {0, O_WRONLY,   DENY_FCB,    O_WRONLY,  DENY_NONE,     A_0},
743 {0, O_WRONLY,   DENY_FCB,      O_RDWR,   DENY_FCB,     A_0},
744 {0, O_WRONLY,   DENY_FCB,    O_RDONLY,   DENY_FCB,     A_0},
745 {0, O_WRONLY,   DENY_FCB,    O_WRONLY,   DENY_FCB,     A_0}
746 };
747
748
749 static const struct {
750         int isexe;
751         int mode1, deny1;
752         int mode2, deny2;
753         enum deny_result result;
754 } denytable1[] = {
755 {1,   O_RDWR,   DENY_DOS,      O_RDWR,   DENY_DOS,     A_RW},
756 {1,   O_RDWR,   DENY_DOS,    O_RDONLY,   DENY_DOS,     A_R},
757 {1,   O_RDWR,   DENY_DOS,    O_WRONLY,   DENY_DOS,     A_W},
758 {1,   O_RDWR,   DENY_DOS,      O_RDWR,   DENY_ALL,     A_0},
759 {1,   O_RDWR,   DENY_DOS,    O_RDONLY,   DENY_ALL,     A_0},
760 {1,   O_RDWR,   DENY_DOS,    O_WRONLY,   DENY_ALL,     A_0},
761 {1,   O_RDWR,   DENY_DOS,      O_RDWR, DENY_WRITE,     A_0},
762 {1,   O_RDWR,   DENY_DOS,    O_RDONLY, DENY_WRITE,     A_0},
763 {1,   O_RDWR,   DENY_DOS,    O_WRONLY, DENY_WRITE,     A_0},
764 {1,   O_RDWR,   DENY_DOS,      O_RDWR,  DENY_READ,     A_0},
765 {1,   O_RDWR,   DENY_DOS,    O_RDONLY,  DENY_READ,     A_0},
766 {1,   O_RDWR,   DENY_DOS,    O_WRONLY,  DENY_READ,     A_0},
767 {1,   O_RDWR,   DENY_DOS,      O_RDWR,  DENY_NONE,     A_RW},
768 {1,   O_RDWR,   DENY_DOS,    O_RDONLY,  DENY_NONE,     A_R},
769 {1,   O_RDWR,   DENY_DOS,    O_WRONLY,  DENY_NONE,     A_W},
770 {1,   O_RDWR,   DENY_DOS,      O_RDWR,   DENY_FCB,     A_0},
771 {1,   O_RDWR,   DENY_DOS,    O_RDONLY,   DENY_FCB,     A_0},
772 {1,   O_RDWR,   DENY_DOS,    O_WRONLY,   DENY_FCB,     A_0},
773 {1, O_RDONLY,   DENY_DOS,      O_RDWR,   DENY_DOS,     A_RW},
774 {1, O_RDONLY,   DENY_DOS,    O_RDONLY,   DENY_DOS,     A_R},
775 {1, O_RDONLY,   DENY_DOS,    O_WRONLY,   DENY_DOS,     A_W},
776 {1, O_RDONLY,   DENY_DOS,      O_RDWR,   DENY_ALL,     A_0},
777 {1, O_RDONLY,   DENY_DOS,    O_RDONLY,   DENY_ALL,     A_0},
778 {1, O_RDONLY,   DENY_DOS,    O_WRONLY,   DENY_ALL,     A_0},
779 {1, O_RDONLY,   DENY_DOS,      O_RDWR, DENY_WRITE,     A_RW},
780 {1, O_RDONLY,   DENY_DOS,    O_RDONLY, DENY_WRITE,     A_R},
781 {1, O_RDONLY,   DENY_DOS,    O_WRONLY, DENY_WRITE,     A_W},
782 {1, O_RDONLY,   DENY_DOS,      O_RDWR,  DENY_READ,     A_0},
783 {1, O_RDONLY,   DENY_DOS,    O_RDONLY,  DENY_READ,     A_0},
784 {1, O_RDONLY,   DENY_DOS,    O_WRONLY,  DENY_READ,     A_0},
785 {1, O_RDONLY,   DENY_DOS,      O_RDWR,  DENY_NONE,     A_RW},
786 {1, O_RDONLY,   DENY_DOS,    O_RDONLY,  DENY_NONE,     A_R},
787 {1, O_RDONLY,   DENY_DOS,    O_WRONLY,  DENY_NONE,     A_W},
788 {1, O_RDONLY,   DENY_DOS,      O_RDWR,   DENY_FCB,     A_0},
789 {1, O_RDONLY,   DENY_DOS,    O_RDONLY,   DENY_FCB,     A_0},
790 {1, O_RDONLY,   DENY_DOS,    O_WRONLY,   DENY_FCB,     A_0},
791 {1, O_WRONLY,   DENY_DOS,      O_RDWR,   DENY_DOS,     A_RW},
792 {1, O_WRONLY,   DENY_DOS,    O_RDONLY,   DENY_DOS,     A_R},
793 {1, O_WRONLY,   DENY_DOS,    O_WRONLY,   DENY_DOS,     A_W},
794 {1, O_WRONLY,   DENY_DOS,      O_RDWR,   DENY_ALL,     A_0},
795 {1, O_WRONLY,   DENY_DOS,    O_RDONLY,   DENY_ALL,     A_0},
796 {1, O_WRONLY,   DENY_DOS,    O_WRONLY,   DENY_ALL,     A_0},
797 {1, O_WRONLY,   DENY_DOS,      O_RDWR, DENY_WRITE,     A_0},
798 {1, O_WRONLY,   DENY_DOS,    O_RDONLY, DENY_WRITE,     A_0},
799 {1, O_WRONLY,   DENY_DOS,    O_WRONLY, DENY_WRITE,     A_0},
800 {1, O_WRONLY,   DENY_DOS,      O_RDWR,  DENY_READ,     A_RW},
801 {1, O_WRONLY,   DENY_DOS,    O_RDONLY,  DENY_READ,     A_R},
802 {1, O_WRONLY,   DENY_DOS,    O_WRONLY,  DENY_READ,     A_W},
803 {1, O_WRONLY,   DENY_DOS,      O_RDWR,  DENY_NONE,     A_RW},
804 {1, O_WRONLY,   DENY_DOS,    O_RDONLY,  DENY_NONE,     A_R},
805 {1, O_WRONLY,   DENY_DOS,    O_WRONLY,  DENY_NONE,     A_W},
806 {1, O_WRONLY,   DENY_DOS,      O_RDWR,   DENY_FCB,     A_0},
807 {1, O_WRONLY,   DENY_DOS,    O_RDONLY,   DENY_FCB,     A_0},
808 {1, O_WRONLY,   DENY_DOS,    O_WRONLY,   DENY_FCB,     A_0},
809 {1,   O_RDWR,   DENY_ALL,      O_RDWR,   DENY_DOS,     A_0},
810 {1,   O_RDWR,   DENY_ALL,    O_RDONLY,   DENY_DOS,     A_0},
811 {1,   O_RDWR,   DENY_ALL,    O_WRONLY,   DENY_DOS,     A_0},
812 {1,   O_RDWR,   DENY_ALL,      O_RDWR,   DENY_ALL,     A_0},
813 {1,   O_RDWR,   DENY_ALL,    O_RDONLY,   DENY_ALL,     A_0},
814 {1,   O_RDWR,   DENY_ALL,    O_WRONLY,   DENY_ALL,     A_0},
815 {1,   O_RDWR,   DENY_ALL,      O_RDWR, DENY_WRITE,     A_0},
816 {1,   O_RDWR,   DENY_ALL,    O_RDONLY, DENY_WRITE,     A_0},
817 {1,   O_RDWR,   DENY_ALL,    O_WRONLY, DENY_WRITE,     A_0},
818 {1,   O_RDWR,   DENY_ALL,      O_RDWR,  DENY_READ,     A_0},
819 {1,   O_RDWR,   DENY_ALL,    O_RDONLY,  DENY_READ,     A_0},
820 {1,   O_RDWR,   DENY_ALL,    O_WRONLY,  DENY_READ,     A_0},
821 {1,   O_RDWR,   DENY_ALL,      O_RDWR,  DENY_NONE,     A_0},
822 {1,   O_RDWR,   DENY_ALL,    O_RDONLY,  DENY_NONE,     A_0},
823 {1,   O_RDWR,   DENY_ALL,    O_WRONLY,  DENY_NONE,     A_0},
824 {1,   O_RDWR,   DENY_ALL,      O_RDWR,   DENY_FCB,     A_0},
825 {1,   O_RDWR,   DENY_ALL,    O_RDONLY,   DENY_FCB,     A_0},
826 {1,   O_RDWR,   DENY_ALL,    O_WRONLY,   DENY_FCB,     A_0},
827 {1, O_RDONLY,   DENY_ALL,      O_RDWR,   DENY_DOS,     A_0},
828 {1, O_RDONLY,   DENY_ALL,    O_RDONLY,   DENY_DOS,     A_0},
829 {1, O_RDONLY,   DENY_ALL,    O_WRONLY,   DENY_DOS,     A_0},
830 {1, O_RDONLY,   DENY_ALL,      O_RDWR,   DENY_ALL,     A_0},
831 {1, O_RDONLY,   DENY_ALL,    O_RDONLY,   DENY_ALL,     A_0},
832 {1, O_RDONLY,   DENY_ALL,    O_WRONLY,   DENY_ALL,     A_0},
833 {1, O_RDONLY,   DENY_ALL,      O_RDWR, DENY_WRITE,     A_0},
834 {1, O_RDONLY,   DENY_ALL,    O_RDONLY, DENY_WRITE,     A_0},
835 {1, O_RDONLY,   DENY_ALL,    O_WRONLY, DENY_WRITE,     A_0},
836 {1, O_RDONLY,   DENY_ALL,      O_RDWR,  DENY_READ,     A_0},
837 {1, O_RDONLY,   DENY_ALL,    O_RDONLY,  DENY_READ,     A_0},
838 {1, O_RDONLY,   DENY_ALL,    O_WRONLY,  DENY_READ,     A_0},
839 {1, O_RDONLY,   DENY_ALL,      O_RDWR,  DENY_NONE,     A_0},
840 {1, O_RDONLY,   DENY_ALL,    O_RDONLY,  DENY_NONE,     A_0},
841 {1, O_RDONLY,   DENY_ALL,    O_WRONLY,  DENY_NONE,     A_0},
842 {1, O_RDONLY,   DENY_ALL,      O_RDWR,   DENY_FCB,     A_0},
843 {1, O_RDONLY,   DENY_ALL,    O_RDONLY,   DENY_FCB,     A_0},
844 {1, O_RDONLY,   DENY_ALL,    O_WRONLY,   DENY_FCB,     A_0},
845 {1, O_WRONLY,   DENY_ALL,      O_RDWR,   DENY_DOS,     A_0},
846 {1, O_WRONLY,   DENY_ALL,    O_RDONLY,   DENY_DOS,     A_0},
847 {1, O_WRONLY,   DENY_ALL,    O_WRONLY,   DENY_DOS,     A_0},
848 {1, O_WRONLY,   DENY_ALL,      O_RDWR,   DENY_ALL,     A_0},
849 {1, O_WRONLY,   DENY_ALL,    O_RDONLY,   DENY_ALL,     A_0},
850 {1, O_WRONLY,   DENY_ALL,    O_WRONLY,   DENY_ALL,     A_0},
851 {1, O_WRONLY,   DENY_ALL,      O_RDWR, DENY_WRITE,     A_0},
852 {1, O_WRONLY,   DENY_ALL,    O_RDONLY, DENY_WRITE,     A_0},
853 {1, O_WRONLY,   DENY_ALL,    O_WRONLY, DENY_WRITE,     A_0},
854 {1, O_WRONLY,   DENY_ALL,      O_RDWR,  DENY_READ,     A_0},
855 {1, O_WRONLY,   DENY_ALL,    O_RDONLY,  DENY_READ,     A_0},
856 {1, O_WRONLY,   DENY_ALL,    O_WRONLY,  DENY_READ,     A_0},
857 {1, O_WRONLY,   DENY_ALL,      O_RDWR,  DENY_NONE,     A_0},
858 {1, O_WRONLY,   DENY_ALL,    O_RDONLY,  DENY_NONE,     A_0},
859 {1, O_WRONLY,   DENY_ALL,    O_WRONLY,  DENY_NONE,     A_0},
860 {1, O_WRONLY,   DENY_ALL,      O_RDWR,   DENY_FCB,     A_0},
861 {1, O_WRONLY,   DENY_ALL,    O_RDONLY,   DENY_FCB,     A_0},
862 {1, O_WRONLY,   DENY_ALL,    O_WRONLY,   DENY_FCB,     A_0},
863 {1,   O_RDWR, DENY_WRITE,      O_RDWR,   DENY_DOS,     A_0},
864 {1,   O_RDWR, DENY_WRITE,    O_RDONLY,   DENY_DOS,     A_R},
865 {1,   O_RDWR, DENY_WRITE,    O_WRONLY,   DENY_DOS,     A_0},
866 {1,   O_RDWR, DENY_WRITE,      O_RDWR,   DENY_ALL,     A_0},
867 {1,   O_RDWR, DENY_WRITE,    O_RDONLY,   DENY_ALL,     A_0},
868 {1,   O_RDWR, DENY_WRITE,    O_WRONLY,   DENY_ALL,     A_0},
869 {1,   O_RDWR, DENY_WRITE,      O_RDWR, DENY_WRITE,     A_0},
870 {1,   O_RDWR, DENY_WRITE,    O_RDONLY, DENY_WRITE,     A_0},
871 {1,   O_RDWR, DENY_WRITE,    O_WRONLY, DENY_WRITE,     A_0},
872 {1,   O_RDWR, DENY_WRITE,      O_RDWR,  DENY_READ,     A_0},
873 {1,   O_RDWR, DENY_WRITE,    O_RDONLY,  DENY_READ,     A_0},
874 {1,   O_RDWR, DENY_WRITE,    O_WRONLY,  DENY_READ,     A_0},
875 {1,   O_RDWR, DENY_WRITE,      O_RDWR,  DENY_NONE,     A_0},
876 {1,   O_RDWR, DENY_WRITE,    O_RDONLY,  DENY_NONE,     A_R},
877 {1,   O_RDWR, DENY_WRITE,    O_WRONLY,  DENY_NONE,     A_0},
878 {1,   O_RDWR, DENY_WRITE,      O_RDWR,   DENY_FCB,     A_0},
879 {1,   O_RDWR, DENY_WRITE,    O_RDONLY,   DENY_FCB,     A_0},
880 {1,   O_RDWR, DENY_WRITE,    O_WRONLY,   DENY_FCB,     A_0},
881 {1, O_RDONLY, DENY_WRITE,      O_RDWR,   DENY_DOS,     A_0},
882 {1, O_RDONLY, DENY_WRITE,    O_RDONLY,   DENY_DOS,     A_R},
883 {1, O_RDONLY, DENY_WRITE,    O_WRONLY,   DENY_DOS,     A_0},
884 {1, O_RDONLY, DENY_WRITE,      O_RDWR,   DENY_ALL,     A_0},
885 {1, O_RDONLY, DENY_WRITE,    O_RDONLY,   DENY_ALL,     A_0},
886 {1, O_RDONLY, DENY_WRITE,    O_WRONLY,   DENY_ALL,     A_0},
887 {1, O_RDONLY, DENY_WRITE,      O_RDWR, DENY_WRITE,     A_0},
888 {1, O_RDONLY, DENY_WRITE,    O_RDONLY, DENY_WRITE,     A_R},
889 {1, O_RDONLY, DENY_WRITE,    O_WRONLY, DENY_WRITE,     A_0},
890 {1, O_RDONLY, DENY_WRITE,      O_RDWR,  DENY_READ,     A_0},
891 {1, O_RDONLY, DENY_WRITE,    O_RDONLY,  DENY_READ,     A_0},
892 {1, O_RDONLY, DENY_WRITE,    O_WRONLY,  DENY_READ,     A_0},
893 {1, O_RDONLY, DENY_WRITE,      O_RDWR,  DENY_NONE,     A_0},
894 {1, O_RDONLY, DENY_WRITE,    O_RDONLY,  DENY_NONE,     A_R},
895 {1, O_RDONLY, DENY_WRITE,    O_WRONLY,  DENY_NONE,     A_0},
896 {1, O_RDONLY, DENY_WRITE,      O_RDWR,   DENY_FCB,     A_0},
897 {1, O_RDONLY, DENY_WRITE,    O_RDONLY,   DENY_FCB,     A_0},
898 {1, O_RDONLY, DENY_WRITE,    O_WRONLY,   DENY_FCB,     A_0},
899 {1, O_WRONLY, DENY_WRITE,      O_RDWR,   DENY_DOS,     A_0},
900 {1, O_WRONLY, DENY_WRITE,    O_RDONLY,   DENY_DOS,     A_R},
901 {1, O_WRONLY, DENY_WRITE,    O_WRONLY,   DENY_DOS,     A_0},
902 {1, O_WRONLY, DENY_WRITE,      O_RDWR,   DENY_ALL,     A_0},
903 {1, O_WRONLY, DENY_WRITE,    O_RDONLY,   DENY_ALL,     A_0},
904 {1, O_WRONLY, DENY_WRITE,    O_WRONLY,   DENY_ALL,     A_0},
905 {1, O_WRONLY, DENY_WRITE,      O_RDWR, DENY_WRITE,     A_0},
906 {1, O_WRONLY, DENY_WRITE,    O_RDONLY, DENY_WRITE,     A_0},
907 {1, O_WRONLY, DENY_WRITE,    O_WRONLY, DENY_WRITE,     A_0},
908 {1, O_WRONLY, DENY_WRITE,      O_RDWR,  DENY_READ,     A_0},
909 {1, O_WRONLY, DENY_WRITE,    O_RDONLY,  DENY_READ,     A_R},
910 {1, O_WRONLY, DENY_WRITE,    O_WRONLY,  DENY_READ,     A_0},
911 {1, O_WRONLY, DENY_WRITE,      O_RDWR,  DENY_NONE,     A_0},
912 {1, O_WRONLY, DENY_WRITE,    O_RDONLY,  DENY_NONE,     A_R},
913 {1, O_WRONLY, DENY_WRITE,    O_WRONLY,  DENY_NONE,     A_0},
914 {1, O_WRONLY, DENY_WRITE,      O_RDWR,   DENY_FCB,     A_0},
915 {1, O_WRONLY, DENY_WRITE,    O_RDONLY,   DENY_FCB,     A_0},
916 {1, O_WRONLY, DENY_WRITE,    O_WRONLY,   DENY_FCB,     A_0},
917 {1,   O_RDWR,  DENY_READ,      O_RDWR,   DENY_DOS,     A_0},
918 {1,   O_RDWR,  DENY_READ,    O_RDONLY,   DENY_DOS,     A_0},
919 {1,   O_RDWR,  DENY_READ,    O_WRONLY,   DENY_DOS,     A_W},
920 {1,   O_RDWR,  DENY_READ,      O_RDWR,   DENY_ALL,     A_0},
921 {1,   O_RDWR,  DENY_READ,    O_RDONLY,   DENY_ALL,     A_0},
922 {1,   O_RDWR,  DENY_READ,    O_WRONLY,   DENY_ALL,     A_0},
923 {1,   O_RDWR,  DENY_READ,      O_RDWR, DENY_WRITE,     A_0},
924 {1,   O_RDWR,  DENY_READ,    O_RDONLY, DENY_WRITE,     A_0},
925 {1,   O_RDWR,  DENY_READ,    O_WRONLY, DENY_WRITE,     A_0},
926 {1,   O_RDWR,  DENY_READ,      O_RDWR,  DENY_READ,     A_0},
927 {1,   O_RDWR,  DENY_READ,    O_RDONLY,  DENY_READ,     A_0},
928 {1,   O_RDWR,  DENY_READ,    O_WRONLY,  DENY_READ,     A_0},
929 {1,   O_RDWR,  DENY_READ,      O_RDWR,  DENY_NONE,     A_0},
930 {1,   O_RDWR,  DENY_READ,    O_RDONLY,  DENY_NONE,     A_0},
931 {1,   O_RDWR,  DENY_READ,    O_WRONLY,  DENY_NONE,     A_W},
932 {1,   O_RDWR,  DENY_READ,      O_RDWR,   DENY_FCB,     A_0},
933 {1,   O_RDWR,  DENY_READ,    O_RDONLY,   DENY_FCB,     A_0},
934 {1,   O_RDWR,  DENY_READ,    O_WRONLY,   DENY_FCB,     A_0},
935 {1, O_RDONLY,  DENY_READ,      O_RDWR,   DENY_DOS,     A_0},
936 {1, O_RDONLY,  DENY_READ,    O_RDONLY,   DENY_DOS,     A_0},
937 {1, O_RDONLY,  DENY_READ,    O_WRONLY,   DENY_DOS,     A_W},
938 {1, O_RDONLY,  DENY_READ,      O_RDWR,   DENY_ALL,     A_0},
939 {1, O_RDONLY,  DENY_READ,    O_RDONLY,   DENY_ALL,     A_0},
940 {1, O_RDONLY,  DENY_READ,    O_WRONLY,   DENY_ALL,     A_0},
941 {1, O_RDONLY,  DENY_READ,      O_RDWR, DENY_WRITE,     A_0},
942 {1, O_RDONLY,  DENY_READ,    O_RDONLY, DENY_WRITE,     A_0},
943 {1, O_RDONLY,  DENY_READ,    O_WRONLY, DENY_WRITE,     A_W},
944 {1, O_RDONLY,  DENY_READ,      O_RDWR,  DENY_READ,     A_0},
945 {1, O_RDONLY,  DENY_READ,    O_RDONLY,  DENY_READ,     A_0},
946 {1, O_RDONLY,  DENY_READ,    O_WRONLY,  DENY_READ,     A_0},
947 {1, O_RDONLY,  DENY_READ,      O_RDWR,  DENY_NONE,     A_0},
948 {1, O_RDONLY,  DENY_READ,    O_RDONLY,  DENY_NONE,     A_0},
949 {1, O_RDONLY,  DENY_READ,    O_WRONLY,  DENY_NONE,     A_W},
950 {1, O_RDONLY,  DENY_READ,      O_RDWR,   DENY_FCB,     A_0},
951 {1, O_RDONLY,  DENY_READ,    O_RDONLY,   DENY_FCB,     A_0},
952 {1, O_RDONLY,  DENY_READ,    O_WRONLY,   DENY_FCB,     A_0},
953 {1, O_WRONLY,  DENY_READ,      O_RDWR,   DENY_DOS,     A_0},
954 {1, O_WRONLY,  DENY_READ,    O_RDONLY,   DENY_DOS,     A_0},
955 {1, O_WRONLY,  DENY_READ,    O_WRONLY,   DENY_DOS,     A_W},
956 {1, O_WRONLY,  DENY_READ,      O_RDWR,   DENY_ALL,     A_0},
957 {1, O_WRONLY,  DENY_READ,    O_RDONLY,   DENY_ALL,     A_0},
958 {1, O_WRONLY,  DENY_READ,    O_WRONLY,   DENY_ALL,     A_0},
959 {1, O_WRONLY,  DENY_READ,      O_RDWR, DENY_WRITE,     A_0},
960 {1, O_WRONLY,  DENY_READ,    O_RDONLY, DENY_WRITE,     A_0},
961 {1, O_WRONLY,  DENY_READ,    O_WRONLY, DENY_WRITE,     A_0},
962 {1, O_WRONLY,  DENY_READ,      O_RDWR,  DENY_READ,     A_0},
963 {1, O_WRONLY,  DENY_READ,    O_RDONLY,  DENY_READ,     A_0},
964 {1, O_WRONLY,  DENY_READ,    O_WRONLY,  DENY_READ,     A_W},
965 {1, O_WRONLY,  DENY_READ,      O_RDWR,  DENY_NONE,     A_0},
966 {1, O_WRONLY,  DENY_READ,    O_RDONLY,  DENY_NONE,     A_0},
967 {1, O_WRONLY,  DENY_READ,    O_WRONLY,  DENY_NONE,     A_W},
968 {1, O_WRONLY,  DENY_READ,      O_RDWR,   DENY_FCB,     A_0},
969 {1, O_WRONLY,  DENY_READ,    O_RDONLY,   DENY_FCB,     A_0},
970 {1, O_WRONLY,  DENY_READ,    O_WRONLY,   DENY_FCB,     A_0},
971 {1,   O_RDWR,  DENY_NONE,      O_RDWR,   DENY_DOS,     A_RW},
972 {1,   O_RDWR,  DENY_NONE,    O_RDONLY,   DENY_DOS,     A_R},
973 {1,   O_RDWR,  DENY_NONE,    O_WRONLY,   DENY_DOS,     A_W},
974 {1,   O_RDWR,  DENY_NONE,      O_RDWR,   DENY_ALL,     A_0},
975 {1,   O_RDWR,  DENY_NONE,    O_RDONLY,   DENY_ALL,     A_0},
976 {1,   O_RDWR,  DENY_NONE,    O_WRONLY,   DENY_ALL,     A_0},
977 {1,   O_RDWR,  DENY_NONE,      O_RDWR, DENY_WRITE,     A_0},
978 {1,   O_RDWR,  DENY_NONE,    O_RDONLY, DENY_WRITE,     A_0},
979 {1,   O_RDWR,  DENY_NONE,    O_WRONLY, DENY_WRITE,     A_0},
980 {1,   O_RDWR,  DENY_NONE,      O_RDWR,  DENY_READ,     A_0},
981 {1,   O_RDWR,  DENY_NONE,    O_RDONLY,  DENY_READ,     A_0},
982 {1,   O_RDWR,  DENY_NONE,    O_WRONLY,  DENY_READ,     A_0},
983 {1,   O_RDWR,  DENY_NONE,      O_RDWR,  DENY_NONE,     A_RW},
984 {1,   O_RDWR,  DENY_NONE,    O_RDONLY,  DENY_NONE,     A_R},
985 {1,   O_RDWR,  DENY_NONE,    O_WRONLY,  DENY_NONE,     A_W},
986 {1,   O_RDWR,  DENY_NONE,      O_RDWR,   DENY_FCB,     A_0},
987 {1,   O_RDWR,  DENY_NONE,    O_RDONLY,   DENY_FCB,     A_0},
988 {1,   O_RDWR,  DENY_NONE,    O_WRONLY,   DENY_FCB,     A_0},
989 {1, O_RDONLY,  DENY_NONE,      O_RDWR,   DENY_DOS,     A_RW},
990 {1, O_RDONLY,  DENY_NONE,    O_RDONLY,   DENY_DOS,     A_R},
991 {1, O_RDONLY,  DENY_NONE,    O_WRONLY,   DENY_DOS,     A_W},
992 {1, O_RDONLY,  DENY_NONE,      O_RDWR,   DENY_ALL,     A_0},
993 {1, O_RDONLY,  DENY_NONE,    O_RDONLY,   DENY_ALL,     A_0},
994 {1, O_RDONLY,  DENY_NONE,    O_WRONLY,   DENY_ALL,     A_0},
995 {1, O_RDONLY,  DENY_NONE,      O_RDWR, DENY_WRITE,     A_RW},
996 {1, O_RDONLY,  DENY_NONE,    O_RDONLY, DENY_WRITE,     A_R},
997 {1, O_RDONLY,  DENY_NONE,    O_WRONLY, DENY_WRITE,     A_W},
998 {1, O_RDONLY,  DENY_NONE,      O_RDWR,  DENY_READ,     A_0},
999 {1, O_RDONLY,  DENY_NONE,    O_RDONLY,  DENY_READ,     A_0},
1000 {1, O_RDONLY,  DENY_NONE,    O_WRONLY,  DENY_READ,     A_0},
1001 {1, O_RDONLY,  DENY_NONE,      O_RDWR,  DENY_NONE,     A_RW},
1002 {1, O_RDONLY,  DENY_NONE,    O_RDONLY,  DENY_NONE,     A_R},
1003 {1, O_RDONLY,  DENY_NONE,    O_WRONLY,  DENY_NONE,     A_W},
1004 {1, O_RDONLY,  DENY_NONE,      O_RDWR,   DENY_FCB,     A_0},
1005 {1, O_RDONLY,  DENY_NONE,    O_RDONLY,   DENY_FCB,     A_0},
1006 {1, O_RDONLY,  DENY_NONE,    O_WRONLY,   DENY_FCB,     A_0},
1007 {1, O_WRONLY,  DENY_NONE,      O_RDWR,   DENY_DOS,     A_RW},
1008 {1, O_WRONLY,  DENY_NONE,    O_RDONLY,   DENY_DOS,     A_R},
1009 {1, O_WRONLY,  DENY_NONE,    O_WRONLY,   DENY_DOS,     A_W},
1010 {1, O_WRONLY,  DENY_NONE,      O_RDWR,   DENY_ALL,     A_0},
1011 {1, O_WRONLY,  DENY_NONE,    O_RDONLY,   DENY_ALL,     A_0},
1012 {1, O_WRONLY,  DENY_NONE,    O_WRONLY,   DENY_ALL,     A_0},
1013 {1, O_WRONLY,  DENY_NONE,      O_RDWR, DENY_WRITE,     A_0},
1014 {1, O_WRONLY,  DENY_NONE,    O_RDONLY, DENY_WRITE,     A_0},
1015 {1, O_WRONLY,  DENY_NONE,    O_WRONLY, DENY_WRITE,     A_0},
1016 {1, O_WRONLY,  DENY_NONE,      O_RDWR,  DENY_READ,     A_RW},
1017 {1, O_WRONLY,  DENY_NONE,    O_RDONLY,  DENY_READ,     A_R},
1018 {1, O_WRONLY,  DENY_NONE,    O_WRONLY,  DENY_READ,     A_W},
1019 {1, O_WRONLY,  DENY_NONE,      O_RDWR,  DENY_NONE,     A_RW},
1020 {1, O_WRONLY,  DENY_NONE,    O_RDONLY,  DENY_NONE,     A_R},
1021 {1, O_WRONLY,  DENY_NONE,    O_WRONLY,  DENY_NONE,     A_W},
1022 {1, O_WRONLY,  DENY_NONE,      O_RDWR,   DENY_FCB,     A_0},
1023 {1, O_WRONLY,  DENY_NONE,    O_RDONLY,   DENY_FCB,     A_0},
1024 {1, O_WRONLY,  DENY_NONE,    O_WRONLY,   DENY_FCB,     A_0},
1025 {1,   O_RDWR,   DENY_FCB,      O_RDWR,   DENY_DOS,     A_RW},
1026 {1,   O_RDWR,   DENY_FCB,    O_RDONLY,   DENY_DOS,     A_R},
1027 {1,   O_RDWR,   DENY_FCB,    O_WRONLY,   DENY_DOS,     A_W},
1028 {1,   O_RDWR,   DENY_FCB,      O_RDWR,   DENY_ALL,     A_0},
1029 {1,   O_RDWR,   DENY_FCB,    O_RDONLY,   DENY_ALL,     A_0},
1030 {1,   O_RDWR,   DENY_FCB,    O_WRONLY,   DENY_ALL,     A_0},
1031 {1,   O_RDWR,   DENY_FCB,      O_RDWR, DENY_WRITE,     A_0},
1032 {1,   O_RDWR,   DENY_FCB,    O_RDONLY, DENY_WRITE,     A_0},
1033 {1,   O_RDWR,   DENY_FCB,    O_WRONLY, DENY_WRITE,     A_0},
1034 {1,   O_RDWR,   DENY_FCB,      O_RDWR,  DENY_READ,     A_0},
1035 {1,   O_RDWR,   DENY_FCB,    O_RDONLY,  DENY_READ,     A_0},
1036 {1,   O_RDWR,   DENY_FCB,    O_WRONLY,  DENY_READ,     A_0},
1037 {1,   O_RDWR,   DENY_FCB,      O_RDWR,  DENY_NONE,     A_0},
1038 {1,   O_RDWR,   DENY_FCB,    O_RDONLY,  DENY_NONE,     A_0},
1039 {1,   O_RDWR,   DENY_FCB,    O_WRONLY,  DENY_NONE,     A_0},
1040 {1,   O_RDWR,   DENY_FCB,      O_RDWR,   DENY_FCB,     A_RW},
1041 {1,   O_RDWR,   DENY_FCB,    O_RDONLY,   DENY_FCB,     A_RW},
1042 {1,   O_RDWR,   DENY_FCB,    O_WRONLY,   DENY_FCB,     A_RW},
1043 {1, O_RDONLY,   DENY_FCB,      O_RDWR,   DENY_DOS,     A_RW},
1044 {1, O_RDONLY,   DENY_FCB,    O_RDONLY,   DENY_DOS,     A_R},
1045 {1, O_RDONLY,   DENY_FCB,    O_WRONLY,   DENY_DOS,     A_W},
1046 {1, O_RDONLY,   DENY_FCB,      O_RDWR,   DENY_ALL,     A_0},
1047 {1, O_RDONLY,   DENY_FCB,    O_RDONLY,   DENY_ALL,     A_0},
1048 {1, O_RDONLY,   DENY_FCB,    O_WRONLY,   DENY_ALL,     A_0},
1049 {1, O_RDONLY,   DENY_FCB,      O_RDWR, DENY_WRITE,     A_0},
1050 {1, O_RDONLY,   DENY_FCB,    O_RDONLY, DENY_WRITE,     A_0},
1051 {1, O_RDONLY,   DENY_FCB,    O_WRONLY, DENY_WRITE,     A_0},
1052 {1, O_RDONLY,   DENY_FCB,      O_RDWR,  DENY_READ,     A_0},
1053 {1, O_RDONLY,   DENY_FCB,    O_RDONLY,  DENY_READ,     A_0},
1054 {1, O_RDONLY,   DENY_FCB,    O_WRONLY,  DENY_READ,     A_0},
1055 {1, O_RDONLY,   DENY_FCB,      O_RDWR,  DENY_NONE,     A_0},
1056 {1, O_RDONLY,   DENY_FCB,    O_RDONLY,  DENY_NONE,     A_0},
1057 {1, O_RDONLY,   DENY_FCB,    O_WRONLY,  DENY_NONE,     A_0},
1058 {1, O_RDONLY,   DENY_FCB,      O_RDWR,   DENY_FCB,     A_RW},
1059 {1, O_RDONLY,   DENY_FCB,    O_RDONLY,   DENY_FCB,     A_RW},
1060 {1, O_RDONLY,   DENY_FCB,    O_WRONLY,   DENY_FCB,     A_RW},
1061 {1, O_WRONLY,   DENY_FCB,      O_RDWR,   DENY_DOS,     A_RW},
1062 {1, O_WRONLY,   DENY_FCB,    O_RDONLY,   DENY_DOS,     A_R},
1063 {1, O_WRONLY,   DENY_FCB,    O_WRONLY,   DENY_DOS,     A_W},
1064 {1, O_WRONLY,   DENY_FCB,      O_RDWR,   DENY_ALL,     A_0},
1065 {1, O_WRONLY,   DENY_FCB,    O_RDONLY,   DENY_ALL,     A_0},
1066 {1, O_WRONLY,   DENY_FCB,    O_WRONLY,   DENY_ALL,     A_0},
1067 {1, O_WRONLY,   DENY_FCB,      O_RDWR, DENY_WRITE,     A_0},
1068 {1, O_WRONLY,   DENY_FCB,    O_RDONLY, DENY_WRITE,     A_0},
1069 {1, O_WRONLY,   DENY_FCB,    O_WRONLY, DENY_WRITE,     A_0},
1070 {1, O_WRONLY,   DENY_FCB,      O_RDWR,  DENY_READ,     A_0},
1071 {1, O_WRONLY,   DENY_FCB,    O_RDONLY,  DENY_READ,     A_0},
1072 {1, O_WRONLY,   DENY_FCB,    O_WRONLY,  DENY_READ,     A_0},
1073 {1, O_WRONLY,   DENY_FCB,      O_RDWR,  DENY_NONE,     A_0},
1074 {1, O_WRONLY,   DENY_FCB,    O_RDONLY,  DENY_NONE,     A_0},
1075 {1, O_WRONLY,   DENY_FCB,    O_WRONLY,  DENY_NONE,     A_0},
1076 {1, O_WRONLY,   DENY_FCB,      O_RDWR,   DENY_FCB,     A_RW},
1077 {1, O_WRONLY,   DENY_FCB,    O_RDONLY,   DENY_FCB,     A_RW},
1078 {1, O_WRONLY,   DENY_FCB,    O_WRONLY,   DENY_FCB,     A_RW},
1079 {0,   O_RDWR,   DENY_DOS,      O_RDWR,   DENY_DOS,     A_RW},
1080 {0,   O_RDWR,   DENY_DOS,    O_RDONLY,   DENY_DOS,     A_R},
1081 {0,   O_RDWR,   DENY_DOS,    O_WRONLY,   DENY_DOS,     A_W},
1082 {0,   O_RDWR,   DENY_DOS,      O_RDWR,   DENY_ALL,     A_0},
1083 {0,   O_RDWR,   DENY_DOS,    O_RDONLY,   DENY_ALL,     A_0},
1084 {0,   O_RDWR,   DENY_DOS,    O_WRONLY,   DENY_ALL,     A_0},
1085 {0,   O_RDWR,   DENY_DOS,      O_RDWR, DENY_WRITE,     A_0},
1086 {0,   O_RDWR,   DENY_DOS,    O_RDONLY, DENY_WRITE,     A_0},
1087 {0,   O_RDWR,   DENY_DOS,    O_WRONLY, DENY_WRITE,     A_0},
1088 {0,   O_RDWR,   DENY_DOS,      O_RDWR,  DENY_READ,     A_0},
1089 {0,   O_RDWR,   DENY_DOS,    O_RDONLY,  DENY_READ,     A_0},
1090 {0,   O_RDWR,   DENY_DOS,    O_WRONLY,  DENY_READ,     A_0},
1091 {0,   O_RDWR,   DENY_DOS,      O_RDWR,  DENY_NONE,     A_0},
1092 {0,   O_RDWR,   DENY_DOS,    O_RDONLY,  DENY_NONE,     A_0},
1093 {0,   O_RDWR,   DENY_DOS,    O_WRONLY,  DENY_NONE,     A_0},
1094 {0,   O_RDWR,   DENY_DOS,      O_RDWR,   DENY_FCB,     A_RW},
1095 {0,   O_RDWR,   DENY_DOS,    O_RDONLY,   DENY_FCB,     A_RW},
1096 {0,   O_RDWR,   DENY_DOS,    O_WRONLY,   DENY_FCB,     A_RW},
1097 {0, O_RDONLY,   DENY_DOS,      O_RDWR,   DENY_DOS,     A_0},
1098 {0, O_RDONLY,   DENY_DOS,    O_RDONLY,   DENY_DOS,     A_R},
1099 {0, O_RDONLY,   DENY_DOS,    O_WRONLY,   DENY_DOS,     A_0},
1100 {0, O_RDONLY,   DENY_DOS,      O_RDWR,   DENY_ALL,     A_0},
1101 {0, O_RDONLY,   DENY_DOS,    O_RDONLY,   DENY_ALL,     A_0},
1102 {0, O_RDONLY,   DENY_DOS,    O_WRONLY,   DENY_ALL,     A_0},
1103 {0, O_RDONLY,   DENY_DOS,      O_RDWR, DENY_WRITE,     A_0},
1104 {0, O_RDONLY,   DENY_DOS,    O_RDONLY, DENY_WRITE,     A_R},
1105 {0, O_RDONLY,   DENY_DOS,    O_WRONLY, DENY_WRITE,     A_0},
1106 {0, O_RDONLY,   DENY_DOS,      O_RDWR,  DENY_READ,     A_0},
1107 {0, O_RDONLY,   DENY_DOS,    O_RDONLY,  DENY_READ,     A_0},
1108 {0, O_RDONLY,   DENY_DOS,    O_WRONLY,  DENY_READ,     A_0},
1109 {0, O_RDONLY,   DENY_DOS,      O_RDWR,  DENY_NONE,     A_0},
1110 {0, O_RDONLY,   DENY_DOS,    O_RDONLY,  DENY_NONE,     A_R},
1111 {0, O_RDONLY,   DENY_DOS,    O_WRONLY,  DENY_NONE,     A_0},
1112 {0, O_RDONLY,   DENY_DOS,      O_RDWR,   DENY_FCB,     A_0},
1113 {0, O_RDONLY,   DENY_DOS,    O_RDONLY,   DENY_FCB,     A_0},
1114 {0, O_RDONLY,   DENY_DOS,    O_WRONLY,   DENY_FCB,     A_0},
1115 {0, O_WRONLY,   DENY_DOS,      O_RDWR,   DENY_DOS,     A_RW},
1116 {0, O_WRONLY,   DENY_DOS,    O_RDONLY,   DENY_DOS,     A_R},
1117 {0, O_WRONLY,   DENY_DOS,    O_WRONLY,   DENY_DOS,     A_W},
1118 {0, O_WRONLY,   DENY_DOS,      O_RDWR,   DENY_ALL,     A_0},
1119 {0, O_WRONLY,   DENY_DOS,    O_RDONLY,   DENY_ALL,     A_0},
1120 {0, O_WRONLY,   DENY_DOS,    O_WRONLY,   DENY_ALL,     A_0},
1121 {0, O_WRONLY,   DENY_DOS,      O_RDWR, DENY_WRITE,     A_0},
1122 {0, O_WRONLY,   DENY_DOS,    O_RDONLY, DENY_WRITE,     A_0},
1123 {0, O_WRONLY,   DENY_DOS,    O_WRONLY, DENY_WRITE,     A_0},
1124 {0, O_WRONLY,   DENY_DOS,      O_RDWR,  DENY_READ,     A_0},
1125 {0, O_WRONLY,   DENY_DOS,    O_RDONLY,  DENY_READ,     A_0},
1126 {0, O_WRONLY,   DENY_DOS,    O_WRONLY,  DENY_READ,     A_0},
1127 {0, O_WRONLY,   DENY_DOS,      O_RDWR,  DENY_NONE,     A_0},
1128 {0, O_WRONLY,   DENY_DOS,    O_RDONLY,  DENY_NONE,     A_0},
1129 {0, O_WRONLY,   DENY_DOS,    O_WRONLY,  DENY_NONE,     A_0},
1130 {0, O_WRONLY,   DENY_DOS,      O_RDWR,   DENY_FCB,     A_RW},
1131 {0, O_WRONLY,   DENY_DOS,    O_RDONLY,   DENY_FCB,     A_RW},
1132 {0, O_WRONLY,   DENY_DOS,    O_WRONLY,   DENY_FCB,     A_RW},
1133 {0,   O_RDWR,   DENY_ALL,      O_RDWR,   DENY_DOS,     A_0},
1134 {0,   O_RDWR,   DENY_ALL,    O_RDONLY,   DENY_DOS,     A_0},
1135 {0,   O_RDWR,   DENY_ALL,    O_WRONLY,   DENY_DOS,     A_0},
1136 {0,   O_RDWR,   DENY_ALL,      O_RDWR,   DENY_ALL,     A_0},
1137 {0,   O_RDWR,   DENY_ALL,    O_RDONLY,   DENY_ALL,     A_0},
1138 {0,   O_RDWR,   DENY_ALL,    O_WRONLY,   DENY_ALL,     A_0},
1139 {0,   O_RDWR,   DENY_ALL,      O_RDWR, DENY_WRITE,     A_0},
1140 {0,   O_RDWR,   DENY_ALL,    O_RDONLY, DENY_WRITE,     A_0},
1141 {0,   O_RDWR,   DENY_ALL,    O_WRONLY, DENY_WRITE,     A_0},
1142 {0,   O_RDWR,   DENY_ALL,      O_RDWR,  DENY_READ,     A_0},
1143 {0,   O_RDWR,   DENY_ALL,    O_RDONLY,  DENY_READ,     A_0},
1144 {0,   O_RDWR,   DENY_ALL,    O_WRONLY,  DENY_READ,     A_0},
1145 {0,   O_RDWR,   DENY_ALL,      O_RDWR,  DENY_NONE,     A_0},
1146 {0,   O_RDWR,   DENY_ALL,    O_RDONLY,  DENY_NONE,     A_0},
1147 {0,   O_RDWR,   DENY_ALL,    O_WRONLY,  DENY_NONE,     A_0},
1148 {0,   O_RDWR,   DENY_ALL,      O_RDWR,   DENY_FCB,     A_0},
1149 {0,   O_RDWR,   DENY_ALL,    O_RDONLY,   DENY_FCB,     A_0},
1150 {0,   O_RDWR,   DENY_ALL,    O_WRONLY,   DENY_FCB,     A_0},
1151 {0, O_RDONLY,   DENY_ALL,      O_RDWR,   DENY_DOS,     A_0},
1152 {0, O_RDONLY,   DENY_ALL,    O_RDONLY,   DENY_DOS,     A_0},
1153 {0, O_RDONLY,   DENY_ALL,    O_WRONLY,   DENY_DOS,     A_0},
1154 {0, O_RDONLY,   DENY_ALL,      O_RDWR,   DENY_ALL,     A_0},
1155 {0, O_RDONLY,   DENY_ALL,    O_RDONLY,   DENY_ALL,     A_0},
1156 {0, O_RDONLY,   DENY_ALL,    O_WRONLY,   DENY_ALL,     A_0},
1157 {0, O_RDONLY,   DENY_ALL,      O_RDWR, DENY_WRITE,     A_0},
1158 {0, O_RDONLY,   DENY_ALL,    O_RDONLY, DENY_WRITE,     A_0},
1159 {0, O_RDONLY,   DENY_ALL,    O_WRONLY, DENY_WRITE,     A_0},
1160 {0, O_RDONLY,   DENY_ALL,      O_RDWR,  DENY_READ,     A_0},
1161 {0, O_RDONLY,   DENY_ALL,    O_RDONLY,  DENY_READ,     A_0},
1162 {0, O_RDONLY,   DENY_ALL,    O_WRONLY,  DENY_READ,     A_0},
1163 {0, O_RDONLY,   DENY_ALL,      O_RDWR,  DENY_NONE,     A_0},
1164 {0, O_RDONLY,   DENY_ALL,    O_RDONLY,  DENY_NONE,     A_0},
1165 {0, O_RDONLY,   DENY_ALL,    O_WRONLY,  DENY_NONE,     A_0},
1166 {0, O_RDONLY,   DENY_ALL,      O_RDWR,   DENY_FCB,     A_0},
1167 {0, O_RDONLY,   DENY_ALL,    O_RDONLY,   DENY_FCB,     A_0},
1168 {0, O_RDONLY,   DENY_ALL,    O_WRONLY,   DENY_FCB,     A_0},
1169 {0, O_WRONLY,   DENY_ALL,      O_RDWR,   DENY_DOS,     A_0},
1170 {0, O_WRONLY,   DENY_ALL,    O_RDONLY,   DENY_DOS,     A_0},
1171 {0, O_WRONLY,   DENY_ALL,    O_WRONLY,   DENY_DOS,     A_0},
1172 {0, O_WRONLY,   DENY_ALL,      O_RDWR,   DENY_ALL,     A_0},
1173 {0, O_WRONLY,   DENY_ALL,    O_RDONLY,   DENY_ALL,     A_0},
1174 {0, O_WRONLY,   DENY_ALL,    O_WRONLY,   DENY_ALL,     A_0},
1175 {0, O_WRONLY,   DENY_ALL,      O_RDWR, DENY_WRITE,     A_0},
1176 {0, O_WRONLY,   DENY_ALL,    O_RDONLY, DENY_WRITE,     A_0},
1177 {0, O_WRONLY,   DENY_ALL,    O_WRONLY, DENY_WRITE,     A_0},
1178 {0, O_WRONLY,   DENY_ALL,      O_RDWR,  DENY_READ,     A_0},
1179 {0, O_WRONLY,   DENY_ALL,    O_RDONLY,  DENY_READ,     A_0},
1180 {0, O_WRONLY,   DENY_ALL,    O_WRONLY,  DENY_READ,     A_0},
1181 {0, O_WRONLY,   DENY_ALL,      O_RDWR,  DENY_NONE,     A_0},
1182 {0, O_WRONLY,   DENY_ALL,    O_RDONLY,  DENY_NONE,     A_0},
1183 {0, O_WRONLY,   DENY_ALL,    O_WRONLY,  DENY_NONE,     A_0},
1184 {0, O_WRONLY,   DENY_ALL,      O_RDWR,   DENY_FCB,     A_0},
1185 {0, O_WRONLY,   DENY_ALL,    O_RDONLY,   DENY_FCB,     A_0},
1186 {0, O_WRONLY,   DENY_ALL,    O_WRONLY,   DENY_FCB,     A_0},
1187 {0,   O_RDWR, DENY_WRITE,      O_RDWR,   DENY_DOS,     A_0},
1188 {0,   O_RDWR, DENY_WRITE,    O_RDONLY,   DENY_DOS,     A_0},
1189 {0,   O_RDWR, DENY_WRITE,    O_WRONLY,   DENY_DOS,     A_0},
1190 {0,   O_RDWR, DENY_WRITE,      O_RDWR,   DENY_ALL,     A_0},
1191 {0,   O_RDWR, DENY_WRITE,    O_RDONLY,   DENY_ALL,     A_0},
1192 {0,   O_RDWR, DENY_WRITE,    O_WRONLY,   DENY_ALL,     A_0},
1193 {0,   O_RDWR, DENY_WRITE,      O_RDWR, DENY_WRITE,     A_0},
1194 {0,   O_RDWR, DENY_WRITE,    O_RDONLY, DENY_WRITE,     A_0},
1195 {0,   O_RDWR, DENY_WRITE,    O_WRONLY, DENY_WRITE,     A_0},
1196 {0,   O_RDWR, DENY_WRITE,      O_RDWR,  DENY_READ,     A_0},
1197 {0,   O_RDWR, DENY_WRITE,    O_RDONLY,  DENY_READ,     A_0},
1198 {0,   O_RDWR, DENY_WRITE,    O_WRONLY,  DENY_READ,     A_0},
1199 {0,   O_RDWR, DENY_WRITE,      O_RDWR,  DENY_NONE,     A_0},
1200 {0,   O_RDWR, DENY_WRITE,    O_RDONLY,  DENY_NONE,     A_R},
1201 {0,   O_RDWR, DENY_WRITE,    O_WRONLY,  DENY_NONE,     A_0},
1202 {0,   O_RDWR, DENY_WRITE,      O_RDWR,   DENY_FCB,     A_0},
1203 {0,   O_RDWR, DENY_WRITE,    O_RDONLY,   DENY_FCB,     A_0},
1204 {0,   O_RDWR, DENY_WRITE,    O_WRONLY,   DENY_FCB,     A_0},
1205 {0, O_RDONLY, DENY_WRITE,      O_RDWR,   DENY_DOS,     A_0},
1206 {0, O_RDONLY, DENY_WRITE,    O_RDONLY,   DENY_DOS,     A_R},
1207 {0, O_RDONLY, DENY_WRITE,    O_WRONLY,   DENY_DOS,     A_0},
1208 {0, O_RDONLY, DENY_WRITE,      O_RDWR,   DENY_ALL,     A_0},
1209 {0, O_RDONLY, DENY_WRITE,    O_RDONLY,   DENY_ALL,     A_0},
1210 {0, O_RDONLY, DENY_WRITE,    O_WRONLY,   DENY_ALL,     A_0},
1211 {0, O_RDONLY, DENY_WRITE,      O_RDWR, DENY_WRITE,     A_0},
1212 {0, O_RDONLY, DENY_WRITE,    O_RDONLY, DENY_WRITE,     A_R},
1213 {0, O_RDONLY, DENY_WRITE,    O_WRONLY, DENY_WRITE,     A_0},
1214 {0, O_RDONLY, DENY_WRITE,      O_RDWR,  DENY_READ,     A_0},
1215 {0, O_RDONLY, DENY_WRITE,    O_RDONLY,  DENY_READ,     A_0},
1216 {0, O_RDONLY, DENY_WRITE,    O_WRONLY,  DENY_READ,     A_0},
1217 {0, O_RDONLY, DENY_WRITE,      O_RDWR,  DENY_NONE,     A_0},
1218 {0, O_RDONLY, DENY_WRITE,    O_RDONLY,  DENY_NONE,     A_R},
1219 {0, O_RDONLY, DENY_WRITE,    O_WRONLY,  DENY_NONE,     A_0},
1220 {0, O_RDONLY, DENY_WRITE,      O_RDWR,   DENY_FCB,     A_0},
1221 {0, O_RDONLY, DENY_WRITE,    O_RDONLY,   DENY_FCB,     A_0},
1222 {0, O_RDONLY, DENY_WRITE,    O_WRONLY,   DENY_FCB,     A_0},
1223 {0, O_WRONLY, DENY_WRITE,      O_RDWR,   DENY_DOS,     A_0},
1224 {0, O_WRONLY, DENY_WRITE,    O_RDONLY,   DENY_DOS,     A_0},
1225 {0, O_WRONLY, DENY_WRITE,    O_WRONLY,   DENY_DOS,     A_0},
1226 {0, O_WRONLY, DENY_WRITE,      O_RDWR,   DENY_ALL,     A_0},
1227 {0, O_WRONLY, DENY_WRITE,    O_RDONLY,   DENY_ALL,     A_0},
1228 {0, O_WRONLY, DENY_WRITE,    O_WRONLY,   DENY_ALL,     A_0},
1229 {0, O_WRONLY, DENY_WRITE,      O_RDWR, DENY_WRITE,     A_0},
1230 {0, O_WRONLY, DENY_WRITE,    O_RDONLY, DENY_WRITE,     A_0},
1231 {0, O_WRONLY, DENY_WRITE,    O_WRONLY, DENY_WRITE,     A_0},
1232 {0, O_WRONLY, DENY_WRITE,      O_RDWR,  DENY_READ,     A_0},
1233 {0, O_WRONLY, DENY_WRITE,    O_RDONLY,  DENY_READ,     A_R},
1234 {0, O_WRONLY, DENY_WRITE,    O_WRONLY,  DENY_READ,     A_0},
1235 {0, O_WRONLY, DENY_WRITE,      O_RDWR,  DENY_NONE,     A_0},
1236 {0, O_WRONLY, DENY_WRITE,    O_RDONLY,  DENY_NONE,     A_R},
1237 {0, O_WRONLY, DENY_WRITE,    O_WRONLY,  DENY_NONE,     A_0},
1238 {0, O_WRONLY, DENY_WRITE,      O_RDWR,   DENY_FCB,     A_0},
1239 {0, O_WRONLY, DENY_WRITE,    O_RDONLY,   DENY_FCB,     A_0},
1240 {0, O_WRONLY, DENY_WRITE,    O_WRONLY,   DENY_FCB,     A_0},
1241 {0,   O_RDWR,  DENY_READ,      O_RDWR,   DENY_DOS,     A_0},
1242 {0,   O_RDWR,  DENY_READ,    O_RDONLY,   DENY_DOS,     A_0},
1243 {0,   O_RDWR,  DENY_READ,    O_WRONLY,   DENY_DOS,     A_0},
1244 {0,   O_RDWR,  DENY_READ,      O_RDWR,   DENY_ALL,     A_0},
1245 {0,   O_RDWR,  DENY_READ,    O_RDONLY,   DENY_ALL,     A_0},
1246 {0,   O_RDWR,  DENY_READ,    O_WRONLY,   DENY_ALL,     A_0},
1247 {0,   O_RDWR,  DENY_READ,      O_RDWR, DENY_WRITE,     A_0},
1248 {0,   O_RDWR,  DENY_READ,    O_RDONLY, DENY_WRITE,     A_0},
1249 {0,   O_RDWR,  DENY_READ,    O_WRONLY, DENY_WRITE,     A_0},
1250 {0,   O_RDWR,  DENY_READ,      O_RDWR,  DENY_READ,     A_0},
1251 {0,   O_RDWR,  DENY_READ,    O_RDONLY,  DENY_READ,     A_0},
1252 {0,   O_RDWR,  DENY_READ,    O_WRONLY,  DENY_READ,     A_0},
1253 {0,   O_RDWR,  DENY_READ,      O_RDWR,  DENY_NONE,     A_0},
1254 {0,   O_RDWR,  DENY_READ,    O_RDONLY,  DENY_NONE,     A_0},
1255 {0,   O_RDWR,  DENY_READ,    O_WRONLY,  DENY_NONE,     A_W},
1256 {0,   O_RDWR,  DENY_READ,      O_RDWR,   DENY_FCB,     A_0},
1257 {0,   O_RDWR,  DENY_READ,    O_RDONLY,   DENY_FCB,     A_0},
1258 {0,   O_RDWR,  DENY_READ,    O_WRONLY,   DENY_FCB,     A_0},
1259 {0, O_RDONLY,  DENY_READ,      O_RDWR,   DENY_DOS,     A_0},
1260 {0, O_RDONLY,  DENY_READ,    O_RDONLY,   DENY_DOS,     A_0},
1261 {0, O_RDONLY,  DENY_READ,    O_WRONLY,   DENY_DOS,     A_0},
1262 {0, O_RDONLY,  DENY_READ,      O_RDWR,   DENY_ALL,     A_0},
1263 {0, O_RDONLY,  DENY_READ,    O_RDONLY,   DENY_ALL,     A_0},
1264 {0, O_RDONLY,  DENY_READ,    O_WRONLY,   DENY_ALL,     A_0},
1265 {0, O_RDONLY,  DENY_READ,      O_RDWR, DENY_WRITE,     A_0},
1266 {0, O_RDONLY,  DENY_READ,    O_RDONLY, DENY_WRITE,     A_0},
1267 {0, O_RDONLY,  DENY_READ,    O_WRONLY, DENY_WRITE,     A_W},
1268 {0, O_RDONLY,  DENY_READ,      O_RDWR,  DENY_READ,     A_0},
1269 {0, O_RDONLY,  DENY_READ,    O_RDONLY,  DENY_READ,     A_0},
1270 {0, O_RDONLY,  DENY_READ,    O_WRONLY,  DENY_READ,     A_0},
1271 {0, O_RDONLY,  DENY_READ,      O_RDWR,  DENY_NONE,     A_0},
1272 {0, O_RDONLY,  DENY_READ,    O_RDONLY,  DENY_NONE,     A_0},
1273 {0, O_RDONLY,  DENY_READ,    O_WRONLY,  DENY_NONE,     A_W},
1274 {0, O_RDONLY,  DENY_READ,      O_RDWR,   DENY_FCB,     A_0},
1275 {0, O_RDONLY,  DENY_READ,    O_RDONLY,   DENY_FCB,     A_0},
1276 {0, O_RDONLY,  DENY_READ,    O_WRONLY,   DENY_FCB,     A_0},
1277 {0, O_WRONLY,  DENY_READ,      O_RDWR,   DENY_DOS,     A_0},
1278 {0, O_WRONLY,  DENY_READ,    O_RDONLY,   DENY_DOS,     A_0},
1279 {0, O_WRONLY,  DENY_READ,    O_WRONLY,   DENY_DOS,     A_0},
1280 {0, O_WRONLY,  DENY_READ,      O_RDWR,   DENY_ALL,     A_0},
1281 {0, O_WRONLY,  DENY_READ,    O_RDONLY,   DENY_ALL,     A_0},
1282 {0, O_WRONLY,  DENY_READ,    O_WRONLY,   DENY_ALL,     A_0},
1283 {0, O_WRONLY,  DENY_READ,      O_RDWR, DENY_WRITE,     A_0},
1284 {0, O_WRONLY,  DENY_READ,    O_RDONLY, DENY_WRITE,     A_0},
1285 {0, O_WRONLY,  DENY_READ,    O_WRONLY, DENY_WRITE,     A_0},
1286 {0, O_WRONLY,  DENY_READ,      O_RDWR,  DENY_READ,     A_0},
1287 {0, O_WRONLY,  DENY_READ,    O_RDONLY,  DENY_READ,     A_0},
1288 {0, O_WRONLY,  DENY_READ,    O_WRONLY,  DENY_READ,     A_W},
1289 {0, O_WRONLY,  DENY_READ,      O_RDWR,  DENY_NONE,     A_0},
1290 {0, O_WRONLY,  DENY_READ,    O_RDONLY,  DENY_NONE,     A_0},
1291 {0, O_WRONLY,  DENY_READ,    O_WRONLY,  DENY_NONE,     A_W},
1292 {0, O_WRONLY,  DENY_READ,      O_RDWR,   DENY_FCB,     A_0},
1293 {0, O_WRONLY,  DENY_READ,    O_RDONLY,   DENY_FCB,     A_0},
1294 {0, O_WRONLY,  DENY_READ,    O_WRONLY,   DENY_FCB,     A_0},
1295 {0,   O_RDWR,  DENY_NONE,      O_RDWR,   DENY_DOS,     A_0},
1296 {0,   O_RDWR,  DENY_NONE,    O_RDONLY,   DENY_DOS,     A_0},
1297 {0,   O_RDWR,  DENY_NONE,    O_WRONLY,   DENY_DOS,     A_0},
1298 {0,   O_RDWR,  DENY_NONE,      O_RDWR,   DENY_ALL,     A_0},
1299 {0,   O_RDWR,  DENY_NONE,    O_RDONLY,   DENY_ALL,     A_0},
1300 {0,   O_RDWR,  DENY_NONE,    O_WRONLY,   DENY_ALL,     A_0},
1301 {0,   O_RDWR,  DENY_NONE,      O_RDWR, DENY_WRITE,     A_0},
1302 {0,   O_RDWR,  DENY_NONE,    O_RDONLY, DENY_WRITE,     A_0},
1303 {0,   O_RDWR,  DENY_NONE,    O_WRONLY, DENY_WRITE,     A_0},
1304 {0,   O_RDWR,  DENY_NONE,      O_RDWR,  DENY_READ,     A_0},
1305 {0,   O_RDWR,  DENY_NONE,    O_RDONLY,  DENY_READ,     A_0},
1306 {0,   O_RDWR,  DENY_NONE,    O_WRONLY,  DENY_READ,     A_0},
1307 {0,   O_RDWR,  DENY_NONE,      O_RDWR,  DENY_NONE,     A_RW},
1308 {0,   O_RDWR,  DENY_NONE,    O_RDONLY,  DENY_NONE,     A_R},
1309 {0,   O_RDWR,  DENY_NONE,    O_WRONLY,  DENY_NONE,     A_W},
1310 {0,   O_RDWR,  DENY_NONE,      O_RDWR,   DENY_FCB,     A_0},
1311 {0,   O_RDWR,  DENY_NONE,    O_RDONLY,   DENY_FCB,     A_0},
1312 {0,   O_RDWR,  DENY_NONE,    O_WRONLY,   DENY_FCB,     A_0},
1313 {0, O_RDONLY,  DENY_NONE,      O_RDWR,   DENY_DOS,     A_0},
1314 {0, O_RDONLY,  DENY_NONE,    O_RDONLY,   DENY_DOS,     A_R},
1315 {0, O_RDONLY,  DENY_NONE,    O_WRONLY,   DENY_DOS,     A_0},
1316 {0, O_RDONLY,  DENY_NONE,      O_RDWR,   DENY_ALL,     A_0},
1317 {0, O_RDONLY,  DENY_NONE,    O_RDONLY,   DENY_ALL,     A_0},
1318 {0, O_RDONLY,  DENY_NONE,    O_WRONLY,   DENY_ALL,     A_0},
1319 {0, O_RDONLY,  DENY_NONE,      O_RDWR, DENY_WRITE,     A_RW},
1320 {0, O_RDONLY,  DENY_NONE,    O_RDONLY, DENY_WRITE,     A_R},
1321 {0, O_RDONLY,  DENY_NONE,    O_WRONLY, DENY_WRITE,     A_W},
1322 {0, O_RDONLY,  DENY_NONE,      O_RDWR,  DENY_READ,     A_0},
1323 {0, O_RDONLY,  DENY_NONE,    O_RDONLY,  DENY_READ,     A_0},
1324 {0, O_RDONLY,  DENY_NONE,    O_WRONLY,  DENY_READ,     A_0},
1325 {0, O_RDONLY,  DENY_NONE,      O_RDWR,  DENY_NONE,     A_RW},
1326 {0, O_RDONLY,  DENY_NONE,    O_RDONLY,  DENY_NONE,     A_R},
1327 {0, O_RDONLY,  DENY_NONE,    O_WRONLY,  DENY_NONE,     A_W},
1328 {0, O_RDONLY,  DENY_NONE,      O_RDWR,   DENY_FCB,     A_0},
1329 {0, O_RDONLY,  DENY_NONE,    O_RDONLY,   DENY_FCB,     A_0},
1330 {0, O_RDONLY,  DENY_NONE,    O_WRONLY,   DENY_FCB,     A_0},
1331 {0, O_WRONLY,  DENY_NONE,      O_RDWR,   DENY_DOS,     A_0},
1332 {0, O_WRONLY,  DENY_NONE,    O_RDONLY,   DENY_DOS,     A_0},
1333 {0, O_WRONLY,  DENY_NONE,    O_WRONLY,   DENY_DOS,     A_0},
1334 {0, O_WRONLY,  DENY_NONE,      O_RDWR,   DENY_ALL,     A_0},
1335 {0, O_WRONLY,  DENY_NONE,    O_RDONLY,   DENY_ALL,     A_0},
1336 {0, O_WRONLY,  DENY_NONE,    O_WRONLY,   DENY_ALL,     A_0},
1337 {0, O_WRONLY,  DENY_NONE,      O_RDWR, DENY_WRITE,     A_0},
1338 {0, O_WRONLY,  DENY_NONE,    O_RDONLY, DENY_WRITE,     A_0},
1339 {0, O_WRONLY,  DENY_NONE,    O_WRONLY, DENY_WRITE,     A_0},
1340 {0, O_WRONLY,  DENY_NONE,      O_RDWR,  DENY_READ,     A_RW},
1341 {0, O_WRONLY,  DENY_NONE,    O_RDONLY,  DENY_READ,     A_R},
1342 {0, O_WRONLY,  DENY_NONE,    O_WRONLY,  DENY_READ,     A_W},
1343 {0, O_WRONLY,  DENY_NONE,      O_RDWR,  DENY_NONE,     A_RW},
1344 {0, O_WRONLY,  DENY_NONE,    O_RDONLY,  DENY_NONE,     A_R},
1345 {0, O_WRONLY,  DENY_NONE,    O_WRONLY,  DENY_NONE,     A_W},
1346 {0, O_WRONLY,  DENY_NONE,      O_RDWR,   DENY_FCB,     A_0},
1347 {0, O_WRONLY,  DENY_NONE,    O_RDONLY,   DENY_FCB,     A_0},
1348 {0, O_WRONLY,  DENY_NONE,    O_WRONLY,   DENY_FCB,     A_0},
1349 {0,   O_RDWR,   DENY_FCB,      O_RDWR,   DENY_DOS,     A_RW},
1350 {0,   O_RDWR,   DENY_FCB,    O_RDONLY,   DENY_DOS,     A_R},
1351 {0,   O_RDWR,   DENY_FCB,    O_WRONLY,   DENY_DOS,     A_W},
1352 {0,   O_RDWR,   DENY_FCB,      O_RDWR,   DENY_ALL,     A_0},
1353 {0,   O_RDWR,   DENY_FCB,    O_RDONLY,   DENY_ALL,     A_0},
1354 {0,   O_RDWR,   DENY_FCB,    O_WRONLY,   DENY_ALL,     A_0},
1355 {0,   O_RDWR,   DENY_FCB,      O_RDWR, DENY_WRITE,     A_0},
1356 {0,   O_RDWR,   DENY_FCB,    O_RDONLY, DENY_WRITE,     A_0},
1357 {0,   O_RDWR,   DENY_FCB,    O_WRONLY, DENY_WRITE,     A_0},
1358 {0,   O_RDWR,   DENY_FCB,      O_RDWR,  DENY_READ,     A_0},
1359 {0,   O_RDWR,   DENY_FCB,    O_RDONLY,  DENY_READ,     A_0},
1360 {0,   O_RDWR,   DENY_FCB,    O_WRONLY,  DENY_READ,     A_0},
1361 {0,   O_RDWR,   DENY_FCB,      O_RDWR,  DENY_NONE,     A_0},
1362 {0,   O_RDWR,   DENY_FCB,    O_RDONLY,  DENY_NONE,     A_0},
1363 {0,   O_RDWR,   DENY_FCB,    O_WRONLY,  DENY_NONE,     A_0},
1364 {0,   O_RDWR,   DENY_FCB,      O_RDWR,   DENY_FCB,     A_RW},
1365 {0,   O_RDWR,   DENY_FCB,    O_RDONLY,   DENY_FCB,     A_RW},
1366 {0,   O_RDWR,   DENY_FCB,    O_WRONLY,   DENY_FCB,     A_RW},
1367 {0, O_RDONLY,   DENY_FCB,      O_RDWR,   DENY_DOS,     A_RW},
1368 {0, O_RDONLY,   DENY_FCB,    O_RDONLY,   DENY_DOS,     A_R},
1369 {0, O_RDONLY,   DENY_FCB,    O_WRONLY,   DENY_DOS,     A_W},
1370 {0, O_RDONLY,   DENY_FCB,      O_RDWR,   DENY_ALL,     A_0},
1371 {0, O_RDONLY,   DENY_FCB,    O_RDONLY,   DENY_ALL,     A_0},
1372 {0, O_RDONLY,   DENY_FCB,    O_WRONLY,   DENY_ALL,     A_0},
1373 {0, O_RDONLY,   DENY_FCB,      O_RDWR, DENY_WRITE,     A_0},
1374 {0, O_RDONLY,   DENY_FCB,    O_RDONLY, DENY_WRITE,     A_0},
1375 {0, O_RDONLY,   DENY_FCB,    O_WRONLY, DENY_WRITE,     A_0},
1376 {0, O_RDONLY,   DENY_FCB,      O_RDWR,  DENY_READ,     A_0},
1377 {0, O_RDONLY,   DENY_FCB,    O_RDONLY,  DENY_READ,     A_0},
1378 {0, O_RDONLY,   DENY_FCB,    O_WRONLY,  DENY_READ,     A_0},
1379 {0, O_RDONLY,   DENY_FCB,      O_RDWR,  DENY_NONE,     A_0},
1380 {0, O_RDONLY,   DENY_FCB,    O_RDONLY,  DENY_NONE,     A_0},
1381 {0, O_RDONLY,   DENY_FCB,    O_WRONLY,  DENY_NONE,     A_0},
1382 {0, O_RDONLY,   DENY_FCB,      O_RDWR,   DENY_FCB,     A_RW},
1383 {0, O_RDONLY,   DENY_FCB,    O_RDONLY,   DENY_FCB,     A_RW},
1384 {0, O_RDONLY,   DENY_FCB,    O_WRONLY,   DENY_FCB,     A_RW},
1385 {0, O_WRONLY,   DENY_FCB,      O_RDWR,   DENY_DOS,     A_RW},
1386 {0, O_WRONLY,   DENY_FCB,    O_RDONLY,   DENY_DOS,     A_R},
1387 {0, O_WRONLY,   DENY_FCB,    O_WRONLY,   DENY_DOS,     A_W},
1388 {0, O_WRONLY,   DENY_FCB,      O_RDWR,   DENY_ALL,     A_0},
1389 {0, O_WRONLY,   DENY_FCB,    O_RDONLY,   DENY_ALL,     A_0},
1390 {0, O_WRONLY,   DENY_FCB,    O_WRONLY,   DENY_ALL,     A_0},
1391 {0, O_WRONLY,   DENY_FCB,      O_RDWR, DENY_WRITE,     A_0},
1392 {0, O_WRONLY,   DENY_FCB,    O_RDONLY, DENY_WRITE,     A_0},
1393 {0, O_WRONLY,   DENY_FCB,    O_WRONLY, DENY_WRITE,     A_0},
1394 {0, O_WRONLY,   DENY_FCB,      O_RDWR,  DENY_READ,     A_0},
1395 {0, O_WRONLY,   DENY_FCB,    O_RDONLY,  DENY_READ,     A_0},
1396 {0, O_WRONLY,   DENY_FCB,    O_WRONLY,  DENY_READ,     A_0},
1397 {0, O_WRONLY,   DENY_FCB,      O_RDWR,  DENY_NONE,     A_0},
1398 {0, O_WRONLY,   DENY_FCB,    O_RDONLY,  DENY_NONE,     A_0},
1399 {0, O_WRONLY,   DENY_FCB,    O_WRONLY,  DENY_NONE,     A_0},
1400 {0, O_WRONLY,   DENY_FCB,      O_RDWR,   DENY_FCB,     A_RW},
1401 {0, O_WRONLY,   DENY_FCB,    O_RDONLY,   DENY_FCB,     A_RW},
1402 {0, O_WRONLY,   DENY_FCB,    O_WRONLY,   DENY_FCB,     A_RW}
1403 };
1404
1405
1406 static void progress_bar(struct torture_context *tctx, uint_t i, uint_t total)
1407 {
1408         if (torture_setting_bool(tctx, "progress", true)) {
1409                 torture_comment(tctx, "%5d/%5d\r", i, total);
1410                 fflush(stdout);
1411         }
1412 }
1413
1414 /*
1415   this produces a matrix of deny mode behaviour for 1 connection
1416  */
1417 bool torture_denytest1(struct torture_context *tctx, 
1418                        struct smbcli_state *cli1)
1419 {
1420         int fnum1, fnum2;
1421         int i;
1422         bool correct = true;
1423         struct timeval tv, tv_start;
1424         const char *fnames[2] = {"\\denytest1.dat", "\\denytest1.exe"};
1425         int failures=0;
1426
1427         torture_comment(tctx, "Testing deny modes with 1 connection\n");
1428
1429         for (i=0;i<2;i++) {
1430                 smbcli_unlink(cli1->tree, fnames[i]);
1431                 fnum1 = smbcli_open(cli1->tree, fnames[i], O_RDWR|O_CREAT, DENY_NONE);
1432                 smbcli_write(cli1->tree, fnum1, 0, fnames[i], 0, strlen(fnames[i]));
1433                 smbcli_close(cli1->tree, fnum1);
1434         }
1435
1436         torture_comment(tctx, "testing %d entries\n", (int)ARRAY_SIZE(denytable1));
1437
1438         GetTimeOfDay(&tv_start);
1439
1440         for (i=0; i<ARRAY_SIZE(denytable1); i++) {
1441                 enum deny_result res;
1442                 const char *fname = fnames[denytable1[i].isexe];
1443
1444                 progress_bar(tctx, i, ARRAY_SIZE(denytable1));
1445
1446                 fnum1 = smbcli_open(cli1->tree, fname, 
1447                                  denytable1[i].mode1,
1448                                  denytable1[i].deny1);
1449                 fnum2 = smbcli_open(cli1->tree, fname, 
1450                                  denytable1[i].mode2,
1451                                  denytable1[i].deny2);
1452
1453                 if (fnum1 == -1) {
1454                         res = A_X;
1455                 } else if (fnum2 == -1) {
1456                         res = A_0;
1457                 } else {
1458                         uint8_t x = 1;
1459                         res = A_0;
1460                         if (smbcli_read(cli1->tree, fnum2, &x, 0, 1) == 1) {
1461                                 res += A_R;
1462                         }
1463                         if (smbcli_write(cli1->tree, fnum2, 0, &x, 0, 1) == 1) {
1464                                 res += A_W;
1465                         }
1466                 }
1467
1468                 if (torture_setting_bool(tctx, "showall", false) || 
1469                         res != denytable1[i].result) {
1470                         int64_t tdif;
1471                         GetTimeOfDay(&tv);
1472                         tdif = usec_time_diff(&tv, &tv_start);
1473                         tdif /= 1000;
1474                         torture_comment(tctx, "%lld: %s %8s %10s    %8s %10s    %s (correct=%s)\n",
1475                                (long long)tdif,
1476                                fname,
1477                                denystr(denytable1[i].deny1),
1478                                openstr(denytable1[i].mode1),
1479                                denystr(denytable1[i].deny2),
1480                                openstr(denytable1[i].mode2),
1481                                resultstr(res),
1482                                resultstr(denytable1[i].result));
1483                 }
1484
1485                 if (res != denytable1[i].result) {
1486                         correct = false;
1487                         CHECK_MAX_FAILURES(failed);
1488                 }
1489
1490                 smbcli_close(cli1->tree, fnum1);
1491                 smbcli_close(cli1->tree, fnum2);
1492         }
1493
1494 failed:
1495         for (i=0;i<2;i++) {
1496                 smbcli_unlink(cli1->tree, fnames[i]);
1497         }
1498                 
1499         torture_comment(tctx, "finshed denytest1 (%d failures)\n", failures);
1500         return correct;
1501 }
1502
1503
1504 /*
1505   this produces a matrix of deny mode behaviour with 2 connections
1506  */
1507 bool torture_denytest2(struct torture_context *tctx, 
1508                        struct smbcli_state *cli1, 
1509                        struct smbcli_state *cli2)
1510 {
1511         int fnum1, fnum2;
1512         int i;
1513         bool correct = true;
1514         const char *fnames[2] = {"\\denytest2.dat", "\\denytest2.exe"};
1515         struct timeval tv, tv_start;
1516         int failures=0;
1517
1518         for (i=0;i<2;i++) {
1519                 smbcli_unlink(cli1->tree, fnames[i]);
1520                 fnum1 = smbcli_open(cli1->tree, fnames[i], O_RDWR|O_CREAT, DENY_NONE);
1521                 smbcli_write(cli1->tree, fnum1, 0, fnames[i], 0, strlen(fnames[i]));
1522                 smbcli_close(cli1->tree, fnum1);
1523         }
1524
1525         GetTimeOfDay(&tv_start);
1526
1527         for (i=0; i<ARRAY_SIZE(denytable2); i++) {
1528                 enum deny_result res;
1529                 const char *fname = fnames[denytable2[i].isexe];
1530
1531                 progress_bar(tctx, i, ARRAY_SIZE(denytable1));
1532
1533                 fnum1 = smbcli_open(cli1->tree, fname, 
1534                                  denytable2[i].mode1,
1535                                  denytable2[i].deny1);
1536                 fnum2 = smbcli_open(cli2->tree, fname, 
1537                                  denytable2[i].mode2,
1538                                  denytable2[i].deny2);
1539
1540                 if (fnum1 == -1) {
1541                         res = A_X;
1542                 } else if (fnum2 == -1) {
1543                         res = A_0;
1544                 } else {
1545                         uint8_t x = 1;
1546                         res = A_0;
1547                         if (smbcli_read(cli2->tree, fnum2, &x, 0, 1) == 1) {
1548                                 res += A_R;
1549                         }
1550                         if (smbcli_write(cli2->tree, fnum2, 0, &x, 0, 1) == 1) {
1551                                 res += A_W;
1552                         }
1553                 }
1554
1555                 if (torture_setting_bool(tctx, "showall", false) || 
1556                         res != denytable2[i].result) {
1557                         int64_t tdif;
1558                         GetTimeOfDay(&tv);
1559                         tdif = usec_time_diff(&tv, &tv_start);
1560                         tdif /= 1000;
1561                         torture_comment(tctx, "%lld: %s %8s %10s    %8s %10s    %s (correct=%s)\n",
1562                                (long long)tdif,
1563                                fname,
1564                                denystr(denytable2[i].deny1),
1565                                openstr(denytable2[i].mode1),
1566                                denystr(denytable2[i].deny2),
1567                                openstr(denytable2[i].mode2),
1568                                resultstr(res),
1569                                resultstr(denytable2[i].result));
1570                 }
1571
1572                 if (res != denytable2[i].result) {
1573                         correct = false;
1574                         CHECK_MAX_FAILURES(failed);
1575                 }
1576
1577                 smbcli_close(cli1->tree, fnum1);
1578                 smbcli_close(cli2->tree, fnum2);
1579         }
1580
1581 failed:         
1582         for (i=0;i<2;i++) {
1583                 smbcli_unlink(cli1->tree, fnames[i]);
1584         }
1585
1586         torture_comment(tctx, "finshed denytest2 (%d failures)\n", failures);
1587         return correct;
1588 }
1589
1590
1591
1592 /*
1593    simple test harness for playing with deny modes
1594  */
1595 bool torture_denytest3(struct torture_context *tctx, 
1596                        struct smbcli_state *cli1,
1597                        struct smbcli_state *cli2)
1598 {
1599         int fnum1, fnum2;
1600         const char *fname;
1601
1602         fname = "\\deny_dos1.dat";
1603
1604         smbcli_unlink(cli1->tree, fname);
1605         fnum1 = smbcli_open(cli1->tree, fname, O_CREAT|O_TRUNC|O_WRONLY, DENY_DOS);
1606         fnum2 = smbcli_open(cli1->tree, fname, O_CREAT|O_TRUNC|O_WRONLY, DENY_DOS);
1607         if (fnum1 != -1) smbcli_close(cli1->tree, fnum1);
1608         if (fnum2 != -1) smbcli_close(cli1->tree, fnum2);
1609         smbcli_unlink(cli1->tree, fname);
1610         torture_comment(tctx, "fnum1=%d fnum2=%d\n", fnum1, fnum2);
1611
1612
1613         fname = "\\deny_dos2.dat";
1614
1615         smbcli_unlink(cli1->tree, fname);
1616         fnum1 = smbcli_open(cli1->tree, fname, O_CREAT|O_TRUNC|O_WRONLY, DENY_DOS);
1617         fnum2 = smbcli_open(cli2->tree, fname, O_CREAT|O_TRUNC|O_WRONLY, DENY_DOS);
1618         if (fnum1 != -1) smbcli_close(cli1->tree, fnum1);
1619         if (fnum2 != -1) smbcli_close(cli2->tree, fnum2);
1620         smbcli_unlink(cli1->tree, fname);
1621         torture_comment(tctx, "fnum1=%d fnum2=%d\n", fnum1, fnum2);
1622
1623         return true;
1624 }
1625
1626 struct bit_value {
1627         uint32_t value;
1628         const char *name;
1629 };
1630
1631 static uint32_t map_bits(const struct bit_value *bv, int b, int nbits)
1632 {
1633         int i;
1634         uint32_t ret = 0;
1635         for (i=0;i<nbits;i++) {
1636                 if (b & (1<<i)) {
1637                         ret |= bv[i].value;
1638                 }
1639         }
1640         return ret;
1641 }
1642
1643 static const char *bit_string(TALLOC_CTX *mem_ctx, const struct bit_value *bv, int b, int nbits)
1644 {
1645         char *ret = NULL;
1646         int i;
1647         for (i=0;i<nbits;i++) {
1648                 if (b & (1<<i)) {
1649                         if (ret == NULL) {
1650                                 ret = talloc_asprintf(mem_ctx, "%s", bv[i].name);
1651                         } else {
1652                                 ret = talloc_asprintf_append_buffer(ret, " | %s", bv[i].name);
1653                         }
1654                 }
1655         }
1656         if (ret == NULL) ret = talloc_strdup(mem_ctx, "(NONE)");
1657         return ret;
1658 }
1659
1660
1661 /*
1662   determine if two opens conflict
1663 */
1664 static NTSTATUS predict_share_conflict(uint32_t sa1, uint32_t am1, uint32_t sa2, uint32_t am2,
1665                                        bool read_for_execute, enum deny_result *res)
1666 {
1667 #define CHECK_MASK(am, sa, right, share) do { \
1668         if (((am) & (right)) && !((sa) & (share))) { \
1669                 *res = A_0; \
1670                 return NT_STATUS_SHARING_VIOLATION; \
1671         }} while (0)
1672
1673         *res = A_0;
1674         if (am2 & (SEC_FILE_WRITE_DATA | SEC_FILE_APPEND_DATA)) {
1675                 *res += A_W;
1676         }
1677         if (am2 & SEC_FILE_READ_DATA) {
1678                 *res += A_R;
1679         } else if ((am2 & SEC_FILE_EXECUTE) && read_for_execute) {
1680                 *res += A_R;
1681         }
1682
1683         /* if either open involves no read.write or delete access then
1684            it can't conflict */
1685         if (!(am1 & (SEC_FILE_WRITE_DATA | 
1686                      SEC_FILE_APPEND_DATA |
1687                      SEC_FILE_READ_DATA | 
1688                      SEC_FILE_EXECUTE | 
1689                      SEC_STD_DELETE))) {
1690                 return NT_STATUS_OK;
1691         }
1692         if (!(am2 & (SEC_FILE_WRITE_DATA | 
1693                      SEC_FILE_APPEND_DATA |
1694                      SEC_FILE_READ_DATA | 
1695                      SEC_FILE_EXECUTE | 
1696                      SEC_STD_DELETE))) {
1697                 return NT_STATUS_OK;
1698         }
1699
1700         /* check the basic share access */
1701         CHECK_MASK(am1, sa2, 
1702                    SEC_FILE_WRITE_DATA | SEC_FILE_APPEND_DATA, 
1703                    NTCREATEX_SHARE_ACCESS_WRITE);
1704         CHECK_MASK(am2, sa1, 
1705                    SEC_FILE_WRITE_DATA | SEC_FILE_APPEND_DATA, 
1706                    NTCREATEX_SHARE_ACCESS_WRITE);
1707
1708         CHECK_MASK(am1, sa2, 
1709                    SEC_FILE_READ_DATA | SEC_FILE_EXECUTE, 
1710                    NTCREATEX_SHARE_ACCESS_READ);
1711         CHECK_MASK(am2, sa1, 
1712                    SEC_FILE_READ_DATA | SEC_FILE_EXECUTE, 
1713                    NTCREATEX_SHARE_ACCESS_READ);
1714
1715         CHECK_MASK(am1, sa2, 
1716                    SEC_STD_DELETE, 
1717                    NTCREATEX_SHARE_ACCESS_DELETE);
1718         CHECK_MASK(am2, sa1, 
1719                    SEC_STD_DELETE, 
1720                    NTCREATEX_SHARE_ACCESS_DELETE);
1721
1722         return NT_STATUS_OK;
1723 }
1724
1725 /*
1726   a denytest for ntcreatex
1727  */
1728 static bool torture_ntdenytest(struct torture_context *tctx, 
1729                                                            struct smbcli_state *cli1, struct smbcli_state *cli2, int client)
1730 {
1731         const struct bit_value share_access_bits[] = {
1732                 { NTCREATEX_SHARE_ACCESS_READ,   "S_R" },
1733                 { NTCREATEX_SHARE_ACCESS_WRITE,  "S_W" },
1734                 { NTCREATEX_SHARE_ACCESS_DELETE, "S_D" }
1735         };
1736         const struct bit_value access_mask_bits[] = {
1737                 { SEC_FILE_READ_DATA,        "R_DATA" },
1738                 { SEC_FILE_WRITE_DATA,       "W_DATA" },
1739                 { SEC_FILE_READ_ATTRIBUTE,   "R_ATTR" },
1740                 { SEC_FILE_WRITE_ATTRIBUTE,  "W_ATTR" },
1741                 { SEC_FILE_READ_EA,          "R_EAS " },
1742                 { SEC_FILE_WRITE_EA,         "W_EAS " },
1743                 { SEC_FILE_APPEND_DATA,      "A_DATA" },
1744                 { SEC_FILE_EXECUTE,          "EXEC  " }
1745         };
1746         int fnum1;
1747         int i;
1748         bool correct = true;
1749         struct timeval tv, tv_start;
1750         const char *fname;
1751         int nbits1 = ARRAY_SIZE(share_access_bits);
1752         int nbits2 = ARRAY_SIZE(access_mask_bits);
1753         union smb_open io1, io2;
1754         extern int torture_numops;
1755         int failures = 0;
1756         uint8_t buf[1];
1757
1758         torture_comment(tctx, "format: server correct\n");
1759
1760         ZERO_STRUCT(buf);
1761
1762         fname = talloc_asprintf(cli1, "\\ntdeny_%d.dll", client);
1763
1764         smbcli_unlink(cli1->tree, fname);
1765         fnum1 = smbcli_open(cli1->tree, fname, O_RDWR|O_CREAT, DENY_NONE);
1766         smbcli_write(cli1->tree, fnum1, 0, buf, 0, sizeof(buf));
1767         smbcli_close(cli1->tree, fnum1);
1768
1769         GetTimeOfDay(&tv_start);
1770
1771         io1.ntcreatex.level = RAW_OPEN_NTCREATEX;
1772         io1.ntcreatex.in.root_fid.fnum = 0;
1773         io1.ntcreatex.in.flags = NTCREATEX_FLAGS_EXTENDED;
1774         io1.ntcreatex.in.create_options = NTCREATEX_OPTIONS_NON_DIRECTORY_FILE;
1775         io1.ntcreatex.in.file_attr = 0;
1776         io1.ntcreatex.in.alloc_size = 0;
1777         io1.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN;
1778         io1.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_IMPERSONATION;
1779         io1.ntcreatex.in.security_flags = 0;
1780         io1.ntcreatex.in.fname = fname;
1781         io2 = io1;
1782
1783         torture_comment(tctx, "testing %d entries on %s\n", torture_numops, fname);
1784
1785         for (i=0;i<torture_numops;i++) {
1786                 NTSTATUS status1, status2, status2_p;
1787                 int64_t tdif;
1788                 TALLOC_CTX *mem_ctx = talloc_new(NULL);
1789                 enum deny_result res, res2;
1790                 int b_sa1 = random() & ((1<<nbits1)-1);
1791                 int b_am1 = random() & ((1<<nbits2)-1);
1792                 int b_sa2 = random() & ((1<<nbits1)-1);
1793                 int b_am2 = random() & ((1<<nbits2)-1);
1794                 bool read_for_execute;
1795
1796                 progress_bar(tctx, i, torture_numops);
1797                 
1798                 io1.ntcreatex.in.share_access = map_bits(share_access_bits, b_sa1, nbits1);
1799                 io1.ntcreatex.in.access_mask  = map_bits(access_mask_bits,  b_am1, nbits2);
1800                 
1801                 io2.ntcreatex.in.share_access = map_bits(share_access_bits, b_sa2, nbits1);
1802                 io2.ntcreatex.in.access_mask  = map_bits(access_mask_bits,  b_am2, nbits2);
1803
1804                 status1 = smb_raw_open(cli1->tree, mem_ctx, &io1);
1805                 status2 = smb_raw_open(cli2->tree, mem_ctx, &io2);
1806
1807                 if (random() % 2 == 0) {
1808                         read_for_execute = true;
1809                 } else {
1810                         read_for_execute = false;
1811                 }
1812                 
1813                 if (!NT_STATUS_IS_OK(status1)) {
1814                         res = A_X;
1815                 } else if (!NT_STATUS_IS_OK(status2)) {
1816                         res = A_0;
1817                 } else {
1818                         union smb_read r;
1819                         NTSTATUS status;
1820
1821                         /* we can't use smbcli_read() as we need to
1822                            set read_for_execute */
1823                         r.readx.level = RAW_READ_READX;
1824                         r.readx.in.file.fnum = io2.ntcreatex.out.file.fnum;
1825                         r.readx.in.offset = 0;
1826                         r.readx.in.mincnt = sizeof(buf);
1827                         r.readx.in.maxcnt = sizeof(buf);
1828                         r.readx.in.remaining = 0;
1829                         r.readx.in.read_for_execute = read_for_execute;
1830                         r.readx.out.data = buf;
1831
1832                         res = A_0;
1833                         status = smb_raw_read(cli2->tree, &r);
1834                         if (NT_STATUS_IS_OK(status)) {
1835                                 res += A_R;
1836                         }
1837                         if (smbcli_write(cli2->tree, io2.ntcreatex.out.file.fnum,
1838                                          0, buf, 0, sizeof(buf)) >= 1) {
1839                                 res += A_W;
1840                         }
1841                 }
1842                 
1843                 if (NT_STATUS_IS_OK(status1)) {
1844                         smbcli_close(cli1->tree, io1.ntcreatex.out.file.fnum);
1845                 }
1846                 if (NT_STATUS_IS_OK(status2)) {
1847                         smbcli_close(cli2->tree, io2.ntcreatex.out.file.fnum);
1848                 }
1849                 
1850                 status2_p = predict_share_conflict(io1.ntcreatex.in.share_access,
1851                                                    io1.ntcreatex.in.access_mask,
1852                                                    io2.ntcreatex.in.share_access,
1853                                                    io2.ntcreatex.in.access_mask, 
1854                                                    read_for_execute,
1855                                                    &res2);
1856                 
1857                 GetTimeOfDay(&tv);
1858                 tdif = usec_time_diff(&tv, &tv_start);
1859                 tdif /= 1000;
1860                 if (torture_setting_bool(tctx, "showall", false) || 
1861                     !NT_STATUS_EQUAL(status2, status2_p) ||
1862                     res != res2) {
1863                         torture_comment(tctx, "\n%-20s %-70s\n%-20s %-70s %4s %4s  %s/%s\n",
1864                                bit_string(mem_ctx, share_access_bits, b_sa1, nbits1),
1865                                bit_string(mem_ctx, access_mask_bits,  b_am1, nbits2),
1866                                bit_string(mem_ctx, share_access_bits, b_sa2, nbits1),
1867                                bit_string(mem_ctx, access_mask_bits,  b_am2, nbits2),
1868                                resultstr(res),
1869                                resultstr(res2),
1870                                nt_errstr(status2),
1871                                nt_errstr(status2_p));
1872                         fflush(stdout);
1873                 }
1874                 
1875                 if (res != res2 ||
1876                     !NT_STATUS_EQUAL(status2, status2_p)) {
1877                         CHECK_MAX_FAILURES(failed);
1878                         correct = false;
1879                 }
1880                 
1881                 talloc_free(mem_ctx);
1882         }
1883
1884 failed:
1885         smbcli_unlink(cli1->tree, fname);
1886         
1887         torture_comment(tctx, "finshed ntdenytest (%d failures)\n", failures);
1888         return correct;
1889 }
1890
1891
1892
1893 /*
1894   a denytest for ntcreatex
1895  */
1896 bool torture_ntdenytest1(struct torture_context *tctx, 
1897                          struct smbcli_state *cli, int client)
1898 {
1899         extern int torture_seed;
1900
1901         srandom(torture_seed + client);
1902
1903         torture_comment(tctx, "starting ntdenytest1 client %d\n", client);
1904
1905         return torture_ntdenytest(tctx, cli, cli, client);
1906 }
1907
1908 /*
1909   a denytest for ntcreatex
1910  */
1911 bool torture_ntdenytest2(struct torture_context *torture, 
1912                          struct smbcli_state *cli1,
1913                          struct smbcli_state *cli2)
1914 {
1915         return torture_ntdenytest(torture, cli1, cli2, 0);
1916 }
1917
1918 #define COMPARE_STATUS(status, correct) do { \
1919         if (!NT_STATUS_EQUAL(status, correct)) { \
1920                 torture_result(tctx, TORTURE_FAIL, \
1921                         "(%s) Incorrect status %s - should be %s\n", \
1922                         __location__, nt_errstr(status), nt_errstr(correct)); \
1923                 ret = false; \
1924                 failed = true; \
1925         }} while (0)
1926
1927 #define CHECK_STATUS(status, correct) do { \
1928         if (!NT_STATUS_EQUAL(status, correct)) { \
1929                 torture_result(tctx, TORTURE_FAIL, \
1930                         "(%s) Incorrect status %s - should be %s\n", \
1931                        __location__, nt_errstr(status), nt_errstr(correct)); \
1932                 ret = false; \
1933                 goto done; \
1934         }} while (0)
1935
1936 #define CHECK_VAL(v, correct) do { \
1937         if ((v) != (correct)) { \
1938                 torture_result(tctx, TORTURE_FAIL, \
1939                       "(%s) wrong value for %s  0x%x - should be 0x%x\n", \
1940                        __location__, #v, (int)(v), (int)correct); \
1941                 ret = false; \
1942         }} while (0)
1943
1944 /*
1945   test sharing of handles with DENY_DOS on a single connection
1946 */
1947 bool torture_denydos_sharing(struct torture_context *tctx, 
1948                              struct smbcli_state *cli)
1949 {
1950         union smb_open io;
1951         union smb_fileinfo finfo;
1952         const char *fname = "\\torture_denydos.txt";
1953         NTSTATUS status;
1954         int fnum1 = -1, fnum2 = -1;
1955         bool ret = true;
1956         union smb_setfileinfo sfinfo;
1957         TALLOC_CTX *mem_ctx;
1958
1959         mem_ctx = talloc_new(cli);
1960
1961         torture_comment(tctx, "Checking DENY_DOS shared handle semantics\n");
1962         smbcli_unlink(cli->tree, fname);
1963
1964         io.openx.level = RAW_OPEN_OPENX;
1965         io.openx.in.fname = fname;
1966         io.openx.in.flags = OPENX_FLAGS_ADDITIONAL_INFO;
1967         io.openx.in.open_mode = OPENX_MODE_ACCESS_RDWR | OPENX_MODE_DENY_DOS;
1968         io.openx.in.open_func = OPENX_OPEN_FUNC_OPEN | OPENX_OPEN_FUNC_CREATE;
1969         io.openx.in.search_attrs = 0;
1970         io.openx.in.file_attrs = 0;
1971         io.openx.in.write_time = 0;
1972         io.openx.in.size = 0;
1973         io.openx.in.timeout = 0;
1974
1975         torture_comment(tctx, "openx twice with RDWR/DENY_DOS\n");
1976         status = smb_raw_open(cli->tree, mem_ctx, &io);
1977         CHECK_STATUS(status, NT_STATUS_OK);
1978         fnum1 = io.openx.out.file.fnum;
1979
1980         status = smb_raw_open(cli->tree, mem_ctx, &io);
1981         CHECK_STATUS(status, NT_STATUS_OK);
1982         fnum2 = io.openx.out.file.fnum;
1983
1984         torture_comment(tctx, "fnum1=%d fnum2=%d\n", fnum1, fnum2);
1985
1986         sfinfo.generic.level = RAW_SFILEINFO_POSITION_INFORMATION;
1987         sfinfo.position_information.in.file.fnum = fnum1;
1988         sfinfo.position_information.in.position = 1000;
1989         status = smb_raw_setfileinfo(cli->tree, &sfinfo);
1990         CHECK_STATUS(status, NT_STATUS_OK);
1991
1992         torture_comment(tctx, "two handles should be same file handle\n");
1993         finfo.position_information.level = RAW_FILEINFO_POSITION_INFORMATION;
1994         finfo.position_information.in.file.fnum = fnum1;
1995         status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo);
1996         CHECK_STATUS(status, NT_STATUS_OK);
1997         CHECK_VAL(finfo.position_information.out.position, 1000);
1998
1999         finfo.position_information.in.file.fnum = fnum2;
2000         status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo);
2001         CHECK_STATUS(status, NT_STATUS_OK);
2002         CHECK_VAL(finfo.position_information.out.position, 1000);
2003
2004
2005         smbcli_close(cli->tree, fnum1);
2006         smbcli_close(cli->tree, fnum2);
2007
2008         torture_comment(tctx, "openx twice with RDWR/DENY_NONE\n");
2009         io.openx.in.open_mode = OPENX_MODE_ACCESS_RDWR | OPENX_MODE_DENY_NONE;
2010         status = smb_raw_open(cli->tree, mem_ctx, &io);
2011         CHECK_STATUS(status, NT_STATUS_OK);
2012         fnum1 = io.openx.out.file.fnum;
2013
2014         io.openx.in.open_func = OPENX_OPEN_FUNC_OPEN;
2015         status = smb_raw_open(cli->tree, mem_ctx, &io);
2016         CHECK_STATUS(status, NT_STATUS_OK);
2017         fnum2 = io.openx.out.file.fnum;
2018
2019         torture_comment(tctx, "fnum1=%d fnum2=%d\n", fnum1, fnum2);
2020
2021         torture_comment(tctx, "two handles should be separate\n");
2022         sfinfo.generic.level = RAW_SFILEINFO_POSITION_INFORMATION;
2023         sfinfo.position_information.in.file.fnum = fnum1;
2024         sfinfo.position_information.in.position = 1000;
2025         status = smb_raw_setfileinfo(cli->tree, &sfinfo);
2026         CHECK_STATUS(status, NT_STATUS_OK);
2027
2028         finfo.position_information.level = RAW_FILEINFO_POSITION_INFORMATION;
2029         finfo.position_information.in.file.fnum = fnum1;
2030         status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo);
2031         CHECK_STATUS(status, NT_STATUS_OK);
2032         CHECK_VAL(finfo.position_information.out.position, 1000);
2033
2034         finfo.position_information.in.file.fnum = fnum2;
2035         status = smb_raw_fileinfo(cli->tree, mem_ctx, &finfo);
2036         CHECK_STATUS(status, NT_STATUS_OK);
2037         CHECK_VAL(finfo.position_information.out.position, 0);
2038
2039 done:
2040         smbcli_close(cli->tree, fnum1);
2041         smbcli_close(cli->tree, fnum2);
2042         smbcli_unlink(cli->tree, fname);
2043
2044         return ret;
2045 }
2046
2047 #define CXD_MATCHES(_cxd, i)                                            \
2048         ((cxd_known[i].cxd_test == (_cxd)->cxd_test) &&                 \
2049          (cxd_known[i].cxd_flags == (_cxd)->cxd_flags) &&               \
2050          (cxd_known[i].cxd_access1 == (_cxd)->cxd_access1) &&           \
2051          (cxd_known[i].cxd_sharemode1 == (_cxd)->cxd_sharemode1) &&     \
2052          (cxd_known[i].cxd_access2 == (_cxd)->cxd_access2) &&           \
2053          (cxd_known[i].cxd_sharemode2 == (_cxd)->cxd_sharemode2))
2054
2055 static int cxd_find_known(struct createx_data *cxd)
2056 {
2057         static int i = -1;
2058
2059         /* Optimization for tests which we don't have results saved for. */
2060         if ((cxd->cxd_test == CXD_TEST_CREATEX_ACCESS_EXHAUSTIVE) ||
2061             (cxd->cxd_test == CXD_TEST_CREATEX_SHAREMODE_EXTENDED))
2062                 return -1;
2063
2064         /* Optimization: If our cxd_known table is too large, it hurts test
2065          * performance to search through the entire table each time. If the
2066          * caller can pass in the previous result, we can try the next entry.
2067          * This works if results are taken directly from the same code. */
2068         i++;
2069         if ((i >= 0) && (i < sizeof(cxd_known) / sizeof(cxd_known[0])) &&
2070             CXD_MATCHES(cxd, i))
2071                 return i;
2072
2073         for (i = 0; i < (sizeof(cxd_known) / sizeof(cxd_known[0])); i++) {
2074                 if (CXD_MATCHES(cxd, i))
2075                         return i;
2076         }
2077
2078         return -1;
2079 }
2080
2081 #define FILL_NTCREATEX(_struct, _init...)                       \
2082         do {                                                    \
2083                 (_struct)->generic.level = RAW_OPEN_NTCREATEX;  \
2084                 (_struct)->ntcreatex.in                         \
2085                     = (typeof((_struct)->ntcreatex.in)) {_init};\
2086         } while (0)
2087
2088 #define CREATEX_NAME "\\createx_dir"
2089
2090 static bool createx_make_dir(struct torture_context *tctx,
2091     struct smbcli_tree *tree, TALLOC_CTX *mem_ctx, const char *fname)
2092 {
2093         bool ret = true;
2094         NTSTATUS status;
2095
2096         status = smbcli_mkdir(tree, fname);
2097         CHECK_STATUS(status, NT_STATUS_OK);
2098
2099  done:
2100         return ret;
2101 }
2102
2103 static bool createx_make_file(struct torture_context *tctx,
2104     struct smbcli_tree *tree, TALLOC_CTX *mem_ctx, const char *fname)
2105 {
2106         union smb_open open_parms;
2107         bool ret = true;
2108         NTSTATUS status;
2109
2110         FILL_NTCREATEX(&open_parms,
2111             .flags = 0,
2112             .access_mask = SEC_RIGHTS_FILE_ALL,
2113             .file_attr = FILE_ATTRIBUTE_NORMAL,
2114             .share_access = 0,
2115             .open_disposition = NTCREATEX_DISP_CREATE,
2116             .create_options = 0,
2117             .fname = fname,
2118         );
2119         status = smb_raw_open(tree, mem_ctx, &open_parms);
2120         CHECK_STATUS(status, NT_STATUS_OK);
2121
2122         status = smbcli_close(tree, open_parms.ntcreatex.out.file.fnum);
2123         CHECK_STATUS(status, NT_STATUS_OK);
2124
2125  done:
2126         return ret;
2127 }
2128
2129 static void createx_fill_dir(union smb_open *open_parms, int accessmode,
2130     int sharemode, const char *fname)
2131 {
2132         FILL_NTCREATEX(open_parms,
2133             .flags = 0,
2134             .access_mask = accessmode,
2135             .file_attr = FILE_ATTRIBUTE_DIRECTORY,
2136             .share_access = sharemode,
2137             .open_disposition = NTCREATEX_DISP_OPEN_IF,
2138             .create_options = NTCREATEX_OPTIONS_DIRECTORY,
2139             .fname = fname,
2140         );
2141 }
2142
2143 static void createx_fill_file(union smb_open *open_parms, int accessmode,
2144     int sharemode, const char *fname)
2145 {
2146         FILL_NTCREATEX(open_parms,
2147             .flags = 0,
2148             .access_mask = accessmode,
2149             .file_attr = FILE_ATTRIBUTE_NORMAL,
2150             .share_access = sharemode,
2151             .open_disposition = NTCREATEX_DISP_OPEN_IF,
2152             .create_options = 0,
2153             .fname = fname,
2154             .root_fid = { .fnum = 0 },
2155         );
2156 }
2157
2158 static int data_file_fd = -1;
2159
2160 #define KNOWN   "known"
2161 #define CHILD   "child"
2162 static bool createx_test_dir(struct torture_context *tctx,
2163     struct smbcli_tree *tree, int fnum, TALLOC_CTX *mem_ctx, NTSTATUS *result)
2164 {
2165         bool ret = true;
2166         NTSTATUS status;
2167         union smb_open open_parms;
2168
2169         /* bypass original handle to guarantee creation */
2170         FILL_NTCREATEX(&open_parms,
2171             .flags = 0,
2172             .access_mask = SEC_RIGHTS_FILE_ALL,
2173             .file_attr = FILE_ATTRIBUTE_NORMAL,
2174             .share_access = 0,
2175             .open_disposition = NTCREATEX_DISP_CREATE,
2176             .create_options = 0,
2177             .fname = CREATEX_NAME "\\" KNOWN,
2178         );
2179         status = smb_raw_open(tree, mem_ctx, &open_parms);
2180         CHECK_STATUS(status, NT_STATUS_OK);
2181         smbcli_close(tree, open_parms.ntcreatex.out.file.fnum);
2182
2183         result[CXD_DIR_ENUMERATE] = NT_STATUS_OK;
2184
2185         /* try to create a child */
2186         FILL_NTCREATEX(&open_parms,
2187             .flags = 0,
2188             .access_mask = SEC_RIGHTS_FILE_ALL,
2189             .file_attr = FILE_ATTRIBUTE_NORMAL,
2190             .share_access = 0,
2191             .open_disposition = NTCREATEX_DISP_CREATE,
2192             .create_options = 0,
2193             .fname = CHILD,
2194             .root_fid = { .fnum = fnum },
2195         );
2196
2197         result[CXD_DIR_CREATE_CHILD] =
2198             smb_raw_open(tree, mem_ctx, &open_parms);
2199         smbcli_close(tree, open_parms.ntcreatex.out.file.fnum);
2200
2201         /* try to traverse dir to known good file */
2202         FILL_NTCREATEX(&open_parms,
2203             .flags = 0,
2204             .access_mask = SEC_RIGHTS_FILE_ALL,
2205             .file_attr = FILE_ATTRIBUTE_NORMAL,
2206             .share_access = 0,
2207             .open_disposition = NTCREATEX_DISP_OPEN,
2208             .create_options = 0,
2209             .fname = KNOWN,
2210             .root_fid = {.fnum = fnum},
2211         );
2212
2213         result[CXD_DIR_TRAVERSE] =
2214             smb_raw_open(tree, mem_ctx, &open_parms);
2215
2216
2217         smbcli_close(tree, open_parms.ntcreatex.out.file.fnum);
2218         smbcli_unlink(tree, CREATEX_NAME "\\" KNOWN);
2219         smbcli_unlink(tree, CREATEX_NAME "\\" CHILD);
2220
2221  done:
2222         return ret;
2223 }
2224
2225 static bool createx_test_file(struct torture_context *tctx,
2226     struct smbcli_tree *tree, int fnum, TALLOC_CTX *mem_ctx, NTSTATUS *result)
2227 {
2228         union smb_read rd = {};
2229         union smb_write wr = {};
2230         char buf[256] = "";
2231
2232         rd.readx.level = RAW_READ_READX;
2233         rd.readx.in.file.fnum = fnum;
2234         rd.readx.in.mincnt = sizeof(buf);
2235         rd.readx.in.maxcnt = sizeof(buf);
2236         rd.readx.out.data = (uint8_t *)buf;
2237
2238         result[CXD_FILE_READ] = smb_raw_read(tree, &rd);
2239
2240         wr.writex.level = RAW_WRITE_WRITEX;
2241         wr.writex.in.file.fnum = fnum;
2242         wr.writex.in.count = sizeof(buf);
2243         wr.writex.in.data = (uint8_t *)buf;
2244
2245         result[CXD_FILE_WRITE] = smb_raw_write(tree, &wr);
2246
2247         memset(&rd, 0, sizeof(rd));
2248         rd.readx.level = RAW_READ_READX;
2249         rd.readx.in.file.fnum = fnum;
2250         rd.readx.in.mincnt = sizeof(buf);
2251         rd.readx.in.maxcnt = sizeof(buf);
2252         rd.readx.in.read_for_execute = 1;
2253         rd.readx.out.data = (uint8_t *)buf;
2254
2255         result[CXD_FILE_EXECUTE] = smb_raw_read(tree, &rd);
2256
2257         return true;
2258 }
2259
2260 /* TODO When redirecting stdout to a file, the progress bar really screws up
2261  * the output. Could use a switch "--noprogress", or direct the progress bar to
2262  * stderr? No other solution? */
2263 static void createx_progress_bar(struct torture_context *tctx, uint_t i,
2264     uint_t total, uint_t skipped)
2265 {
2266         if (torture_setting_bool(tctx, "progress", true)) {
2267                 torture_comment(tctx, "%5d/%5d (%d skipped)\r", i, total,
2268                     skipped);
2269                 fflush(stdout);
2270         }
2271 }
2272
2273 static bool torture_createx_specific(struct torture_context *tctx, struct
2274     smbcli_state *cli, struct smbcli_state *cli2, TALLOC_CTX *mem_ctx, struct
2275     createx_data *cxd, int estimated_count)
2276 {
2277         static int call_count = 1;
2278         static int unskipped_call_count = 1;
2279         const char *fname = CREATEX_NAME;
2280         int fnum = -1, fnum2 = -1, res, i;
2281         union smb_open open_parms1, open_parms2;
2282         bool ret = true;
2283         bool is_dir = cxd->cxd_flags & CXD_FLAGS_DIRECTORY;
2284         NTSTATUS *result = &cxd->cxd_result[0];
2285         NTSTATUS *result2 = &cxd->cxd_result2[0];
2286         bool found = false, failed = false;
2287
2288         bool (*make_func)(struct torture_context *,
2289             struct smbcli_tree *, TALLOC_CTX *, const char *);
2290         void (*fill_func)(union smb_open *, int, int, const char *);
2291         bool (*test_func)(struct torture_context *,
2292             struct smbcli_tree *, int, TALLOC_CTX *, NTSTATUS *);
2293         NTSTATUS (*destroy_func)(struct smbcli_tree *, const char *);
2294
2295         if (is_dir) {
2296                 make_func = createx_make_dir;
2297                 fill_func = createx_fill_dir;
2298                 test_func = createx_test_dir;
2299                 destroy_func = smbcli_rmdir;
2300         } else {
2301                 make_func = createx_make_file;
2302                 fill_func = createx_fill_file;
2303                 test_func = createx_test_file;
2304                 destroy_func = smbcli_unlink;
2305         }
2306
2307         /* Skip all SACL related tests. */
2308         if ((!torture_setting_bool(tctx, "sacl_support", true)) &&
2309             ((cxd->cxd_access1 & SEC_FLAG_SYSTEM_SECURITY) ||
2310              (cxd->cxd_access2 & SEC_FLAG_SYSTEM_SECURITY)))
2311                 goto done;
2312
2313         if (cxd->cxd_flags & CXD_FLAGS_MAKE_BEFORE_CREATEX) {
2314                 ret = make_func(tctx, cli->tree, mem_ctx, fname);
2315                 if (!ret) {
2316                         torture_result(tctx, TORTURE_FAIL,
2317                                 "Initial creation failed\n");
2318                         goto done;
2319                 }
2320         }
2321
2322         /* Initialize. */
2323         fill_func(&open_parms1, cxd->cxd_access1, cxd->cxd_sharemode1, fname);
2324
2325         if (cxd->cxd_test == CXD_TEST_CREATEX_SHAREMODE) {
2326                 fill_func(&open_parms2, cxd->cxd_access2, cxd->cxd_sharemode2,
2327                     fname);
2328         }
2329
2330         for (i = CXD_CREATEX + 1; i < CXD_MAX; i++) {
2331                 result[i] = NT_STATUS_UNSUCCESSFUL;
2332                 result2[i] = NT_STATUS_UNSUCCESSFUL;
2333         }
2334
2335         /* Perform open(s). */
2336         result[CXD_CREATEX] = smb_raw_open(cli->tree, mem_ctx, &open_parms1);
2337         if (NT_STATUS_IS_OK(result[CXD_CREATEX])) {
2338                 fnum = open_parms1.ntcreatex.out.file.fnum;
2339                 ret = test_func(tctx, cli->tree, fnum, mem_ctx, result);
2340                 smbcli_close(cli->tree, fnum);
2341         }
2342
2343         if (cxd->cxd_test == CXD_TEST_CREATEX_SHAREMODE) {
2344                 result2[CXD_CREATEX] = smb_raw_open(cli2->tree, mem_ctx,
2345                     &open_parms2);
2346                 if (NT_STATUS_IS_OK(result2[CXD_CREATEX])) {
2347                         fnum2 = open_parms2.ntcreatex.out.file.fnum;
2348                         ret = test_func(tctx, cli2->tree, fnum2, mem_ctx,
2349                             result2);
2350                         smbcli_close(cli2->tree, fnum2);
2351                 }
2352         }
2353
2354         if (data_file_fd >= 0) {
2355                 found = true;
2356                 res = write(data_file_fd, &cxd, sizeof(cxd));
2357                 if (res != sizeof(cxd)) {
2358                         torture_result(tctx, TORTURE_FAIL,
2359                                 "(%s): write failed: %s!",
2360                                 __location__, strerror(errno));
2361                         ret = false;
2362                 }
2363         } else if ((res = cxd_find_known(cxd)) >= 0) {
2364                 found = true;
2365                 for (i = 0; i < CXD_MAX; i++) {
2366                         /* Note: COMPARE_STATUS will set the "failed" bool. */
2367                         COMPARE_STATUS(result[i], cxd_known[res].cxd_result[i]);
2368                         if (i == 0 && !NT_STATUS_IS_OK(result[i]))
2369                                 break;
2370
2371                         if (cxd->cxd_test == CXD_TEST_CREATEX_SHAREMODE) {
2372                                 COMPARE_STATUS(result2[i],
2373                                     cxd_known[res].cxd_result2[i]);
2374                                 if (i == 0 && !NT_STATUS_IS_OK(result2[i]))
2375                                         break;
2376                         }
2377                 }
2378         }
2379
2380         /* We print if its not in the "cxd_known" list or if we fail. */
2381         if (!found || failed) {
2382                 torture_comment(tctx,
2383                     "  { .cxd_test = %d, .cxd_flags = %#3x, "
2384                     ".cxd_access1 = %#10x, .cxd_sharemode1=%1x, "
2385                     ".cxd_access2=%#10x, .cxd_sharemode2=%1x, "
2386                     ".cxd_result = { ", cxd->cxd_test, cxd->cxd_flags,
2387                     cxd->cxd_access1, cxd->cxd_sharemode1, cxd->cxd_access2,
2388                     cxd->cxd_sharemode2);
2389                 for (i = 0; i < CXD_MAX; i++) {
2390                         torture_comment(tctx, "%s, ", nt_errstr(result[i]));
2391                         if (i == 0 && !NT_STATUS_IS_OK(result[i]))
2392                                 break;
2393                 }
2394                 torture_comment(tctx, "}");
2395                 if (cxd->cxd_test == CXD_TEST_CREATEX_SHAREMODE) {
2396                         torture_comment(tctx, ", .cxd_result2 = { ");
2397                         for (i = 0; i < CXD_MAX; i++) {
2398                                 torture_comment(tctx, "%s, ",
2399                                                 nt_errstr(result2[i]));
2400                                 if (i == 0 && !NT_STATUS_IS_OK(result2[i]))
2401                                         break;
2402                         }
2403                         torture_comment(tctx, "}");
2404                 }
2405                 torture_comment(tctx, "}, \n");
2406         } else {
2407                 createx_progress_bar(tctx, call_count, estimated_count,
2408                     call_count - unskipped_call_count);
2409         }
2410         /* Count tests that we didn't skip. */
2411         unskipped_call_count++;
2412  done:
2413         call_count++;
2414
2415         destroy_func(cli->tree, fname);
2416         return ret;
2417 }
2418
2419 uint32_t sec_access_bit_groups[] = {
2420         SEC_RIGHTS_FILE_READ,
2421         SEC_RIGHTS_FILE_WRITE,
2422         SEC_RIGHTS_FILE_EXECUTE
2423 };
2424 #define NUM_ACCESS_GROUPS     (sizeof(sec_access_bit_groups) / sizeof(uint32_t))
2425 #define ACCESS_GROUPS_COUNT   ((1 << NUM_ACCESS_GROUPS))
2426 #define BITSINBYTE 8
2427
2428 /* Note: See NTCREATEX_SHARE_ACCESS_{NONE,READ,WRITE,DELETE} for share mode
2429  * declarations. */
2430 #define NUM_SHAREMODE_PERMUTATIONS 8
2431
2432 /**
2433  * NTCREATEX and SHARE MODE test.
2434  *
2435  * Open with combinations of (access_mode, share_mode).
2436  *  - Check status
2437  * Open 2nd time with combination of (access_mode2, share_mode2).
2438  *  - Check status
2439  * Perform operations to verify?
2440  *  - Read
2441  *  - Write
2442  *  - Delete
2443  */
2444 bool torture_createx_sharemodes(struct torture_context *tctx,
2445                                 struct smbcli_state *cli,
2446                                 struct smbcli_state *cli2,
2447                                 bool dir,
2448                                 bool extended)
2449 {
2450         TALLOC_CTX *mem_ctx;
2451         bool ret = true;
2452         int i, j, est;
2453         int gp1, gp2; /* group permuters */
2454         struct createx_data cxd = {0};
2455         int num_access_bits1 = sizeof(cxd.cxd_access1) * BITSINBYTE;
2456         int num_access_bits2 = sizeof(cxd.cxd_access2) * BITSINBYTE;
2457
2458         mem_ctx = talloc_init("createx_sharemodes");
2459         if (!mem_ctx)
2460                 return false;
2461
2462         if (!torture_setting_bool(tctx, "sacl_support", true))
2463                 torture_warning(tctx, "Skipping SACL related tests!\n");
2464
2465         cxd.cxd_test = extended ? CXD_TEST_CREATEX_SHAREMODE_EXTENDED :
2466             CXD_TEST_CREATEX_SHAREMODE;
2467         cxd.cxd_flags = dir ? CXD_FLAGS_DIRECTORY: 0;
2468
2469         /* HACK for progress bar: figure out estimated count. */
2470         est = (NUM_SHAREMODE_PERMUTATIONS * NUM_SHAREMODE_PERMUTATIONS) *
2471             ((ACCESS_GROUPS_COUNT * ACCESS_GROUPS_COUNT) +
2472              (extended ? num_access_bits1 * num_access_bits2 : 0));
2473
2474         /* Blank slate. */
2475         smbcli_deltree(cli->tree, CREATEX_NAME);
2476         smbcli_unlink(cli->tree, CREATEX_NAME);
2477
2478         /* Choose 2 random share modes. */
2479         for (cxd.cxd_sharemode1 = 0;
2480              cxd.cxd_sharemode1 < NUM_SHAREMODE_PERMUTATIONS;
2481              cxd.cxd_sharemode1++) {
2482                 for (cxd.cxd_sharemode2 = 0;
2483                      cxd.cxd_sharemode2 < NUM_SHAREMODE_PERMUTATIONS;
2484                      cxd.cxd_sharemode2++) {
2485
2486                         /* Permutate through our access_bit_groups. */
2487                         for (gp1 = 0; gp1 < ACCESS_GROUPS_COUNT; gp1++) {
2488                                 for (gp2 = 0; gp2 < ACCESS_GROUPS_COUNT; gp2++)
2489                                 {
2490                                         cxd.cxd_access1 = cxd.cxd_access2 = 0;
2491
2492                                         for (i = 0; i < NUM_ACCESS_GROUPS; i++)
2493                                         {
2494                                                 cxd.cxd_access1 |=
2495                                                     (gp1 & (1 << i)) ?
2496                                                     sec_access_bit_groups[i]:0;
2497                                                 cxd.cxd_access2 |=
2498                                                     (gp2 & (1 << i)) ?
2499                                                     sec_access_bit_groups[i]:0;
2500                                         }
2501
2502                                         torture_createx_specific(tctx, cli,
2503                                            cli2, mem_ctx, &cxd, est);
2504                                 }
2505                         }
2506
2507                         /* Only do the single access bits on an extended run. */
2508                         if (!extended)
2509                                 continue;
2510
2511                         for (i = 0; i < num_access_bits1; i++) {
2512                                 for (j = 0; j < num_access_bits2; j++) {
2513                                         cxd.cxd_access1 = 1ull << i;
2514                                         cxd.cxd_access2 = 1ull << j;
2515
2516                                         torture_createx_specific(tctx, cli,
2517                                             cli2, mem_ctx, &cxd, est);
2518                                 }
2519                         }
2520                 }
2521         }
2522         torture_comment(tctx, "\n");
2523
2524         talloc_free(mem_ctx);
2525         return ret;
2526 }
2527
2528 bool torture_createx_sharemodes_file(struct torture_context *tctx,
2529     struct smbcli_state *cli, struct smbcli_state *cli2)
2530 {
2531         return torture_createx_sharemodes(tctx, cli, cli2, false, false);
2532 }
2533
2534 bool torture_createx_sharemodes_dir(struct torture_context *tctx,
2535     struct smbcli_state *cli, struct smbcli_state *cli2)
2536 {
2537         return torture_createx_sharemodes(tctx, cli, cli2, true, false);
2538 }
2539
2540 bool torture_createx_access(struct torture_context *tctx,
2541     struct smbcli_state *cli)
2542 {
2543         TALLOC_CTX *mem_ctx;
2544         bool ret = true;
2545         uint32_t group_permuter;
2546         uint32_t i;
2547         struct createx_data cxd = {0};
2548         int est;
2549         int num_access_bits = sizeof(cxd.cxd_access1) * BITSINBYTE;
2550
2551         mem_ctx = talloc_init("createx_dir");
2552         if (!mem_ctx)
2553                 return false;
2554
2555         if (!torture_setting_bool(tctx, "sacl_support", true))
2556                 torture_warning(tctx, "Skipping SACL related tests!\n");
2557
2558         cxd.cxd_test = CXD_TEST_CREATEX_ACCESS;
2559
2560         /* HACK for progress bar: figure out estimated count. */
2561         est = CXD_FLAGS_COUNT * (ACCESS_GROUPS_COUNT + (num_access_bits * 3));
2562
2563         /* Blank slate. */
2564         smbcli_deltree(cli->tree, CREATEX_NAME);
2565         smbcli_unlink(cli->tree, CREATEX_NAME);
2566
2567         for (cxd.cxd_flags = 0; cxd.cxd_flags <= CXD_FLAGS_MASK;
2568              cxd.cxd_flags++) {
2569                 /**
2570                  * This implements a basic permutation of all elements of
2571                  * 'bit_group'.  group_permuter is a bit field representing
2572                  * which groups to turn on.
2573                 */
2574                 for (group_permuter = 0; group_permuter < (1 <<
2575                         NUM_ACCESS_GROUPS); group_permuter++) {
2576                         for (i = 0, cxd.cxd_access1 = 0;
2577                              i < NUM_ACCESS_GROUPS; i++) {
2578                                 cxd.cxd_access1 |= (group_permuter & (1 << i))
2579                                     ? sec_access_bit_groups[i] : 0;
2580                         }
2581
2582                         torture_createx_specific(tctx, cli, NULL, mem_ctx,
2583                             &cxd, est);
2584                 }
2585                 for (i = 0; i < num_access_bits; i++) {
2586                         /* And now run through the single access bits. */
2587                         cxd.cxd_access1 = 1 << i;
2588                         torture_createx_specific(tctx, cli, NULL, mem_ctx,
2589                             &cxd, est);
2590
2591                         /* Does SEC_FLAG_MAXIMUM_ALLOWED override? */
2592                         cxd.cxd_access1 |= SEC_FLAG_MAXIMUM_ALLOWED;
2593                         torture_createx_specific(tctx, cli, NULL, mem_ctx,
2594                             &cxd, est);
2595
2596                         /* What about SEC_FLAG_SYSTEM_SECURITY? */
2597                         cxd.cxd_access1 |= SEC_FLAG_SYSTEM_SECURITY;
2598                         torture_createx_specific(tctx, cli, NULL, mem_ctx,
2599                             &cxd, est);
2600                 }
2601         }
2602
2603         talloc_free(mem_ctx);
2604         return ret;
2605 }
2606
2607 #define ACCESS_KNOWN_MASK 0xF31F01FFull
2608
2609 bool torture_createx_access_exhaustive(struct torture_context *tctx,
2610     struct smbcli_state *cli)
2611 {
2612         char *data_file;
2613         TALLOC_CTX *mem_ctx;
2614         bool ret = true, first;
2615         uint32_t i;
2616         struct createx_data cxd = {0};
2617
2618         mem_ctx = talloc_init("createx_dir");
2619         if (!mem_ctx)
2620                 return false;
2621
2622         if (!torture_setting_bool(tctx, "sacl_support", true))
2623                 torture_warning(tctx, "Skipping SACL related tests!\n");
2624
2625         data_file = getenv("CREATEX_DATA");
2626         if (data_file) {
2627                 data_file_fd = open(data_file, O_WRONLY|O_CREAT|O_TRUNC, 0666);
2628                 if (data_file_fd < 0) {
2629                         torture_result(tctx, TORTURE_FAIL,
2630                                 "(%s): data file open failedu: %s!",
2631                                 __location__, strerror(errno));
2632                         ret = false;
2633                         goto done;
2634                 }
2635         }
2636
2637         /* Blank slate. */
2638         smbcli_deltree(cli->tree, CREATEX_NAME);
2639         smbcli_unlink(cli->tree, CREATEX_NAME);
2640
2641         cxd.cxd_test = CXD_TEST_CREATEX_ACCESS_EXHAUSTIVE;
2642
2643         for (cxd.cxd_flags = 0; cxd.cxd_flags <= CXD_FLAGS_MASK;
2644              cxd.cxd_flags++) {
2645                 for (i = 0, first = true; (i != 0) || first; first = false,
2646                      i = ((i | ~ACCESS_KNOWN_MASK) + 1) & ACCESS_KNOWN_MASK) {
2647                         cxd.cxd_access1 = i;
2648                         ret = torture_createx_specific(tctx, cli, NULL,
2649                             mem_ctx, &cxd, 0);
2650                         if (!ret)
2651                                 break;
2652                 }
2653         }
2654
2655         close(data_file_fd);
2656         data_file_fd = -1;
2657
2658  done:
2659         talloc_free(mem_ctx);
2660         return ret;
2661 }
2662
2663 #define MAXIMUM_ALLOWED_FILE    "torture_maximum_allowed"
2664 bool torture_maximum_allowed(struct torture_context *tctx,
2665     struct smbcli_state *cli)
2666 {
2667         struct security_descriptor *sd, *sd_orig;
2668         union smb_open io = {};
2669         static TALLOC_CTX *mem_ctx;
2670         int fnum, i;
2671         bool ret = true;
2672         NTSTATUS status;
2673         union smb_fileinfo q;
2674         const char *owner_sid;
2675         bool has_restore_privilege, has_backup_privilege;
2676
2677         mem_ctx = talloc_init("torture_maximum_allowed");
2678
2679         if (!torture_setting_bool(tctx, "sacl_support", true))
2680                 torture_warning(tctx, "Skipping SACL related tests!\n");
2681
2682         sd = security_descriptor_dacl_create(mem_ctx,
2683             0, NULL, NULL,
2684             SID_NT_AUTHENTICATED_USERS,
2685             SEC_ACE_TYPE_ACCESS_ALLOWED,
2686             SEC_RIGHTS_FILE_READ,
2687             0, NULL);
2688
2689         /* Blank slate */
2690         smbcli_unlink(cli->tree, MAXIMUM_ALLOWED_FILE);
2691
2692         /* create initial file with restrictive SD */
2693         io.generic.level = RAW_OPEN_NTTRANS_CREATE;
2694         io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL;
2695         io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
2696         io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE;
2697         io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS;
2698         io.ntcreatex.in.fname = MAXIMUM_ALLOWED_FILE;
2699         io.ntcreatex.in.sec_desc = sd;
2700
2701         status = smb_raw_open(cli->tree, mem_ctx, &io);
2702         CHECK_STATUS(status, NT_STATUS_OK);
2703         fnum = io.ntcreatex.out.file.fnum;
2704
2705         /* the correct answers for this test depends on whether the
2706            user has restore privileges. To find that out we first need
2707            to know our SID - get it from the owner_sid of the file we
2708            just created */
2709         q.query_secdesc.level = RAW_FILEINFO_SEC_DESC;
2710         q.query_secdesc.in.file.fnum = fnum;
2711         q.query_secdesc.in.secinfo_flags = SECINFO_DACL | SECINFO_OWNER;
2712         status = smb_raw_fileinfo(cli->tree, tctx, &q);
2713         CHECK_STATUS(status, NT_STATUS_OK);
2714         sd_orig = q.query_secdesc.out.sd;
2715
2716         owner_sid = dom_sid_string(tctx, sd_orig->owner_sid);
2717
2718         status = smblsa_sid_check_privilege(cli, 
2719                                             owner_sid, 
2720                                             sec_privilege_name(SEC_PRIV_RESTORE));
2721         has_restore_privilege = NT_STATUS_IS_OK(status);
2722         torture_comment(tctx, "Checked SEC_PRIV_RESTORE - %s\n", has_restore_privilege?"Yes":"No");
2723
2724         status = smblsa_sid_check_privilege(cli, 
2725                                             owner_sid, 
2726                                             sec_privilege_name(SEC_PRIV_BACKUP));
2727         has_backup_privilege = NT_STATUS_IS_OK(status);
2728         torture_comment(tctx, "Checked SEC_PRIV_BACKUP - %s\n", has_backup_privilege?"Yes":"No");
2729
2730         smbcli_close(cli->tree, fnum);
2731
2732         for (i = 0; i < 32; i++) {
2733                 uint32_t mask = SEC_FLAG_MAXIMUM_ALLOWED | (1u << i);
2734                 uint32_t ok_mask = SEC_RIGHTS_FILE_READ | SEC_GENERIC_READ | 
2735                         SEC_STD_DELETE | SEC_STD_WRITE_DAC;
2736
2737                 if (has_restore_privilege) {
2738                         ok_mask |= SEC_RIGHTS_PRIV_RESTORE;
2739                 }
2740                 if (has_backup_privilege) {
2741                         ok_mask |= SEC_RIGHTS_PRIV_BACKUP;
2742                 }
2743
2744                 /* Skip all SACL related tests. */
2745                 if ((!torture_setting_bool(tctx, "sacl_support", true)) &&
2746                     (mask & SEC_FLAG_SYSTEM_SECURITY))
2747                         continue;
2748
2749                 memset(&io, 0, sizeof(io));
2750                 io.generic.level = RAW_OPEN_NTTRANS_CREATE;
2751                 io.ntcreatex.in.access_mask = mask;
2752                 io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
2753                 io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN;
2754                 io.ntcreatex.in.impersonation =
2755                     NTCREATEX_IMPERSONATION_ANONYMOUS;
2756                 io.ntcreatex.in.fname = MAXIMUM_ALLOWED_FILE;
2757
2758                 status = smb_raw_open(cli->tree, mem_ctx, &io);
2759                 if (mask & ok_mask ||
2760                     mask == SEC_FLAG_MAXIMUM_ALLOWED) {
2761                         CHECK_STATUS(status, NT_STATUS_OK);
2762                 } else {
2763                         if (mask & SEC_FLAG_SYSTEM_SECURITY) {
2764                                 CHECK_STATUS(status, NT_STATUS_PRIVILEGE_NOT_HELD);
2765                         } else {
2766                                 CHECK_STATUS(status, NT_STATUS_ACCESS_DENIED);
2767                         }
2768                 }
2769
2770                 fnum = io.ntcreatex.out.file.fnum;
2771
2772                 smbcli_close(cli->tree, fnum);
2773         }
2774
2775  done:
2776         return ret;
2777 }