• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src/router/samba-3.5.8/source4/torture/basic/
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
31extern int torture_failures;
32
33#define CHECK_MAX_FAILURES(label) do { if (++failures >= torture_failures) goto label; } while (0)
34
35enum deny_result {A_0=0, A_X=1, A_R=2, A_W=3, A_RW=5};
36
37static 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
57static 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
74static 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
92static 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
749static 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
1406static 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 */
1417bool 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
1494failed:
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 */
1507bool 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
1581failed:
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 */
1595bool 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
1626struct bit_value {
1627	uint32_t value;
1628	const char *name;
1629};
1630
1631static 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
1643static 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*/
1664static 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 */
1728static 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 = 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
1884failed:
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 */
1896bool 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 */
1911bool 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*/
1947bool 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
2039done:
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
2055static 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
2090static 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
2103static 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
2129static 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
2143static 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	);
2155}
2156
2157static int data_file_fd = -1;
2158
2159#define KNOWN   "known"
2160#define CHILD   "child"
2161static bool createx_test_dir(struct torture_context *tctx,
2162    struct smbcli_tree *tree, int fnum, TALLOC_CTX *mem_ctx, NTSTATUS *result)
2163{
2164	bool ret = true;
2165	NTSTATUS status;
2166	union smb_open open_parms;
2167
2168	/* bypass original handle to guarantee creation */
2169	FILL_NTCREATEX(&open_parms,
2170	    .flags = 0,
2171	    .access_mask = SEC_RIGHTS_FILE_ALL,
2172	    .file_attr = FILE_ATTRIBUTE_NORMAL,
2173	    .share_access = 0,
2174	    .open_disposition = NTCREATEX_DISP_CREATE,
2175	    .create_options = 0,
2176	    .fname = CREATEX_NAME "\\" KNOWN,
2177	);
2178	status = smb_raw_open(tree, mem_ctx, &open_parms);
2179	CHECK_STATUS(status, NT_STATUS_OK);
2180	smbcli_close(tree, open_parms.ntcreatex.out.file.fnum);
2181
2182	result[CXD_DIR_ENUMERATE] = NT_STATUS_OK;
2183
2184	/* try to create a child */
2185	FILL_NTCREATEX(&open_parms,
2186	    .flags = 0,
2187	    .access_mask = SEC_RIGHTS_FILE_ALL,
2188	    .file_attr = FILE_ATTRIBUTE_NORMAL,
2189	    .share_access = 0,
2190	    .open_disposition = NTCREATEX_DISP_CREATE,
2191	    .create_options = 0,
2192	    .fname = CHILD,
2193	    .root_fid = fnum,
2194	);
2195
2196	result[CXD_DIR_CREATE_CHILD] =
2197	    smb_raw_open(tree, mem_ctx, &open_parms);
2198	smbcli_close(tree, open_parms.ntcreatex.out.file.fnum);
2199
2200	/* try to traverse dir to known good file */
2201	FILL_NTCREATEX(&open_parms,
2202	    .flags = 0,
2203	    .access_mask = SEC_RIGHTS_FILE_ALL,
2204	    .file_attr = FILE_ATTRIBUTE_NORMAL,
2205	    .share_access = 0,
2206	    .open_disposition = NTCREATEX_DISP_OPEN,
2207	    .create_options = 0,
2208	    .fname = KNOWN,
2209	    .root_fid = fnum,
2210	);
2211
2212	result[CXD_DIR_TRAVERSE] =
2213	    smb_raw_open(tree, mem_ctx, &open_parms);
2214
2215
2216	smbcli_close(tree, open_parms.ntcreatex.out.file.fnum);
2217	smbcli_unlink(tree, CREATEX_NAME "\\" KNOWN);
2218	smbcli_unlink(tree, CREATEX_NAME "\\" CHILD);
2219
2220 done:
2221	return ret;
2222}
2223
2224static bool createx_test_file(struct torture_context *tctx,
2225    struct smbcli_tree *tree, int fnum, TALLOC_CTX *mem_ctx, NTSTATUS *result)
2226{
2227	union smb_read rd = {};
2228	union smb_write wr = {};
2229	char buf[256] = "";
2230
2231	rd.readx.level = RAW_READ_READX;
2232	rd.readx.in.file.fnum = fnum;
2233	rd.readx.in.mincnt = sizeof(buf);
2234	rd.readx.in.maxcnt = sizeof(buf);
2235	rd.readx.out.data = buf;
2236
2237	result[CXD_FILE_READ] = smb_raw_read(tree, &rd);
2238
2239	wr.writex.level = RAW_WRITE_WRITEX;
2240	wr.writex.in.file.fnum = fnum;
2241	wr.writex.in.count = sizeof(buf);
2242	wr.writex.in.data = buf;
2243
2244	result[CXD_FILE_WRITE] = smb_raw_write(tree, &wr);
2245
2246	memset(&rd, 0, sizeof(rd));
2247	rd.readx.level = RAW_READ_READX;
2248	rd.readx.in.file.fnum = fnum;
2249	rd.readx.in.mincnt = sizeof(buf);
2250	rd.readx.in.maxcnt = sizeof(buf);
2251	rd.readx.in.read_for_execute = 1;
2252	rd.readx.out.data = buf;
2253
2254	result[CXD_FILE_EXECUTE] = smb_raw_read(tree, &rd);
2255
2256	return true;
2257}
2258
2259/* TODO When redirecting stdout to a file, the progress bar really screws up
2260 * the output. Could use a switch "--noprogress", or direct the progress bar to
2261 * stderr? No other solution? */
2262static void createx_progress_bar(struct torture_context *tctx, uint_t i,
2263    uint_t total, uint_t skipped)
2264{
2265	if (torture_setting_bool(tctx, "progress", true)) {
2266		torture_comment(tctx, "%5d/%5d (%d skipped)\r", i, total,
2267		    skipped);
2268		fflush(stdout);
2269	}
2270}
2271
2272static bool torture_createx_specific(struct torture_context *tctx, struct
2273    smbcli_state *cli, struct smbcli_state *cli2, TALLOC_CTX *mem_ctx, struct
2274    createx_data *cxd, int estimated_count)
2275{
2276	static int call_count = 1;
2277	static int unskipped_call_count = 1;
2278	const char *fname = CREATEX_NAME;
2279	int fnum = -1, fnum2 = -1, res, i;
2280	union smb_open open_parms1, open_parms2;
2281	bool ret = true;
2282	bool is_dir = cxd->cxd_flags & CXD_FLAGS_DIRECTORY;
2283	NTSTATUS *result = &cxd->cxd_result[0];
2284	NTSTATUS *result2 = &cxd->cxd_result2[0];
2285	bool found = false, failed = false;
2286
2287	bool (*make_func)(struct torture_context *,
2288	    struct smbcli_tree *, TALLOC_CTX *, const char *);
2289	void (*fill_func)(union smb_open *, int, int, const char *);
2290	bool (*test_func)(struct torture_context *,
2291	    struct smbcli_tree *, int, TALLOC_CTX *, NTSTATUS *);
2292	NTSTATUS (*destroy_func)(struct smbcli_tree *, const char *);
2293
2294	if (is_dir) {
2295		make_func = createx_make_dir;
2296		fill_func = createx_fill_dir;
2297		test_func = createx_test_dir;
2298		destroy_func = smbcli_rmdir;
2299	} else {
2300		make_func = createx_make_file;
2301		fill_func = createx_fill_file;
2302		test_func = createx_test_file;
2303		destroy_func = smbcli_unlink;
2304	}
2305
2306	/* Skip all SACL related tests. */
2307	if ((!torture_setting_bool(tctx, "sacl_support", true)) &&
2308	    ((cxd->cxd_access1 & SEC_FLAG_SYSTEM_SECURITY) ||
2309	     (cxd->cxd_access2 & SEC_FLAG_SYSTEM_SECURITY)))
2310		goto done;
2311
2312	if (cxd->cxd_flags & CXD_FLAGS_MAKE_BEFORE_CREATEX) {
2313		ret = make_func(tctx, cli->tree, mem_ctx, fname);
2314		if (!ret) {
2315			torture_result(tctx, TORTURE_FAIL,
2316				"Initial creation failed\n");
2317			goto done;
2318		}
2319	}
2320
2321	/* Initialize. */
2322	fill_func(&open_parms1, cxd->cxd_access1, cxd->cxd_sharemode1, fname);
2323
2324	if (cxd->cxd_test == CXD_TEST_CREATEX_SHAREMODE) {
2325		fill_func(&open_parms2, cxd->cxd_access2, cxd->cxd_sharemode2,
2326		    fname);
2327	}
2328
2329	for (i = CXD_CREATEX + 1; i < CXD_MAX; i++) {
2330		result[i] = NT_STATUS_UNSUCCESSFUL;
2331		result2[i] = NT_STATUS_UNSUCCESSFUL;
2332	}
2333
2334	/* Perform open(s). */
2335	result[CXD_CREATEX] = smb_raw_open(cli->tree, mem_ctx, &open_parms1);
2336	if (NT_STATUS_IS_OK(result[CXD_CREATEX])) {
2337		fnum = open_parms1.ntcreatex.out.file.fnum;
2338		ret = test_func(tctx, cli->tree, fnum, mem_ctx, result);
2339		smbcli_close(cli->tree, fnum);
2340	}
2341
2342	if (cxd->cxd_test == CXD_TEST_CREATEX_SHAREMODE) {
2343		result2[CXD_CREATEX] = smb_raw_open(cli2->tree, mem_ctx,
2344		    &open_parms2);
2345		if (NT_STATUS_IS_OK(result2[CXD_CREATEX])) {
2346			fnum2 = open_parms2.ntcreatex.out.file.fnum;
2347			ret = test_func(tctx, cli2->tree, fnum2, mem_ctx,
2348			    result2);
2349			smbcli_close(cli2->tree, fnum2);
2350		}
2351	}
2352
2353	if (data_file_fd >= 0) {
2354		found = true;
2355		res = write(data_file_fd, &cxd, sizeof(cxd));
2356		if (res != sizeof(cxd)) {
2357			torture_result(tctx, TORTURE_FAIL,
2358				"(%s): write failed: %s!",
2359				__location__, strerror(errno));
2360			ret = false;
2361		}
2362	} else if ((res = cxd_find_known(cxd)) >= 0) {
2363		found = true;
2364		for (i = 0; i < CXD_MAX; i++) {
2365			/* Note: COMPARE_STATUS will set the "failed" bool. */
2366			COMPARE_STATUS(result[i], cxd_known[res].cxd_result[i]);
2367			if (i == 0 && !NT_STATUS_IS_OK(result[i]))
2368				break;
2369
2370			if (cxd->cxd_test == CXD_TEST_CREATEX_SHAREMODE) {
2371				COMPARE_STATUS(result2[i],
2372				    cxd_known[res].cxd_result2[i]);
2373				if (i == 0 && !NT_STATUS_IS_OK(result2[i]))
2374					break;
2375			}
2376		}
2377	}
2378
2379	/* We print if its not in the "cxd_known" list or if we fail. */
2380	if (!found || failed) {
2381		torture_comment(tctx,
2382		    "  { .cxd_test = %d, .cxd_flags = %#3x, "
2383		    ".cxd_access1 = %#10x, .cxd_sharemode1=%1x, "
2384		    ".cxd_access2=%#10x, .cxd_sharemode2=%1x, "
2385		    ".cxd_result = { ", cxd->cxd_test, cxd->cxd_flags,
2386		    cxd->cxd_access1, cxd->cxd_sharemode1, cxd->cxd_access2,
2387		    cxd->cxd_sharemode2);
2388		for (i = 0; i < CXD_MAX; i++) {
2389			torture_comment(tctx, "%s, ", nt_errstr(result[i]));
2390			if (i == 0 && !NT_STATUS_IS_OK(result[i]))
2391				break;
2392		}
2393		torture_comment(tctx, "}");
2394		if (cxd->cxd_test == CXD_TEST_CREATEX_SHAREMODE) {
2395			torture_comment(tctx, ", .cxd_result2 = { ");
2396			for (i = 0; i < CXD_MAX; i++) {
2397				torture_comment(tctx, "%s, ",
2398						nt_errstr(result2[i]));
2399				if (i == 0 && !NT_STATUS_IS_OK(result2[i]))
2400					break;
2401			}
2402			torture_comment(tctx, "}");
2403		}
2404		torture_comment(tctx, "}, \n");
2405	} else {
2406		createx_progress_bar(tctx, call_count, estimated_count,
2407		    call_count - unskipped_call_count);
2408	}
2409	/* Count tests that we didn't skip. */
2410	unskipped_call_count++;
2411 done:
2412	call_count++;
2413
2414	destroy_func(cli->tree, fname);
2415	return ret;
2416}
2417
2418uint32_t sec_access_bit_groups[] = {
2419	SEC_RIGHTS_FILE_READ,
2420	SEC_RIGHTS_FILE_WRITE,
2421	SEC_RIGHTS_FILE_EXECUTE
2422};
2423#define NUM_ACCESS_GROUPS     (sizeof(sec_access_bit_groups) / sizeof(uint32_t))
2424#define ACCESS_GROUPS_COUNT   ((1 << NUM_ACCESS_GROUPS))
2425#define BITSINBYTE 8
2426
2427/* Note: See NTCREATEX_SHARE_ACCESS_{NONE,READ,WRITE,DELETE} for share mode
2428 * declarations. */
2429#define NUM_SHAREMODE_PERMUTATIONS 8
2430
2431/**
2432 * NTCREATEX and SHARE MODE test.
2433 *
2434 * Open with combinations of (access_mode, share_mode).
2435 *  - Check status
2436 * Open 2nd time with combination of (access_mode2, share_mode2).
2437 *  - Check status
2438 * Perform operations to verify?
2439 *  - Read
2440 *  - Write
2441 *  - Delete
2442 */
2443bool torture_createx_sharemodes(struct torture_context *tctx,
2444				struct smbcli_state *cli,
2445				struct smbcli_state *cli2,
2446				bool dir,
2447				bool extended)
2448{
2449	TALLOC_CTX *mem_ctx;
2450	bool ret = true;
2451	int i, j, est;
2452	int gp1, gp2; /* group permuters */
2453	struct createx_data cxd = {0};
2454	int num_access_bits1 = sizeof(cxd.cxd_access1) * BITSINBYTE;
2455	int num_access_bits2 = sizeof(cxd.cxd_access2) * BITSINBYTE;
2456
2457	mem_ctx = talloc_init("createx_sharemodes");
2458	if (!mem_ctx)
2459		return false;
2460
2461	if (!torture_setting_bool(tctx, "sacl_support", true))
2462		torture_warning(tctx, "Skipping SACL related tests!\n");
2463
2464	cxd.cxd_test = extended ? CXD_TEST_CREATEX_SHAREMODE_EXTENDED :
2465	    CXD_TEST_CREATEX_SHAREMODE;
2466	cxd.cxd_flags = dir ? CXD_FLAGS_DIRECTORY: 0;
2467
2468	/* HACK for progress bar: figure out estimated count. */
2469	est = (NUM_SHAREMODE_PERMUTATIONS * NUM_SHAREMODE_PERMUTATIONS) *
2470	    ((ACCESS_GROUPS_COUNT * ACCESS_GROUPS_COUNT) +
2471	     (extended ? num_access_bits1 * num_access_bits2 : 0));
2472
2473	/* Blank slate. */
2474	smbcli_deltree(cli->tree, CREATEX_NAME);
2475	smbcli_unlink(cli->tree, CREATEX_NAME);
2476
2477	/* Choose 2 random share modes. */
2478	for (cxd.cxd_sharemode1 = 0;
2479	     cxd.cxd_sharemode1 < NUM_SHAREMODE_PERMUTATIONS;
2480	     cxd.cxd_sharemode1++) {
2481		for (cxd.cxd_sharemode2 = 0;
2482		     cxd.cxd_sharemode2 < NUM_SHAREMODE_PERMUTATIONS;
2483		     cxd.cxd_sharemode2++) {
2484
2485			/* Permutate through our access_bit_groups. */
2486			for (gp1 = 0; gp1 < ACCESS_GROUPS_COUNT; gp1++) {
2487				for (gp2 = 0; gp2 < ACCESS_GROUPS_COUNT; gp2++)
2488				{
2489					cxd.cxd_access1 = cxd.cxd_access2 = 0;
2490
2491					for (i = 0; i < NUM_ACCESS_GROUPS; i++)
2492					{
2493						cxd.cxd_access1 |=
2494						    (gp1 & (1 << i)) ?
2495						    sec_access_bit_groups[i]:0;
2496						cxd.cxd_access2 |=
2497						    (gp2 & (1 << i)) ?
2498						    sec_access_bit_groups[i]:0;
2499					}
2500
2501					torture_createx_specific(tctx, cli,
2502					   cli2, mem_ctx, &cxd, est);
2503				}
2504			}
2505
2506			/* Only do the single access bits on an extended run. */
2507			if (!extended)
2508				continue;
2509
2510			for (i = 0; i < num_access_bits1; i++) {
2511				for (j = 0; j < num_access_bits2; j++) {
2512					cxd.cxd_access1 = 1ull << i;
2513					cxd.cxd_access2 = 1ull << j;
2514
2515					torture_createx_specific(tctx, cli,
2516					    cli2, mem_ctx, &cxd, est);
2517				}
2518			}
2519		}
2520	}
2521	torture_comment(tctx, "\n");
2522
2523	talloc_free(mem_ctx);
2524	return ret;
2525}
2526
2527bool torture_createx_sharemodes_file(struct torture_context *tctx,
2528    struct smbcli_state *cli, struct smbcli_state *cli2)
2529{
2530	return torture_createx_sharemodes(tctx, cli, cli2, false, false);
2531}
2532
2533bool torture_createx_sharemodes_dir(struct torture_context *tctx,
2534    struct smbcli_state *cli, struct smbcli_state *cli2)
2535{
2536	return torture_createx_sharemodes(tctx, cli, cli2, true, false);
2537}
2538
2539bool torture_createx_access(struct torture_context *tctx,
2540    struct smbcli_state *cli)
2541{
2542	TALLOC_CTX *mem_ctx;
2543	bool ret = true;
2544	uint32_t group_permuter;
2545	uint32_t i;
2546	struct createx_data cxd = {0};
2547	int est;
2548	int num_access_bits = sizeof(cxd.cxd_access1) * BITSINBYTE;
2549
2550	mem_ctx = talloc_init("createx_dir");
2551	if (!mem_ctx)
2552		return false;
2553
2554	if (!torture_setting_bool(tctx, "sacl_support", true))
2555		torture_warning(tctx, "Skipping SACL related tests!\n");
2556
2557	cxd.cxd_test = CXD_TEST_CREATEX_ACCESS;
2558
2559	/* HACK for progress bar: figure out estimated count. */
2560	est = CXD_FLAGS_COUNT * (ACCESS_GROUPS_COUNT + (num_access_bits * 3));
2561
2562	/* Blank slate. */
2563	smbcli_deltree(cli->tree, CREATEX_NAME);
2564	smbcli_unlink(cli->tree, CREATEX_NAME);
2565
2566	for (cxd.cxd_flags = 0; cxd.cxd_flags <= CXD_FLAGS_MASK;
2567	     cxd.cxd_flags++) {
2568		/**
2569		 * This implements a basic permutation of all elements of
2570		 * 'bit_group'.  group_permuter is a bit field representing
2571		 * which groups to turn on.
2572		*/
2573		for (group_permuter = 0; group_permuter < (1 <<
2574			NUM_ACCESS_GROUPS); group_permuter++) {
2575			for (i = 0, cxd.cxd_access1 = 0;
2576			     i < NUM_ACCESS_GROUPS; i++) {
2577				cxd.cxd_access1 |= (group_permuter & (1 << i))
2578				    ? sec_access_bit_groups[i] : 0;
2579			}
2580
2581			torture_createx_specific(tctx, cli, NULL, mem_ctx,
2582			    &cxd, est);
2583		}
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
2609bool 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"
2664bool 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}
2778