s4:torture:vfs_fruit: tweak check_stream_list()
[amitay/samba.git] / source4 / torture / vfs / fruit.c
1 /*
2    Unix SMB/CIFS implementation.
3
4    vfs_fruit tests
5
6    Copyright (C) Ralph Boehme 2014
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program.  If not, see <http://www.gnu.org/licenses/>.
20 */
21
22 #include "includes.h"
23 #include "system/filesys.h"
24 #include "libcli/libcli.h"
25 #include "libcli/smb2/smb2.h"
26 #include "libcli/smb2/smb2_calls.h"
27 #include "libcli/smb/smb2_create_ctx.h"
28 #include "lib/cmdline/popt_common.h"
29 #include "param/param.h"
30 #include "libcli/resolve/resolve.h"
31 #include "MacExtensions.h"
32 #include "lib/util/tsort.h"
33
34 #include "torture/torture.h"
35 #include "torture/util.h"
36 #include "torture/smb2/proto.h"
37 #include "torture/vfs/proto.h"
38 #include "librpc/gen_ndr/ndr_ioctl.h"
39
40 #define BASEDIR "vfs_fruit_dir"
41 #define FNAME_CC_SRC "testfsctl.dat"
42 #define FNAME_CC_DST "testfsctl2.dat"
43
44 #define CHECK_STATUS(status, correct) do { \
45         if (!NT_STATUS_EQUAL(status, correct)) { \
46                 torture_result(tctx, TORTURE_FAIL, \
47                     "(%s) Incorrect status %s - should be %s\n", \
48                     __location__, nt_errstr(status), nt_errstr(correct)); \
49                 ret = false; \
50                 goto done; \
51         }} while (0)
52
53 #define CHECK_VALUE(v, correct) do { \
54         if ((v) != (correct)) { \
55                 torture_result(tctx, TORTURE_FAIL, \
56                                "(%s) Incorrect value %s=%u - should be %u\n", \
57                                __location__, #v, (unsigned)v, (unsigned)correct); \
58                 ret = false; \
59                 goto done; \
60         }} while (0)
61
62 static bool check_stream_list(struct smb2_tree *tree,
63                               struct torture_context *tctx,
64                               const char *fname,
65                               int num_exp,
66                               const char **exp,
67                               bool is_dir);
68
69 static int qsort_string(char * const *s1, char * const *s2)
70 {
71         return strcmp(*s1, *s2);
72 }
73
74 static int qsort_stream(const struct stream_struct * s1, const struct stream_struct *s2)
75 {
76         return strcmp(s1->stream_name.s, s2->stream_name.s);
77 }
78
79 /*
80  * REVIEW:
81  * This is hokey, but what else can we do?
82  */
83 #if defined(HAVE_ATTROPEN) || defined(FREEBSD)
84 #define AFPINFO_EA_NETATALK "org.netatalk.Metadata"
85 #define AFPRESOURCE_EA_NETATALK "org.netatalk.ResourceFork"
86 #else
87 #define AFPINFO_EA_NETATALK "user.org.netatalk.Metadata"
88 #define AFPRESOURCE_EA_NETATALK "user.org.netatalk.ResourceFork"
89 #endif
90
91 /*
92 The metadata xattr char buf below contains the following attributes:
93
94 -------------------------------------------------------------------------------
95 Entry ID   : 00000008 : File Dates Info
96 Offset     : 00000162 : 354
97 Length     : 00000010 : 16
98
99 -DATE------:          : (GMT)                    : (Local)
100 create     : 1B442169 : Mon Jun 30 13:23:53 2014 : Mon Jun 30 15:23:53 2014
101 modify     : 1B442169 : Mon Jun 30 13:23:53 2014 : Mon Jun 30 15:23:53 2014
102 backup     : 80000000 : Unknown or Initial
103 access     : 1B442169 : Mon Jun 30 13:23:53 2014 : Mon Jun 30 15:23:53 2014
104
105 -RAW DUMP--:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
106 00000000   : 1B 44 21 69 1B 44 21 69 80 00 00 00 1B 44 21 69 : .D!i.D!i.....D!i
107
108 -------------------------------------------------------------------------------
109 Entry ID   : 00000009 : Finder Info
110 Offset     : 0000007A : 122
111 Length     : 00000020 : 32
112
113 -FInfo-----:
114 Type       : 42415252 : BARR
115 Creator    : 464F4F4F : FOOO
116 isAlias    : 0
117 Invisible  : 1
118 hasBundle  : 0
119 nameLocked : 0
120 Stationery : 0
121 CustomIcon : 0
122 Reserved   : 0
123 Inited     : 0
124 NoINITS    : 0
125 Shared     : 0
126 SwitchLaunc: 0
127 Hidden Ext : 0
128 color      : 000      : none
129 isOnDesk   : 0
130 Location v : 0000     : 0
131 Location h : 0000     : 0
132 Fldr       : 0000     : ..
133
134 -FXInfo----:
135 Rsvd|IconID: 0000     : 0
136 Rsvd       : 0000     : ..
137 Rsvd       : 0000     : ..
138 Rsvd       : 0000     : ..
139 AreInvalid : 0
140 unknown bit: 0
141 unknown bit: 0
142 unknown bit: 0
143 unknown bit: 0
144 unknown bit: 0
145 unknown bit: 0
146 CustomBadge: 0
147 ObjctIsBusy: 0
148 unknown bit: 0
149 unknown bit: 0
150 unknown bit: 0
151 unknown bit: 0
152 RoutingInfo: 0
153 unknown bit: 0
154 unknown bit: 0
155 Rsvd|commnt: 0000     : 0
156 PutAway    : 00000000 : 0
157
158 -RAW DUMP--:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
159 00000000   : 42 41 52 52 46 4F 4F 4F 40 00 00 00 00 00 00 00 : BARRFOOO@.......
160 00000010   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
161
162 -------------------------------------------------------------------------------
163 Entry ID   : 0000000E : AFP File Info
164 Offset     : 00000172 : 370
165 Length     : 00000004 : 4
166
167 -RAW DUMP--:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
168 00000000   : 00 00 01 A1                                     : ....
169  */
170
171 char metadata_xattr[] = {
172         0x00, 0x05, 0x16, 0x07, 0x00, 0x02, 0x00, 0x00,
173         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
174         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
175         0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
176         0x00, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
177         0x00, 0x08, 0x00, 0x00, 0x01, 0x62, 0x00, 0x00,
178         0x00, 0x10, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00,
179         0x00, 0x7a, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
180         0x00, 0x0e, 0x00, 0x00, 0x01, 0x72, 0x00, 0x00,
181         0x00, 0x04, 0x80, 0x44, 0x45, 0x56, 0x00, 0x00,
182         0x01, 0x76, 0x00, 0x00, 0x00, 0x08, 0x80, 0x49,
183         0x4e, 0x4f, 0x00, 0x00, 0x01, 0x7e, 0x00, 0x00,
184         0x00, 0x08, 0x80, 0x53, 0x59, 0x4e, 0x00, 0x00,
185         0x01, 0x86, 0x00, 0x00, 0x00, 0x08, 0x80, 0x53,
186         0x56, 0x7e, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00,
187         0x00, 0x04, 0x42, 0x41, 0x52, 0x52, 0x46, 0x4f,
188         0x4f, 0x4f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
189         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
190         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
191         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
192         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
193         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
194         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
195         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
196         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
197         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
198         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
199         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
200         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
201         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
202         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
203         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
204         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
205         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
206         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
207         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
208         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
209         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
210         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
211         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
212         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
213         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
214         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
215         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
216         0x00, 0x00, 0x1b, 0x44, 0x21, 0x69, 0x1b, 0x44,
217         0x21, 0x69, 0x80, 0x00, 0x00, 0x00, 0x1b, 0x44,
218         0x21, 0x69, 0x00, 0x00, 0x01, 0xa1, 0x00, 0xfd,
219         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x20,
220         0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xe3,
221         0x86, 0x53, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x01,
222         0x00, 0x00
223 };
224
225 /*
226 The buf below contains the following AppleDouble encoded data:
227
228 -------------------------------------------------------------------------------
229 MagicNumber: 00051607                                        : AppleDouble
230 Version    : 00020000                                        : Version 2
231 Filler     : 4D 61 63 20 4F 53 20 58 20 20 20 20 20 20 20 20 : Mac OS X
232 Num. of ent: 0002                                            : 2
233
234 -------------------------------------------------------------------------------
235 Entry ID   : 00000009 : Finder Info
236 Offset     : 00000032 : 50
237 Length     : 00000EB0 : 3760
238
239 -FInfo-----:
240 Type       : 54455854 : TEXT
241 Creator    : 21526368 : !Rch
242 ...
243
244 -EA--------:
245 pad        : 0000     : ..
246 magic      : 41545452 : ATTR
247 debug_tag  : 0007F98E : 522638
248 total_size : 00000EE2 : 3810
249 data_start : 00000078 : 120
250 data_length: 00000000 : 0
251 reserved[0]: 00000000 : ....
252 reserved[1]: 00000000 : ....
253 reserved[2]: 00000000 : ....
254 flags      : 0000     : ..
255 num_attrs  : 0000     : 0
256
257 -------------------------------------------------------------------------------
258 Entry ID   : 00000002 : Resource Fork
259 Offset     : 00000EE2 : 3810
260 Length     : 0000011E : 286
261
262 -RAW DUMP--:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
263 00000000   : 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 1E : ................
264 00000010   : 54 68 69 73 20 72 65 73 6F 75 72 63 65 20 66 6F : This resource fo
265 00000020   : 72 6B 20 69 6E 74 65 6E 74 69 6F 6E 61 6C 6C 79 : rk intentionally
266 00000030   : 20 6C 65 66 74 20 62 6C 61 6E 6B 20 20 20 00 00 :  left blank   ..
267 ...
268 00000110   : 00 00 00 00 00 00 00 00 00 1C 00 1E FF FF       : ..............
269 */
270 static char osx_adouble_w_xattr[] = {
271         0x00, 0x05, 0x16, 0x07, 0x00, 0x02, 0x00, 0x00,
272         0x4d, 0x61, 0x63, 0x20, 0x4f, 0x53, 0x20, 0x58,
273         0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
274         0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00,
275         0x00, 0x32, 0x00, 0x00, 0x0e, 0xb0, 0x00, 0x00,
276         0x00, 0x02, 0x00, 0x00, 0x0e, 0xe2, 0x00, 0x00,
277         0x01, 0x1e, 0x54, 0x45, 0x58, 0x54, 0x21, 0x52,
278         0x63, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
279         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
280         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
281         0x00, 0x00, 0x00, 0x00, 0x41, 0x54, 0x54, 0x52,
282         0x00, 0x07, 0xf9, 0x8e, 0x00, 0x00, 0x0e, 0xe2,
283         0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00,
284         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
285         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
286         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
287         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
288         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
289         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
290         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
291         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
292         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
293         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
294         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
295         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
296         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
297         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
298         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
299         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
300         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
301         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
302         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
303         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
304         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
305         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
306         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
307         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
308         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
309         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
311         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
312         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
313         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
314         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
316         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
318         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
319         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
320         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
322         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
323         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
324         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
325         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
326         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
327         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
328         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
329         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
330         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
331         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
332         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
333         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
334         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
335         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
336         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
337         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
338         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
339         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
340         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
341         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
342         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
343         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
344         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
345         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
346         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
347         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
348         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
349         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
350         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
351         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
352         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
354         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
356         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
358         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
361         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
362         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
363         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
364         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
365         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
366         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
367         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
368         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
369         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
370         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
371         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
372         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
373         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
374         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
375         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
376         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
377         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
378         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
379         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
380         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
381         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
382         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
383         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
384         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
385         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
386         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
387         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
388         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
389         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
390         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
391         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
392         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
393         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
394         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
395         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
396         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
397         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
398         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
399         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
400         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
401         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
402         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
403         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
404         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
405         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
406         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
407         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
408         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
409         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
410         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
411         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
412         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
413         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
414         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
415         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
416         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
417         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
418         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
419         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
420         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
421         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
422         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
423         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
424         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
425         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
426         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
427         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
428         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
429         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
430         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
431         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
432         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
433         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
434         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
435         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
436         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
437         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
438         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
439         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
440         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
441         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
442         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
443         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
444         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
445         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
446         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
447         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
448         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
449         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
450         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
451         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
452         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
453         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
454         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
455         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
456         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
457         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
458         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
459         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
460         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
461         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
462         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
463         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
464         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
465         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
466         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
467         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
468         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
469         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
470         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
471         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
472         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
473         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
474         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
475         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
476         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
477         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
478         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
479         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
480         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
481         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
482         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
483         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
484         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
485         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
486         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
487         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
488         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
489         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
490         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
491         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
492         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
493         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
494         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
495         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
496         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
497         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
498         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
499         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
500         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
501         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
502         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
503         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
504         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
505         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
506         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
507         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
508         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
509         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
510         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
511         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
512         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
513         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
514         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
515         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
516         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
517         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
518         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
519         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
520         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
521         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
522         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
523         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
524         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
525         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
526         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
527         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
528         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
529         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
530         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
531         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
532         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
533         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
534         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
535         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
536         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
537         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
538         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
539         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
540         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
541         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
542         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
543         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
544         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
545         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
546         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
547         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
548         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
549         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
550         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
551         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
552         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
553         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
554         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
555         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
556         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
557         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
558         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
559         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
560         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
561         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
562         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
563         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
564         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
565         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
566         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
567         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
568         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
569         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
570         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
571         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
572         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
573         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
574         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
575         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
576         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
577         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
578         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
579         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
580         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
581         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
582         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
583         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
584         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
585         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
586         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
587         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
588         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
589         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
590         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
591         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
592         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
593         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
594         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
595         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
596         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
597         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
598         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
599         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
600         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
601         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
602         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
603         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
604         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
605         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
606         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
607         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
608         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
609         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
610         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
611         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
612         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
613         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
614         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
615         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
616         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
617         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
618         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
619         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
620         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
621         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
622         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
623         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
624         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
625         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
626         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
627         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
628         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
629         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
630         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
631         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
632         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
633         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
634         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
635         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
636         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
637         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
638         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
639         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
640         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
641         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
642         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
643         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
644         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
645         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
646         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
647         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
648         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
649         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
650         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
651         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
652         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
653         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
654         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
655         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
656         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
657         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
658         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
659         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
660         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
661         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
662         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
663         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
664         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
665         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
666         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
667         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
668         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
669         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
670         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
671         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
672         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
673         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
674         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
675         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
676         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
677         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
678         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
679         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
680         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
681         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
682         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
683         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
684         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
685         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
686         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
687         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
688         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
689         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
690         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
691         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
692         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
693         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
694         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
695         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
696         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
697         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
698         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
699         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
700         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
701         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
702         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
703         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
704         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
705         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
706         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
707         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
708         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
709         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
710         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
711         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
712         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
713         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
714         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
715         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
716         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
717         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
718         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
719         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
720         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
721         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
722         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
723         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
724         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
725         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
726         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
727         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
728         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
729         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
730         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
731         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
732         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
733         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
734         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
735         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
736         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
737         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
738         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
739         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
740         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
741         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
742         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
743         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
744         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
745         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
746         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
747         0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
748         0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
749         0x00, 0x1e, 0x54, 0x68, 0x69, 0x73, 0x20, 0x72,
750         0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20,
751         0x66, 0x6f, 0x72, 0x6b, 0x20, 0x69, 0x6e, 0x74,
752         0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c,
753         0x6c, 0x79, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20,
754         0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x20, 0x20, 0x20,
755         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
756         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
757         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
758         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
759         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
760         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
761         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
762         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
763         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
764         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
765         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
766         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
767         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
768         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
769         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
770         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
771         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
772         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
773         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
774         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
775         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
776         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
777         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
778         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
779         0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
780         0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
781         0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
782         0x00, 0x00, 0x00, 0x1c, 0x00, 0x1e, 0xff, 0xff
783 };
784
785 /**
786  * talloc and intialize an AfpInfo
787  **/
788 static AfpInfo *torture_afpinfo_new(TALLOC_CTX *mem_ctx)
789 {
790         AfpInfo *info;
791
792         info = talloc_zero(mem_ctx, AfpInfo);
793         if (info == NULL) {
794                 return NULL;
795         }
796
797         info->afpi_Signature = AFP_Signature;
798         info->afpi_Version = AFP_Version;
799         info->afpi_BackupTime = AFP_BackupTime;
800
801         return info;
802 }
803
804 /**
805  * Pack AfpInfo into a talloced buffer
806  **/
807 static char *torture_afpinfo_pack(TALLOC_CTX *mem_ctx,
808                                   AfpInfo *info)
809 {
810         char *buf;
811
812         buf = talloc_array(mem_ctx, char, AFP_INFO_SIZE);
813         if (buf == NULL) {
814                 return NULL;
815         }
816
817         RSIVAL(buf, 0, info->afpi_Signature);
818         RSIVAL(buf, 4, info->afpi_Version);
819         RSIVAL(buf, 12, info->afpi_BackupTime);
820         memcpy(buf + 16, info->afpi_FinderInfo, sizeof(info->afpi_FinderInfo));
821
822         return buf;
823 }
824
825 /**
826  * Unpack AfpInfo
827  **/
828 #if 0
829 static void torture_afpinfo_unpack(AfpInfo *info, char *data)
830 {
831         info->afpi_Signature = RIVAL(data, 0);
832         info->afpi_Version = RIVAL(data, 4);
833         info->afpi_BackupTime = RIVAL(data, 12);
834         memcpy(info->afpi_FinderInfo, (const char *)data + 16,
835                sizeof(info->afpi_FinderInfo));
836 }
837 #endif
838
839 static bool torture_write_afpinfo(struct smb2_tree *tree,
840                                   struct torture_context *tctx,
841                                   TALLOC_CTX *mem_ctx,
842                                   const char *fname,
843                                   AfpInfo *info)
844 {
845         struct smb2_handle handle;
846         struct smb2_create io;
847         NTSTATUS status;
848         const char *full_name;
849         char *infobuf;
850         bool ret = true;
851
852         full_name = talloc_asprintf(mem_ctx, "%s%s", fname, AFPINFO_STREAM);
853         if (full_name == NULL) {
854             torture_comment(tctx, "talloc_asprintf error\n");
855             return false;
856         }
857         ZERO_STRUCT(io);
858         io.in.desired_access = SEC_FILE_WRITE_DATA;
859         io.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
860         io.in.create_disposition = NTCREATEX_DISP_OVERWRITE_IF;
861         io.in.create_options = 0;
862         io.in.fname = full_name;
863
864         status = smb2_create(tree, mem_ctx, &io);
865         CHECK_STATUS(status, NT_STATUS_OK);
866
867         handle = io.out.file.handle;
868
869         infobuf = torture_afpinfo_pack(mem_ctx, info);
870         if (infobuf == NULL) {
871                 return false;
872         }
873
874         status = smb2_util_write(tree, handle, infobuf, 0, AFP_INFO_SIZE);
875         CHECK_STATUS(status, NT_STATUS_OK);
876
877         smb2_util_close(tree, handle);
878
879 done:
880         return ret;
881 }
882
883 /**
884  * Read 'count' bytes at 'offset' from stream 'fname:sname' and
885  * compare against buffer 'value'
886  **/
887 static bool check_stream(struct smb2_tree *tree,
888                          const char *location,
889                          struct torture_context *tctx,
890                          TALLOC_CTX *mem_ctx,
891                          const char *fname,
892                          const char *sname,
893                          off_t read_offset,
894                          size_t read_count,
895                          off_t comp_offset,
896                          size_t comp_count,
897                          const char *value)
898 {
899         struct smb2_handle handle;
900         struct smb2_create create;
901         struct smb2_read r;
902         NTSTATUS status;
903         const char *full_name;
904
905         full_name = talloc_asprintf(mem_ctx, "%s%s", fname, sname);
906         if (full_name == NULL) {
907             torture_comment(tctx, "talloc_asprintf error\n");
908             return false;
909         }
910         ZERO_STRUCT(create);
911         create.in.desired_access = SEC_FILE_READ_DATA;
912         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
913         create.in.create_disposition = NTCREATEX_DISP_OPEN;
914         create.in.fname = full_name;
915
916         torture_comment(tctx, "Open stream %s\n", full_name);
917
918         status = smb2_create(tree, mem_ctx, &create);
919         if (!NT_STATUS_IS_OK(status)) {
920                 if (value == NULL) {
921                         return true;
922                 } else {
923                         torture_comment(tctx, "Unable to open stream %s\n",
924                             full_name);
925                         sleep(10000000);
926                         return false;
927                 }
928         }
929
930         handle = create.out.file.handle;
931         if (value == NULL) {
932                 return true;
933         }
934
935
936         ZERO_STRUCT(r);
937         r.in.file.handle = handle;
938         r.in.length      = read_count;
939         r.in.offset      = read_offset;
940
941         status = smb2_read(tree, tree, &r);
942
943         if (!NT_STATUS_IS_OK(status)) {
944                 torture_comment(tctx, "(%s) Failed to read %lu bytes from "
945                     "stream '%s'\n", location, (long)strlen(value), full_name);
946                 return false;
947         }
948
949         if (memcmp(r.out.data.data + comp_offset, value, comp_count) != 0) {
950                 torture_comment(tctx, "(%s) Bad data in stream\n", location);
951                 return false;
952         }
953
954         smb2_util_close(tree, handle);
955         return true;
956 }
957
958 /**
959  * Read 'count' bytes at 'offset' from stream 'fname:sname' and
960  * compare against buffer 'value'
961  **/
962 static ssize_t read_stream(struct smb2_tree *tree,
963                            const char *location,
964                            struct torture_context *tctx,
965                            TALLOC_CTX *mem_ctx,
966                            const char *fname,
967                            const char *sname,
968                            off_t read_offset,
969                            size_t read_count)
970 {
971         struct smb2_handle handle;
972         struct smb2_create create;
973         struct smb2_read r;
974         NTSTATUS status;
975         const char *full_name;
976         bool ret = true;
977
978         full_name = talloc_asprintf(mem_ctx, "%s%s", fname, sname);
979         if (full_name == NULL) {
980             torture_comment(tctx, "talloc_asprintf error\n");
981             return -1;
982         }
983         ZERO_STRUCT(create);
984         create.in.desired_access = SEC_FILE_READ_DATA;
985         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
986         create.in.create_disposition = NTCREATEX_DISP_OPEN;
987         create.in.fname = full_name;
988
989         torture_comment(tctx, "Open stream %s\n", full_name);
990
991         status = smb2_create(tree, mem_ctx, &create);
992         if (!NT_STATUS_IS_OK(status)) {
993                 torture_comment(tctx, "Unable to open stream %s\n",
994                                 full_name);
995                 return -1;
996         }
997
998         handle = create.out.file.handle;
999
1000         ZERO_STRUCT(r);
1001         r.in.file.handle = handle;
1002         r.in.length      = read_count;
1003         r.in.offset      = read_offset;
1004
1005         status = smb2_read(tree, tree, &r);
1006         if (!NT_STATUS_IS_OK(status)) {
1007                 CHECK_STATUS(status, NT_STATUS_END_OF_FILE);
1008         }
1009
1010         smb2_util_close(tree, handle);
1011
1012 done:
1013         if (ret == false) {
1014                 return -1;
1015         }
1016         return r.out.data.length;
1017 }
1018
1019 /**
1020  * Read 'count' bytes at 'offset' from stream 'fname:sname' and
1021  * compare against buffer 'value'
1022  **/
1023 static bool write_stream(struct smb2_tree *tree,
1024                          const char *location,
1025                          struct torture_context *tctx,
1026                          TALLOC_CTX *mem_ctx,
1027                          const char *fname,
1028                          const char *sname,
1029                          off_t offset,
1030                          size_t size,
1031                          const char *value)
1032 {
1033         struct smb2_handle handle;
1034         struct smb2_create create;
1035         NTSTATUS status;
1036         const char *full_name;
1037
1038         full_name = talloc_asprintf(mem_ctx, "%s%s", fname, sname);
1039         if (full_name == NULL) {
1040             torture_comment(tctx, "talloc_asprintf error\n");
1041             return false;
1042         }
1043         ZERO_STRUCT(create);
1044         create.in.desired_access = SEC_FILE_WRITE_DATA;
1045         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
1046         create.in.create_disposition = NTCREATEX_DISP_OPEN_IF;
1047         create.in.fname = full_name;
1048
1049         status = smb2_create(tree, mem_ctx, &create);
1050         if (!NT_STATUS_IS_OK(status)) {
1051                 if (value == NULL) {
1052                         return true;
1053                 } else {
1054                         torture_comment(tctx, "Unable to open stream %s\n",
1055                             full_name);
1056                         sleep(10000000);
1057                         return false;
1058                 }
1059         }
1060
1061         handle = create.out.file.handle;
1062         if (value == NULL) {
1063                 return true;
1064         }
1065
1066         status = smb2_util_write(tree, handle, value, offset, size);
1067
1068         if (!NT_STATUS_IS_OK(status)) {
1069                 torture_comment(tctx, "(%s) Failed to write %lu bytes to "
1070                     "stream '%s'\n", location, (long)size, full_name);
1071                 return false;
1072         }
1073
1074         smb2_util_close(tree, handle);
1075         return true;
1076 }
1077
1078 static bool torture_setup_local_xattr(struct torture_context *tctx,
1079                                       const char *path_option,
1080                                       const char *name,
1081                                       const char *xattr,
1082                                       const char *metadata,
1083                                       size_t size)
1084 {
1085         int ret = true;
1086         int result;
1087         const char *spath;
1088         char *path;
1089
1090         spath = torture_setting_string(tctx, path_option, NULL);
1091         if (spath == NULL) {
1092                 printf("No sharepath for option %s\n", path_option);
1093                 return false;
1094         }
1095
1096         path = talloc_asprintf(tctx, "%s/%s", spath, name);
1097
1098         result = setxattr(path, xattr, metadata, size, 0);
1099         if (result != 0) {
1100                 ret = false;
1101         }
1102
1103         TALLOC_FREE(path);
1104
1105         return ret;
1106 }
1107
1108 static bool torture_setup_local_file(struct torture_context *tctx,
1109                                      const char *path_option,
1110                                      const char *name,
1111                                      const char *buf,
1112                                      size_t size)
1113 {
1114         int fd;
1115         const char *spath;
1116         char *path;
1117         ssize_t rsize;
1118
1119         spath = torture_setting_string(tctx, path_option, NULL);
1120         if (spath == NULL) {
1121                 printf("No sharepath for option %s\n", path_option);
1122                 return false;
1123         }
1124
1125         path = talloc_asprintf(tctx, "%s/%s", spath, name);
1126         if (path == NULL) {
1127                 return false;
1128         }
1129
1130         fd = creat(path, S_IRWXU);
1131         TALLOC_FREE(path);
1132         if (fd == -1) {
1133                 return false;
1134         }
1135
1136         if ((buf == NULL) || (size == 0)) {
1137                 close(fd);
1138                 return true;
1139         }
1140
1141         rsize = write(fd, buf, size);
1142         if (rsize != size) {
1143                 return false;
1144         }
1145
1146         close(fd);
1147
1148         return true;
1149 }
1150
1151 /**
1152  * Create a file or directory
1153  **/
1154 static bool torture_setup_file(TALLOC_CTX *mem_ctx, struct smb2_tree *tree,
1155                                const char *name, bool dir)
1156 {
1157         struct smb2_create io;
1158         NTSTATUS status;
1159
1160         smb2_util_unlink(tree, name);
1161         ZERO_STRUCT(io);
1162         io.in.desired_access = SEC_FLAG_MAXIMUM_ALLOWED;
1163         io.in.file_attributes   = FILE_ATTRIBUTE_NORMAL;
1164         io.in.create_disposition = NTCREATEX_DISP_OVERWRITE_IF;
1165         io.in.share_access =
1166                 NTCREATEX_SHARE_ACCESS_DELETE|
1167                 NTCREATEX_SHARE_ACCESS_READ|
1168                 NTCREATEX_SHARE_ACCESS_WRITE;
1169         io.in.create_options = 0;
1170         io.in.fname = name;
1171         if (dir) {
1172                 io.in.create_options = NTCREATEX_OPTIONS_DIRECTORY;
1173                 io.in.share_access &= ~NTCREATEX_SHARE_ACCESS_DELETE;
1174                 io.in.file_attributes   = FILE_ATTRIBUTE_DIRECTORY;
1175                 io.in.create_disposition = NTCREATEX_DISP_CREATE;
1176         }
1177
1178         status = smb2_create(tree, mem_ctx, &io);
1179         if (!NT_STATUS_IS_OK(status)) {
1180                 return false;
1181         }
1182
1183         status = smb2_util_close(tree, io.out.file.handle);
1184         if (!NT_STATUS_IS_OK(status)) {
1185                 return false;
1186         }
1187
1188         return true;
1189 }
1190
1191 static bool enable_aapl(struct torture_context *tctx,
1192                         struct smb2_tree *tree)
1193 {
1194         TALLOC_CTX *mem_ctx = talloc_new(tctx);
1195         NTSTATUS status;
1196         bool ret = true;
1197         struct smb2_create io;
1198         DATA_BLOB data;
1199         struct smb2_create_blob *aapl = NULL;
1200         uint32_t aapl_server_caps;
1201         uint32_t expexted_scaps = (SMB2_CRTCTX_AAPL_UNIX_BASED |
1202                                    SMB2_CRTCTX_AAPL_SUPPORTS_READ_DIR_ATTR |
1203                                    SMB2_CRTCTX_AAPL_SUPPORTS_NFS_ACE |
1204                                    SMB2_CRTCTX_AAPL_SUPPORTS_OSX_COPYFILE);
1205
1206         ZERO_STRUCT(io);
1207         io.in.desired_access     = SEC_FLAG_MAXIMUM_ALLOWED;
1208         io.in.file_attributes    = FILE_ATTRIBUTE_DIRECTORY;
1209         io.in.create_disposition = NTCREATEX_DISP_OPEN;
1210         io.in.share_access = (NTCREATEX_SHARE_ACCESS_DELETE |
1211                               NTCREATEX_SHARE_ACCESS_READ |
1212                               NTCREATEX_SHARE_ACCESS_WRITE);
1213         io.in.fname = "";
1214
1215         /*
1216          * Issuing an SMB2/CREATE with a suitably formed AAPL context,
1217          * controls behaviour of Apple's SMB2 extensions for the whole
1218          * session!
1219          */
1220
1221         data = data_blob_talloc(mem_ctx, NULL, 3 * sizeof(uint64_t));
1222         SBVAL(data.data, 0, SMB2_CRTCTX_AAPL_SERVER_QUERY);
1223         SBVAL(data.data, 8, (SMB2_CRTCTX_AAPL_SERVER_CAPS |
1224                              SMB2_CRTCTX_AAPL_VOLUME_CAPS |
1225                              SMB2_CRTCTX_AAPL_MODEL_INFO));
1226         SBVAL(data.data, 16, (SMB2_CRTCTX_AAPL_SUPPORTS_READ_DIR_ATTR |
1227                               SMB2_CRTCTX_AAPL_UNIX_BASED |
1228                               SMB2_CRTCTX_AAPL_SUPPORTS_NFS_ACE));
1229
1230         status = smb2_create_blob_add(tctx, &io.in.blobs, "AAPL", data);
1231         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create_blob_add");
1232
1233         status = smb2_create(tree, tctx, &io);
1234         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create");
1235
1236         status = smb2_util_close(tree, io.out.file.handle);
1237         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_util_close");
1238
1239         /*
1240          * Now check returned AAPL context
1241          */
1242         torture_comment(tctx, "Comparing returned AAPL capabilities\n");
1243
1244         aapl = smb2_create_blob_find(&io.out.blobs,
1245                                      SMB2_CREATE_TAG_AAPL);
1246         torture_assert_goto(tctx, aapl != NULL, ret, done, "missing AAPL context");
1247         torture_assert_goto(tctx, aapl->data.length == 50, ret, done, "bad AAPL size");
1248
1249         aapl_server_caps = BVAL(aapl->data.data, 16);
1250         torture_assert_goto(tctx, aapl_server_caps == expexted_scaps,
1251                             ret, done, "bad AAPL caps");
1252
1253 done:
1254         talloc_free(mem_ctx);
1255         return ret;
1256 }
1257
1258 static bool test_read_atalk_metadata(struct torture_context *tctx,
1259                                      struct smb2_tree *tree)
1260 {
1261         TALLOC_CTX *mem_ctx = talloc_new(tctx);
1262         const char *fname = BASEDIR "\\torture_read_metadata";
1263         NTSTATUS status;
1264         struct smb2_handle testdirh;
1265         bool ret = true;
1266         ssize_t len;
1267
1268         torture_comment(tctx, "Checking metadata access\n");
1269
1270         smb2_util_unlink(tree, fname);
1271
1272         status = torture_smb2_testdir(tree, BASEDIR, &testdirh);
1273         CHECK_STATUS(status, NT_STATUS_OK);
1274         smb2_util_close(tree, testdirh);
1275
1276         ret = torture_setup_file(mem_ctx, tree, fname, false);
1277         if (ret == false) {
1278                 goto done;
1279         }
1280
1281         ret = torture_setup_local_xattr(tctx, "localdir",
1282                                         BASEDIR "/torture_read_metadata",
1283                                         AFPINFO_EA_NETATALK,
1284                                         metadata_xattr, sizeof(metadata_xattr));
1285         if (ret == false) {
1286                 goto done;
1287         }
1288
1289         ret &= check_stream(tree, __location__, tctx, mem_ctx, fname, AFPINFO_STREAM,
1290                             0, 60, 0, 4, "AFP");
1291
1292         ret &= check_stream(tree, __location__, tctx, mem_ctx, fname, AFPINFO_STREAM,
1293                             0, 60, 16, 8, "BARRFOOO");
1294
1295         ret &= check_stream(tree, __location__, tctx, mem_ctx, fname, AFPINFO_STREAM,
1296                             16, 8, 0, 8, "BARRFOOO");
1297
1298         /* Check reading offset and read size > sizeof(AFPINFO_STREAM) */
1299
1300         len = read_stream(tree, __location__, tctx, mem_ctx, fname,
1301                           AFPINFO_STREAM, 0, 61);
1302         CHECK_VALUE(len, 60);
1303
1304         len = read_stream(tree, __location__, tctx, mem_ctx, fname,
1305                           AFPINFO_STREAM, 59, 2);
1306         CHECK_VALUE(len, 1);
1307
1308         len = read_stream(tree, __location__, tctx, mem_ctx, fname,
1309                           AFPINFO_STREAM, 60, 1);
1310         CHECK_VALUE(len, 0);
1311
1312         len = read_stream(tree, __location__, tctx, mem_ctx, fname,
1313                           AFPINFO_STREAM, 61, 1);
1314         CHECK_VALUE(len, 0);
1315
1316 done:
1317         smb2_deltree(tree, BASEDIR);
1318         talloc_free(mem_ctx);
1319         return ret;
1320 }
1321
1322 static bool test_write_atalk_metadata(struct torture_context *tctx,
1323                                       struct smb2_tree *tree)
1324 {
1325         TALLOC_CTX *mem_ctx = talloc_new(tctx);
1326         const char *fname = BASEDIR "\\torture_write_metadata";
1327         const char *type_creator = "SMB,OLE!";
1328         NTSTATUS status;
1329         struct smb2_handle testdirh;
1330         bool ret = true;
1331         AfpInfo *info;
1332
1333         smb2_util_unlink(tree, fname);
1334
1335         status = torture_smb2_testdir(tree, BASEDIR, &testdirh);
1336         CHECK_STATUS(status, NT_STATUS_OK);
1337         smb2_util_close(tree, testdirh);
1338
1339         ret = torture_setup_file(mem_ctx, tree, fname, false);
1340         if (ret == false) {
1341                 goto done;
1342         }
1343
1344         info = torture_afpinfo_new(mem_ctx);
1345         if (info == NULL) {
1346                 goto done;
1347         }
1348
1349         memcpy(info->afpi_FinderInfo, type_creator, 8);
1350         ret = torture_write_afpinfo(tree, tctx, mem_ctx, fname, info);
1351         ret &= check_stream(tree, __location__, tctx, mem_ctx, fname, AFPINFO_STREAM,
1352                             0, 60, 16, 8, type_creator);
1353
1354 done:
1355         smb2_deltree(tree, BASEDIR);
1356         talloc_free(mem_ctx);
1357         return ret;
1358 }
1359
1360 static bool test_write_atalk_rfork_io(struct torture_context *tctx,
1361                                       struct smb2_tree *tree)
1362 {
1363         TALLOC_CTX *mem_ctx = talloc_new(tctx);
1364         const char *fname = BASEDIR "\\torture_write_rfork_io";
1365         const char *rfork = BASEDIR "\\torture_write_rfork_io" AFPRESOURCE_STREAM;
1366         const char *rfork_content = "1234567890";
1367         NTSTATUS status;
1368         struct smb2_handle testdirh;
1369         bool ret = true;
1370
1371         union smb_open io;
1372         struct smb2_handle filehandle;
1373         union smb_fileinfo finfo;
1374         union smb_setfileinfo sinfo;
1375
1376         smb2_util_unlink(tree, fname);
1377
1378         status = torture_smb2_testdir(tree, BASEDIR, &testdirh);
1379         CHECK_STATUS(status, NT_STATUS_OK);
1380         smb2_util_close(tree, testdirh);
1381
1382         ret = torture_setup_file(mem_ctx, tree, fname, false);
1383         if (ret == false) {
1384                 goto done;
1385         }
1386
1387         torture_comment(tctx, "(%s) writing to resource fork\n",
1388             __location__);
1389
1390         ret &= write_stream(tree, __location__, tctx, mem_ctx,
1391                             fname, AFPRESOURCE_STREAM,
1392                             10, 10, rfork_content);
1393
1394         ret &= check_stream(tree, __location__, tctx, mem_ctx,
1395                             fname, AFPRESOURCE_STREAM,
1396                             0, 20, 10, 10, rfork_content);
1397
1398         /* Check size after write */
1399
1400         ZERO_STRUCT(io);
1401         io.smb2.in.create_disposition = NTCREATEX_DISP_OPEN;
1402         io.smb2.in.desired_access = SEC_FILE_READ_ATTRIBUTE |
1403                 SEC_FILE_WRITE_ATTRIBUTE;
1404         io.smb2.in.fname = rfork;
1405         status = smb2_create(tree, mem_ctx, &(io.smb2));
1406         CHECK_STATUS(status, NT_STATUS_OK);
1407         filehandle = io.smb2.out.file.handle;
1408
1409         torture_comment(tctx, "(%s) check resource fork size after write\n",
1410             __location__);
1411
1412         ZERO_STRUCT(finfo);
1413         finfo.generic.level = RAW_FILEINFO_ALL_INFORMATION;
1414         finfo.generic.in.file.handle = filehandle;
1415         status = smb2_getinfo_file(tree, mem_ctx, &finfo);
1416         CHECK_STATUS(status, NT_STATUS_OK);
1417         if (finfo.all_info.out.size != 20) {
1418                 torture_result(tctx, TORTURE_FAIL,
1419                                "(%s) Incorrect resource fork size\n",
1420                                __location__);
1421                 ret = false;
1422                 smb2_util_close(tree, filehandle);
1423                 goto done;
1424         }
1425         smb2_util_close(tree, filehandle);
1426
1427         /* Write at large offset */
1428
1429         torture_comment(tctx, "(%s) writing to resource fork at large offset\n",
1430                         __location__);
1431
1432         ret &= write_stream(tree, __location__, tctx, mem_ctx,
1433                             fname, AFPRESOURCE_STREAM,
1434                             (off_t)1<<32, 10, rfork_content);
1435
1436         ret &= check_stream(tree, __location__, tctx, mem_ctx,
1437                             fname, AFPRESOURCE_STREAM,
1438                             (off_t)1<<32, 10, 0, 10, rfork_content);
1439
1440         /* Truncate back to size of 1 byte */
1441
1442         torture_comment(tctx, "(%s) truncate resource fork and check size\n",
1443                         __location__);
1444
1445         ZERO_STRUCT(io);
1446         io.smb2.in.create_disposition = NTCREATEX_DISP_OPEN;
1447         io.smb2.in.desired_access = SEC_FILE_READ_ATTRIBUTE |
1448                 SEC_FILE_WRITE_ATTRIBUTE;
1449         io.smb2.in.fname = rfork;
1450         status = smb2_create(tree, mem_ctx, &(io.smb2));
1451         CHECK_STATUS(status, NT_STATUS_OK);
1452         filehandle = io.smb2.out.file.handle;
1453
1454         ZERO_STRUCT(sinfo);
1455         sinfo.end_of_file_info.level =
1456                 RAW_SFILEINFO_END_OF_FILE_INFORMATION;
1457         sinfo.end_of_file_info.in.file.handle = filehandle;
1458         sinfo.end_of_file_info.in.size = 1;
1459         status = smb2_setinfo_file(tree, &sinfo);
1460         CHECK_STATUS(status, NT_STATUS_OK);
1461
1462         smb2_util_close(tree, filehandle);
1463
1464         /* Now check size */
1465         ZERO_STRUCT(io);
1466         io.smb2.in.create_disposition = NTCREATEX_DISP_OPEN;
1467         io.smb2.in.desired_access = SEC_FILE_READ_ATTRIBUTE |
1468                 SEC_FILE_WRITE_ATTRIBUTE;
1469         io.smb2.in.fname = rfork;
1470         status = smb2_create(tree, mem_ctx, &(io.smb2));
1471         CHECK_STATUS(status, NT_STATUS_OK);
1472         filehandle = io.smb2.out.file.handle;
1473
1474         ZERO_STRUCT(finfo);
1475         finfo.generic.level = RAW_FILEINFO_ALL_INFORMATION;
1476         finfo.generic.in.file.handle = filehandle;
1477         status = smb2_getinfo_file(tree, mem_ctx, &finfo);
1478         CHECK_STATUS(status, NT_STATUS_OK);
1479         if (finfo.all_info.out.size != 1) {
1480                 torture_result(tctx, TORTURE_FAIL,
1481                                "(%s) Incorrect resource fork size\n",
1482                                __location__);
1483                 ret = false;
1484                 smb2_util_close(tree, filehandle);
1485                 goto done;
1486         }
1487         smb2_util_close(tree, filehandle);
1488
1489 done:
1490         smb2_deltree(tree, BASEDIR);
1491         talloc_free(mem_ctx);
1492         return ret;
1493 }
1494
1495 static bool test_rfork_truncate(struct torture_context *tctx,
1496                                 struct smb2_tree *tree)
1497 {
1498         TALLOC_CTX *mem_ctx = talloc_new(tctx);
1499         const char *fname = BASEDIR "\\torture_rfork_truncate";
1500         const char *rfork = BASEDIR "\\torture_rfork_truncate" AFPRESOURCE_STREAM;
1501         const char *rfork_content = "1234567890";
1502         NTSTATUS status;
1503         struct smb2_handle testdirh;
1504         bool ret = true;
1505         struct smb2_create create;
1506         struct smb2_handle fh1, fh2, fh3;
1507         union smb_setfileinfo sinfo;
1508
1509         smb2_util_unlink(tree, fname);
1510
1511         status = torture_smb2_testdir(tree, BASEDIR, &testdirh);
1512         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "torture_smb2_testdir");
1513         smb2_util_close(tree, testdirh);
1514
1515         ret = torture_setup_file(mem_ctx, tree, fname, false);
1516         if (ret == false) {
1517                 goto done;
1518         }
1519
1520         ret &= write_stream(tree, __location__, tctx, mem_ctx,
1521                             fname, AFPRESOURCE_STREAM,
1522                             10, 10, rfork_content);
1523
1524         /* Truncate back to size 0, further access MUST return ENOENT */
1525
1526         torture_comment(tctx, "(%s) truncate resource fork to size 0\n",
1527                         __location__);
1528
1529         ZERO_STRUCT(create);
1530         create.in.create_disposition  = NTCREATEX_DISP_OPEN;
1531         create.in.desired_access      = SEC_STD_READ_CONTROL | SEC_FILE_ALL;
1532         create.in.file_attributes     = FILE_ATTRIBUTE_NORMAL;
1533         create.in.fname               = fname;
1534         create.in.share_access        = NTCREATEX_SHARE_ACCESS_DELETE |
1535                 NTCREATEX_SHARE_ACCESS_READ |
1536                 NTCREATEX_SHARE_ACCESS_WRITE;
1537         status = smb2_create(tree, mem_ctx, &create);
1538         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create");
1539         fh1 = create.out.file.handle;
1540
1541         ZERO_STRUCT(create);
1542         create.in.create_disposition  = NTCREATEX_DISP_OPEN_IF;
1543         create.in.desired_access      = SEC_STD_READ_CONTROL | SEC_FILE_ALL;
1544         create.in.file_attributes     = FILE_ATTRIBUTE_NORMAL;
1545         create.in.fname               = rfork;
1546         create.in.share_access        = NTCREATEX_SHARE_ACCESS_DELETE |
1547                 NTCREATEX_SHARE_ACCESS_READ |
1548                 NTCREATEX_SHARE_ACCESS_WRITE;
1549         status = smb2_create(tree, mem_ctx, &create);
1550         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create");
1551         fh2 = create.out.file.handle;
1552
1553         ZERO_STRUCT(sinfo);
1554         sinfo.end_of_file_info.level = RAW_SFILEINFO_END_OF_FILE_INFORMATION;
1555         sinfo.end_of_file_info.in.file.handle = fh2;
1556         sinfo.end_of_file_info.in.size = 0;
1557         status = smb2_setinfo_file(tree, &sinfo);
1558         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_setinfo_file");
1559
1560         /*
1561          * Now check size, we should get OBJECT_NAME_NOT_FOUND (!)
1562          */
1563         ZERO_STRUCT(create);
1564         create.in.create_disposition  = NTCREATEX_DISP_OPEN;
1565         create.in.desired_access      = SEC_FILE_ALL;
1566         create.in.file_attributes     = FILE_ATTRIBUTE_NORMAL;
1567         create.in.fname               = rfork;
1568         create.in.share_access        = NTCREATEX_SHARE_ACCESS_DELETE |
1569                 NTCREATEX_SHARE_ACCESS_READ |
1570                 NTCREATEX_SHARE_ACCESS_WRITE;
1571         status = smb2_create(tree, mem_ctx, &create);
1572         torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OBJECT_NAME_NOT_FOUND, ret, done, "smb2_create");
1573
1574         /*
1575          * Do another open on the rfork and write to the new handle. A
1576          * naive server might unlink the AppleDouble resource fork
1577          * file when its truncated to 0 bytes above, so in case both
1578          * open handles share the same underlying fd, the unlink would
1579          * cause the below write to be lost.
1580          */
1581         ZERO_STRUCT(create);
1582         create.in.create_disposition  = NTCREATEX_DISP_OPEN_IF;
1583         create.in.desired_access      = SEC_STD_READ_CONTROL | SEC_FILE_ALL;
1584         create.in.file_attributes     = FILE_ATTRIBUTE_NORMAL;
1585         create.in.fname               = rfork;
1586         create.in.share_access        = NTCREATEX_SHARE_ACCESS_DELETE |
1587                 NTCREATEX_SHARE_ACCESS_READ |
1588                 NTCREATEX_SHARE_ACCESS_WRITE;
1589         status = smb2_create(tree, mem_ctx, &create);
1590         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create");
1591         fh3 = create.out.file.handle;
1592
1593         status = smb2_util_write(tree, fh3, "foo", 0, 3);
1594         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_util_write");
1595
1596         smb2_util_close(tree, fh3);
1597         smb2_util_close(tree, fh2);
1598         smb2_util_close(tree, fh1);
1599
1600         ret = check_stream(tree, __location__, tctx, mem_ctx, fname, AFPRESOURCE_STREAM,
1601                            0, 3, 0, 3, "foo");
1602         torture_assert_goto(tctx, ret == true, ret, done, "check_stream");
1603
1604 done:
1605         smb2_util_unlink(tree, fname);
1606         smb2_deltree(tree, BASEDIR);
1607         talloc_free(mem_ctx);
1608         return ret;
1609 }
1610
1611 static bool test_rfork_create(struct torture_context *tctx,
1612                               struct smb2_tree *tree)
1613 {
1614         TALLOC_CTX *mem_ctx = talloc_new(tctx);
1615         const char *fname = BASEDIR "\\torture_rfork_create";
1616         const char *rfork = BASEDIR "\\torture_rfork_create" AFPRESOURCE_STREAM;
1617         NTSTATUS status;
1618         struct smb2_handle testdirh;
1619         bool ret = true;
1620         struct smb2_create create;
1621         struct smb2_handle fh1;
1622         const char *streams[] = {
1623                 "::$DATA"
1624         };
1625         union smb_fileinfo finfo;
1626
1627         smb2_util_unlink(tree, fname);
1628
1629         status = torture_smb2_testdir(tree, BASEDIR, &testdirh);
1630         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "torture_smb2_testdir");
1631         smb2_util_close(tree, testdirh);
1632
1633         ret = torture_setup_file(mem_ctx, tree, fname, false);
1634         if (ret == false) {
1635                 goto done;
1636         }
1637
1638         torture_comment(tctx, "(%s) open rfork, should return ENOENT\n",
1639                         __location__);
1640
1641         ZERO_STRUCT(create);
1642         create.in.create_disposition  = NTCREATEX_DISP_OPEN;
1643         create.in.desired_access      = SEC_STD_READ_CONTROL | SEC_FILE_ALL;
1644         create.in.file_attributes     = FILE_ATTRIBUTE_NORMAL;
1645         create.in.fname               = rfork;
1646         create.in.share_access        = NTCREATEX_SHARE_ACCESS_DELETE |
1647                 NTCREATEX_SHARE_ACCESS_READ |
1648                 NTCREATEX_SHARE_ACCESS_WRITE;
1649         status = smb2_create(tree, mem_ctx, &create);
1650         torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OBJECT_NAME_NOT_FOUND, ret, done, "smb2_create");
1651
1652         torture_comment(tctx, "(%s) create resource fork\n", __location__);
1653
1654         ZERO_STRUCT(create);
1655         create.in.create_disposition  = NTCREATEX_DISP_OPEN_IF;
1656         create.in.desired_access      = SEC_STD_READ_CONTROL | SEC_FILE_ALL;
1657         create.in.file_attributes     = FILE_ATTRIBUTE_NORMAL;
1658         create.in.fname               = rfork;
1659         create.in.share_access        = NTCREATEX_SHARE_ACCESS_DELETE |
1660                 NTCREATEX_SHARE_ACCESS_READ |
1661                 NTCREATEX_SHARE_ACCESS_WRITE;
1662         status = smb2_create(tree, mem_ctx, &create);
1663         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create");
1664         fh1 = create.out.file.handle;
1665
1666         torture_comment(tctx, "(%s) getinfo on create handle\n",
1667                         __location__);
1668
1669         ZERO_STRUCT(finfo);
1670         finfo.generic.level = RAW_FILEINFO_ALL_INFORMATION;
1671         finfo.generic.in.file.handle = fh1;
1672         status = smb2_getinfo_file(tree, mem_ctx, &finfo);
1673         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_getinfo_file");
1674         if (finfo.all_info.out.size != 0) {
1675                 torture_result(tctx, TORTURE_FAIL,
1676                                "(%s) Incorrect resource fork size\n",
1677                                __location__);
1678                 ret = false;
1679                 smb2_util_close(tree, fh1);
1680                 goto done;
1681         }
1682
1683         torture_comment(tctx, "(%s) open rfork, should still return ENOENT\n",
1684                         __location__);
1685
1686         ZERO_STRUCT(create);
1687         create.in.create_disposition  = NTCREATEX_DISP_OPEN;
1688         create.in.desired_access      = SEC_STD_READ_CONTROL | SEC_FILE_ALL;
1689         create.in.file_attributes     = FILE_ATTRIBUTE_NORMAL;
1690         create.in.fname               = rfork;
1691         create.in.share_access        = NTCREATEX_SHARE_ACCESS_DELETE |
1692                 NTCREATEX_SHARE_ACCESS_READ |
1693                 NTCREATEX_SHARE_ACCESS_WRITE;
1694         status = smb2_create(tree, mem_ctx, &create);
1695         torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OBJECT_NAME_NOT_FOUND, ret, done, "smb2_create");
1696
1697         ret = check_stream_list(tree, tctx, fname, 1, streams, false);
1698         torture_assert_goto(tctx, ret == true, ret, done, "check_stream_list");
1699
1700         torture_comment(tctx, "(%s) close empty created rfork, open should return ENOENT\n",
1701                         __location__);
1702
1703         ZERO_STRUCT(create);
1704         create.in.create_disposition  = NTCREATEX_DISP_OPEN;
1705         create.in.desired_access      = SEC_STD_READ_CONTROL | SEC_FILE_ALL;
1706         create.in.file_attributes     = FILE_ATTRIBUTE_NORMAL;
1707         create.in.fname               = rfork;
1708         create.in.share_access        = NTCREATEX_SHARE_ACCESS_DELETE |
1709                 NTCREATEX_SHARE_ACCESS_READ |
1710                 NTCREATEX_SHARE_ACCESS_WRITE;
1711         status = smb2_create(tree, mem_ctx, &create);
1712         torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OBJECT_NAME_NOT_FOUND, ret, done, "smb2_create");
1713
1714 done:
1715         smb2_util_unlink(tree, fname);
1716         smb2_deltree(tree, BASEDIR);
1717         talloc_free(mem_ctx);
1718         return ret;
1719 }
1720
1721 static bool test_adouble_conversion(struct torture_context *tctx,
1722                                     struct smb2_tree *tree)
1723 {
1724         TALLOC_CTX *mem_ctx = talloc_new(tctx);
1725         const char *fname = BASEDIR "\\test_adouble_conversion";
1726         const char *fname_local = BASEDIR "/test_adouble_conversion";
1727         const char *adname_local = BASEDIR "/._test_adouble_conversion";
1728         NTSTATUS status;
1729         struct smb2_handle testdirh;
1730         bool ret = true;
1731         const char *data = "This resource fork intentionally left blank";
1732         size_t datalen = strlen(data);
1733
1734         smb2_util_unlink(tree, fname);
1735
1736         status = torture_smb2_testdir(tree, BASEDIR, &testdirh);
1737         CHECK_STATUS(status, NT_STATUS_OK);
1738         smb2_util_close(tree, testdirh);
1739
1740         ret = torture_setup_local_file(tctx, "localdir", fname_local,
1741                                        NULL, 0);
1742         if (ret == false) {
1743                 goto done;
1744         }
1745
1746         ret = torture_setup_local_file(tctx, "localdir", adname_local,
1747                                        osx_adouble_w_xattr,
1748                                        sizeof(osx_adouble_w_xattr));
1749         if (ret == false) {
1750                 goto done;
1751         }
1752
1753         torture_comment(tctx, "(%s) test OS X AppleDouble conversion\n",
1754             __location__);
1755
1756         ret &= check_stream(tree, __location__, tctx, mem_ctx,
1757                             fname, AFPRESOURCE_STREAM,
1758                             16, datalen, 0, datalen, data);
1759
1760 done:
1761         smb2_deltree(tree, BASEDIR);
1762         talloc_free(mem_ctx);
1763         return ret;
1764 }
1765
1766 static bool test_aapl(struct torture_context *tctx,
1767                       struct smb2_tree *tree)
1768 {
1769         TALLOC_CTX *mem_ctx = talloc_new(tctx);
1770         const char *fname = BASEDIR "\\test_aapl";
1771         NTSTATUS status;
1772         struct smb2_handle testdirh;
1773         bool ret = true;
1774         struct smb2_create io;
1775         DATA_BLOB data;
1776         struct smb2_create_blob *aapl = NULL;
1777         AfpInfo *info;
1778         const char *type_creator = "SMB,OLE!";
1779         char type_creator_buf[9];
1780         uint32_t aapl_cmd;
1781         uint32_t aapl_reply_bitmap;
1782         uint32_t aapl_server_caps;
1783         uint32_t aapl_vol_caps;
1784         char *model;
1785         struct smb2_find f;
1786         unsigned int count;
1787         union smb_search_data *d;
1788         uint64_t rfork_len;
1789
1790         smb2_deltree(tree, BASEDIR);
1791
1792         status = torture_smb2_testdir(tree, BASEDIR, &testdirh);
1793         CHECK_STATUS(status, NT_STATUS_OK);
1794         smb2_util_close(tree, testdirh);
1795
1796         ZERO_STRUCT(io);
1797         io.in.desired_access     = SEC_FLAG_MAXIMUM_ALLOWED;
1798         io.in.file_attributes    = FILE_ATTRIBUTE_NORMAL;
1799         io.in.create_disposition = NTCREATEX_DISP_OVERWRITE_IF;
1800         io.in.share_access = (NTCREATEX_SHARE_ACCESS_DELETE |
1801                               NTCREATEX_SHARE_ACCESS_READ |
1802                               NTCREATEX_SHARE_ACCESS_WRITE);
1803         io.in.fname = fname;
1804
1805         /*
1806          * Issuing an SMB2/CREATE with a suitably formed AAPL context,
1807          * controls behaviour of Apple's SMB2 extensions for the whole
1808          * session!
1809          */
1810
1811         data = data_blob_talloc(mem_ctx, NULL, 3 * sizeof(uint64_t));
1812         SBVAL(data.data, 0, SMB2_CRTCTX_AAPL_SERVER_QUERY);
1813         SBVAL(data.data, 8, (SMB2_CRTCTX_AAPL_SERVER_CAPS |
1814                              SMB2_CRTCTX_AAPL_VOLUME_CAPS |
1815                              SMB2_CRTCTX_AAPL_MODEL_INFO));
1816         SBVAL(data.data, 16, (SMB2_CRTCTX_AAPL_SUPPORTS_READ_DIR_ATTR |
1817                               SMB2_CRTCTX_AAPL_UNIX_BASED |
1818                               SMB2_CRTCTX_AAPL_SUPPORTS_NFS_ACE));
1819
1820         torture_comment(tctx, "Testing SMB2 create context AAPL\n");
1821         status = smb2_create_blob_add(tctx, &io.in.blobs, "AAPL", data);
1822         CHECK_STATUS(status, NT_STATUS_OK);
1823
1824         status = smb2_create(tree, tctx, &io);
1825         CHECK_STATUS(status, NT_STATUS_OK);
1826         status = smb2_util_close(tree, io.out.file.handle);
1827         CHECK_STATUS(status, NT_STATUS_OK);
1828
1829         /*
1830          * Now check returned AAPL context
1831          */
1832         torture_comment(tctx, "Comparing returned AAPL capabilities\n");
1833
1834         aapl = smb2_create_blob_find(&io.out.blobs,
1835                                      SMB2_CREATE_TAG_AAPL);
1836
1837         if (aapl->data.length != 50) {
1838                 /*
1839                  * uint32_t CommandCode = kAAPL_SERVER_QUERY
1840                  * uint32_t Reserved = 0;
1841                  * uint64_t ReplyBitmap = kAAPL_SERVER_CAPS |
1842                  *                        kAAPL_VOLUME_CAPS |
1843                  *                        kAAPL_MODEL_INFO;
1844                  * uint64_t ServerCaps = kAAPL_SUPPORTS_READDIR_ATTR |
1845                  *                       kAAPL_SUPPORTS_OSX_COPYFILE;
1846                  * uint64_t VolumeCaps = kAAPL_SUPPORT_RESOLVE_ID |
1847                  *                       kAAPL_CASE_SENSITIVE;
1848                  * uint32_t Pad2 = 0;
1849                  * uint32_t ModelStringLen = 10;
1850                  * ucs2_t ModelString[5] = "Samba";
1851                  */
1852                 ret = false;
1853                 goto done;
1854         }
1855
1856         aapl_cmd = IVAL(aapl->data.data, 0);
1857         if (aapl_cmd != SMB2_CRTCTX_AAPL_SERVER_QUERY) {
1858                 torture_result(tctx, TORTURE_FAIL,
1859                                "(%s) unexpected cmd: %d",
1860                                __location__, (int)aapl_cmd);
1861                 ret = false;
1862                 goto done;
1863         }
1864
1865         aapl_reply_bitmap = BVAL(aapl->data.data, 8);
1866         if (aapl_reply_bitmap != (SMB2_CRTCTX_AAPL_SERVER_CAPS |
1867                                   SMB2_CRTCTX_AAPL_VOLUME_CAPS |
1868                                   SMB2_CRTCTX_AAPL_MODEL_INFO)) {
1869                 torture_result(tctx, TORTURE_FAIL,
1870                                "(%s) unexpected reply_bitmap: %d",
1871                                __location__, (int)aapl_reply_bitmap);
1872                 ret = false;
1873                 goto done;
1874         }
1875
1876         aapl_server_caps = BVAL(aapl->data.data, 16);
1877         if (aapl_server_caps != (SMB2_CRTCTX_AAPL_UNIX_BASED |
1878                                  SMB2_CRTCTX_AAPL_SUPPORTS_READ_DIR_ATTR |
1879                                  SMB2_CRTCTX_AAPL_SUPPORTS_NFS_ACE |
1880                                  SMB2_CRTCTX_AAPL_SUPPORTS_OSX_COPYFILE)) {
1881                 torture_result(tctx, TORTURE_FAIL,
1882                                "(%s) unexpected server_caps: %d",
1883                                __location__, (int)aapl_server_caps);
1884                 ret = false;
1885                 goto done;
1886         }
1887
1888         aapl_vol_caps = BVAL(aapl->data.data, 24);
1889         if (aapl_vol_caps != SMB2_CRTCTX_AAPL_CASE_SENSITIVE) {
1890                 /* this will fail on a case insensitive fs ... */
1891                 torture_result(tctx, TORTURE_FAIL,
1892                                "(%s) unexpected vol_caps: %d",
1893                                __location__, (int)aapl_vol_caps);
1894                 ret = false;
1895                 goto done;
1896         }
1897
1898         ret = convert_string_talloc(mem_ctx,
1899                                     CH_UTF16LE, CH_UNIX,
1900                                     aapl->data.data + 40, 10,
1901                                     &model, NULL);
1902         if (ret == false) {
1903                 torture_result(tctx, TORTURE_FAIL,
1904                                "(%s) convert_string_talloc() failed",
1905                                __location__);
1906                 goto done;
1907         }
1908         torture_comment(tctx, "Got server model: \"%s\"\n", model);
1909
1910         /*
1911          * Now that Requested AAPL extensions are enabled, setup some
1912          * Mac files with metadata and resource fork
1913          */
1914         ret = torture_setup_file(mem_ctx, tree, fname, false);
1915         if (ret == false) {
1916                 torture_result(tctx, TORTURE_FAIL,
1917                                "(%s) torture_setup_file() failed",
1918                                __location__);
1919                 goto done;
1920         }
1921
1922         info = torture_afpinfo_new(mem_ctx);
1923         if (info == NULL) {
1924                 torture_result(tctx, TORTURE_FAIL,
1925                                "(%s) torture_afpinfo_new() failed",
1926                                __location__);
1927                 ret = false;
1928                 goto done;
1929         }
1930
1931         memcpy(info->afpi_FinderInfo, type_creator, 8);
1932         ret = torture_write_afpinfo(tree, tctx, mem_ctx, fname, info);
1933         if (ret == false) {
1934                 torture_result(tctx, TORTURE_FAIL,
1935                                "(%s) torture_write_afpinfo() failed",
1936                                __location__);
1937                 goto done;
1938         }
1939
1940         ret = write_stream(tree, __location__, tctx, mem_ctx,
1941                            fname, AFPRESOURCE_STREAM,
1942                            0, 3, "foo");
1943         if (ret == false) {
1944                 torture_result(tctx, TORTURE_FAIL,
1945                                "(%s) write_stream() failed",
1946                                __location__);
1947                 goto done;
1948         }
1949
1950         /*
1951          * Ok, file is prepared, now call smb2/find
1952          */
1953
1954         ZERO_STRUCT(io);
1955         io.in.desired_access = SEC_RIGHTS_DIR_ALL;
1956         io.in.create_options = NTCREATEX_OPTIONS_DIRECTORY;
1957         io.in.file_attributes = FILE_ATTRIBUTE_DIRECTORY;
1958         io.in.share_access = (NTCREATEX_SHARE_ACCESS_READ |
1959                               NTCREATEX_SHARE_ACCESS_WRITE |
1960                               NTCREATEX_SHARE_ACCESS_DELETE);
1961         io.in.create_disposition = NTCREATEX_DISP_OPEN;
1962         io.in.fname = BASEDIR;
1963         status = smb2_create(tree, tctx, &io);
1964         CHECK_STATUS(status, NT_STATUS_OK);
1965
1966         ZERO_STRUCT(f);
1967         f.in.file.handle        = io.out.file.handle;
1968         f.in.pattern            = "test_aapl";
1969         f.in.continue_flags     = SMB2_CONTINUE_FLAG_SINGLE;
1970         f.in.max_response_size  = 0x1000;
1971         f.in.level              = SMB2_FIND_ID_BOTH_DIRECTORY_INFO;
1972
1973         status = smb2_find_level(tree, tree, &f, &count, &d);
1974         CHECK_STATUS(status, NT_STATUS_OK);
1975
1976         status = smb2_util_close(tree, io.out.file.handle);
1977         CHECK_STATUS(status, NT_STATUS_OK);
1978
1979         if (strcmp(d[0].id_both_directory_info.name.s, "test_aapl") != 0) {
1980                 torture_result(tctx, TORTURE_FAIL,
1981                                "(%s) write_stream() failed",
1982                                __location__);
1983                 ret = false;
1984                 goto done;
1985         }
1986
1987         if (d[0].id_both_directory_info.short_name.private_length != 24) {
1988                 torture_result(tctx, TORTURE_FAIL,
1989                                "(%s) bad short_name length %" PRIu32 ", expected 24",
1990                                __location__, d[0].id_both_directory_info.short_name.private_length);
1991                 ret = false;
1992                 goto done;
1993         }
1994
1995         torture_comment(tctx, "short_name buffer:\n");
1996         dump_data(0, d[0].id_both_directory_info.short_name_buf, 24);
1997
1998         /*
1999          * Extract data as specified by the AAPL extension:
2000          * - ea_size contains max_access
2001          * - short_name contains resource fork length + FinderInfo
2002          * - reserved2 contains the unix mode
2003          */
2004         torture_comment(tctx, "mac_access: %" PRIx32 "\n",
2005                         d[0].id_both_directory_info.ea_size);
2006
2007         rfork_len = BVAL(d[0].id_both_directory_info.short_name_buf, 0);
2008         if (rfork_len != 3) {
2009                 torture_result(tctx, TORTURE_FAIL,
2010                                "(%s) expected resource fork length 3, got: %" PRIu64,
2011                                __location__, rfork_len);
2012                 ret = false;
2013                 goto done;
2014         }
2015
2016         memcpy(type_creator_buf, d[0].id_both_directory_info.short_name_buf + 8, 8);
2017         type_creator_buf[8] = 0;
2018         if (strcmp(type_creator, type_creator_buf) != 0) {
2019                 torture_result(tctx, TORTURE_FAIL,
2020                                "(%s) expected type/creator \"%s\" , got: %s",
2021                                __location__, type_creator, type_creator_buf);
2022                 ret = false;
2023                 goto done;
2024         }
2025
2026 done:
2027         talloc_free(mem_ctx);
2028         return ret;
2029 }
2030
2031 static uint64_t patt_hash(uint64_t off)
2032 {
2033         return off;
2034 }
2035
2036 static bool write_pattern(struct torture_context *torture,
2037                           struct smb2_tree *tree, TALLOC_CTX *mem_ctx,
2038                           struct smb2_handle h, uint64_t off, uint64_t len,
2039                           uint64_t patt_off)
2040 {
2041         NTSTATUS status;
2042         uint64_t i;
2043         uint8_t *buf;
2044         uint64_t io_sz = MIN(1024 * 64, len);
2045
2046         if (len == 0) {
2047                 return true;
2048         }
2049
2050         torture_assert(torture, (len % 8) == 0, "invalid write len");
2051
2052         buf = talloc_zero_size(mem_ctx, io_sz);
2053         torture_assert(torture, (buf != NULL), "no memory for file data buf");
2054
2055         while (len > 0) {
2056                 for (i = 0; i <= io_sz - 8; i += 8) {
2057                         SBVAL(buf, i, patt_hash(patt_off));
2058                         patt_off += 8;
2059                 }
2060
2061                 status = smb2_util_write(tree, h,
2062                                          buf, off, io_sz);
2063                 torture_assert_ntstatus_ok(torture, status, "file write");
2064
2065                 len -= io_sz;
2066                 off += io_sz;
2067         }
2068
2069         talloc_free(buf);
2070
2071         return true;
2072 }
2073
2074 static bool check_pattern(struct torture_context *torture,
2075                           struct smb2_tree *tree, TALLOC_CTX *mem_ctx,
2076                           struct smb2_handle h, uint64_t off, uint64_t len,
2077                           uint64_t patt_off)
2078 {
2079         if (len == 0) {
2080                 return true;
2081         }
2082
2083         torture_assert(torture, (len % 8) == 0, "invalid read len");
2084
2085         while (len > 0) {
2086                 uint64_t i;
2087                 struct smb2_read r;
2088                 NTSTATUS status;
2089                 uint64_t io_sz = MIN(1024 * 64, len);
2090
2091                 ZERO_STRUCT(r);
2092                 r.in.file.handle = h;
2093                 r.in.length      = io_sz;
2094                 r.in.offset      = off;
2095                 status = smb2_read(tree, mem_ctx, &r);
2096                 torture_assert_ntstatus_ok(torture, status, "read");
2097
2098                 torture_assert_u64_equal(torture, r.out.data.length, io_sz,
2099                                          "read data len mismatch");
2100
2101                 for (i = 0; i <= io_sz - 8; i += 8, patt_off += 8) {
2102                         uint64_t data = BVAL(r.out.data.data, i);
2103                         torture_assert_u64_equal(torture, data, patt_hash(patt_off),
2104                                                  talloc_asprintf(torture, "read data "
2105                                                                  "pattern bad at %llu\n",
2106                                                                  (unsigned long long)off + i));
2107                 }
2108                 talloc_free(r.out.data.data);
2109                 len -= io_sz;
2110                 off += io_sz;
2111         }
2112
2113         return true;
2114 }
2115
2116 static bool test_setup_open(struct torture_context *torture,
2117                             struct smb2_tree *tree, TALLOC_CTX *mem_ctx,
2118                             const char *fname,
2119                             struct smb2_handle *fh,
2120                             uint32_t desired_access,
2121                             uint32_t file_attributes)
2122 {
2123         struct smb2_create io;
2124         NTSTATUS status;
2125
2126         ZERO_STRUCT(io);
2127         io.in.desired_access = desired_access;
2128         io.in.file_attributes = file_attributes;
2129         io.in.create_disposition = NTCREATEX_DISP_OPEN_IF;
2130         io.in.share_access =
2131                 NTCREATEX_SHARE_ACCESS_DELETE|
2132                 NTCREATEX_SHARE_ACCESS_READ|
2133                 NTCREATEX_SHARE_ACCESS_WRITE;
2134         if (file_attributes & FILE_ATTRIBUTE_DIRECTORY) {
2135                 io.in.create_options = NTCREATEX_OPTIONS_DIRECTORY;
2136         }
2137         io.in.fname = fname;
2138
2139         status = smb2_create(tree, mem_ctx, &io);
2140         torture_assert_ntstatus_ok(torture, status, "file create");
2141
2142         *fh = io.out.file.handle;
2143
2144         return true;
2145 }
2146
2147 static bool test_setup_create_fill(struct torture_context *torture,
2148                                    struct smb2_tree *tree, TALLOC_CTX *mem_ctx,
2149                                    const char *fname,
2150                                    struct smb2_handle *fh,
2151                                    uint64_t size,
2152                                    uint32_t desired_access,
2153                                    uint32_t file_attributes)
2154 {
2155         bool ok;
2156
2157         ok = test_setup_open(torture, tree, mem_ctx,
2158                              fname,
2159                              fh,
2160                              desired_access,
2161                              file_attributes);
2162         torture_assert(torture, ok, "file open");
2163
2164         if (size > 0) {
2165                 ok = write_pattern(torture, tree, mem_ctx, *fh, 0, size, 0);
2166                 torture_assert(torture, ok, "write pattern");
2167         }
2168         return true;
2169 }
2170
2171 static bool test_setup_copy_chunk(struct torture_context *torture,
2172                                   struct smb2_tree *tree, TALLOC_CTX *mem_ctx,
2173                                   uint32_t nchunks,
2174                                   struct smb2_handle *src_h,
2175                                   uint64_t src_size,
2176                                   uint32_t src_desired_access,
2177                                   struct smb2_handle *dest_h,
2178                                   uint64_t dest_size,
2179                                   uint32_t dest_desired_access,
2180                                   struct srv_copychunk_copy *cc_copy,
2181                                   union smb_ioctl *io)
2182 {
2183         struct req_resume_key_rsp res_key;
2184         bool ok;
2185         NTSTATUS status;
2186         enum ndr_err_code ndr_ret;
2187
2188         ok = test_setup_create_fill(torture, tree, mem_ctx, FNAME_CC_SRC,
2189                                     src_h, src_size, src_desired_access,
2190                                     FILE_ATTRIBUTE_NORMAL);
2191         torture_assert(torture, ok, "src file create fill");
2192
2193         ok = test_setup_create_fill(torture, tree, mem_ctx, FNAME_CC_DST,
2194                                     dest_h, dest_size, dest_desired_access,
2195                                     FILE_ATTRIBUTE_NORMAL);
2196         torture_assert(torture, ok, "dest file create fill");
2197
2198         ZERO_STRUCTPN(io);
2199         io->smb2.level = RAW_IOCTL_SMB2;
2200         io->smb2.in.file.handle = *src_h;
2201         io->smb2.in.function = FSCTL_SRV_REQUEST_RESUME_KEY;
2202         /* Allow for Key + ContextLength + Context */
2203         io->smb2.in.max_response_size = 32;
2204         io->smb2.in.flags = SMB2_IOCTL_FLAG_IS_FSCTL;
2205
2206         status = smb2_ioctl(tree, mem_ctx, &io->smb2);
2207         torture_assert_ntstatus_ok(torture, status,
2208                                    "FSCTL_SRV_REQUEST_RESUME_KEY");
2209
2210         ndr_ret = ndr_pull_struct_blob(&io->smb2.out.out, mem_ctx, &res_key,
2211                         (ndr_pull_flags_fn_t)ndr_pull_req_resume_key_rsp);
2212
2213         torture_assert_ndr_success(torture, ndr_ret,
2214                                    "ndr_pull_req_resume_key_rsp");
2215
2216         ZERO_STRUCTPN(io);
2217         io->smb2.level = RAW_IOCTL_SMB2;
2218         io->smb2.in.file.handle = *dest_h;
2219         io->smb2.in.function = FSCTL_SRV_COPYCHUNK;
2220         io->smb2.in.max_response_size = sizeof(struct srv_copychunk_rsp);
2221         io->smb2.in.flags = SMB2_IOCTL_FLAG_IS_FSCTL;
2222
2223         ZERO_STRUCTPN(cc_copy);
2224         memcpy(cc_copy->source_key, res_key.resume_key, ARRAY_SIZE(cc_copy->source_key));
2225         cc_copy->chunk_count = nchunks;
2226         cc_copy->chunks = talloc_zero_array(mem_ctx, struct srv_copychunk, nchunks);
2227         torture_assert(torture, (cc_copy->chunks != NULL), "no memory for chunks");
2228
2229         return true;
2230 }
2231
2232
2233 static bool check_copy_chunk_rsp(struct torture_context *torture,
2234                                  struct srv_copychunk_rsp *cc_rsp,
2235                                  uint32_t ex_chunks_written,
2236                                  uint32_t ex_chunk_bytes_written,
2237                                  uint32_t ex_total_bytes_written)
2238 {
2239         torture_assert_int_equal(torture, cc_rsp->chunks_written,
2240                                  ex_chunks_written, "num chunks");
2241         torture_assert_int_equal(torture, cc_rsp->chunk_bytes_written,
2242                                  ex_chunk_bytes_written, "chunk bytes written");
2243         torture_assert_int_equal(torture, cc_rsp->total_bytes_written,
2244                                  ex_total_bytes_written, "chunk total bytes");
2245         return true;
2246 }
2247
2248 static bool neg_aapl_copyfile(struct torture_context *tctx,
2249                               struct smb2_tree *tree,
2250                               uint64_t flags)
2251 {
2252         TALLOC_CTX *mem_ctx = talloc_new(tctx);
2253         const char *fname = "aapl";
2254         NTSTATUS status;
2255         struct smb2_create io;
2256         DATA_BLOB data;
2257         struct smb2_create_blob *aapl = NULL;
2258         uint32_t aapl_cmd;
2259         uint32_t aapl_reply_bitmap;
2260         uint32_t aapl_server_caps;
2261         bool ret = true;
2262
2263         ZERO_STRUCT(io);
2264         io.in.desired_access     = SEC_FLAG_MAXIMUM_ALLOWED;
2265         io.in.file_attributes    = FILE_ATTRIBUTE_NORMAL;
2266         io.in.create_disposition = NTCREATEX_DISP_OVERWRITE_IF;
2267         io.in.share_access = (NTCREATEX_SHARE_ACCESS_DELETE |
2268                               NTCREATEX_SHARE_ACCESS_READ |
2269                               NTCREATEX_SHARE_ACCESS_WRITE);
2270         io.in.fname = fname;
2271
2272         data = data_blob_talloc(mem_ctx, NULL, 3 * sizeof(uint64_t));
2273         SBVAL(data.data, 0, SMB2_CRTCTX_AAPL_SERVER_QUERY);
2274         SBVAL(data.data, 8, (SMB2_CRTCTX_AAPL_SERVER_CAPS));
2275         SBVAL(data.data, 16, flags);
2276
2277         status = smb2_create_blob_add(tctx, &io.in.blobs, "AAPL", data);
2278         CHECK_STATUS(status, NT_STATUS_OK);
2279
2280         status = smb2_create(tree, tctx, &io);
2281         CHECK_STATUS(status, NT_STATUS_OK);
2282
2283         aapl = smb2_create_blob_find(&io.out.blobs,
2284                                      SMB2_CREATE_TAG_AAPL);
2285         if (aapl == NULL) {
2286                 ret = false;
2287                 goto done;
2288
2289         }
2290         if (aapl->data.length < 24) {
2291                 ret = false;
2292                 goto done;
2293         }
2294
2295         aapl_cmd = IVAL(aapl->data.data, 0);
2296         if (aapl_cmd != SMB2_CRTCTX_AAPL_SERVER_QUERY) {
2297                 torture_result(tctx, TORTURE_FAIL,
2298                                "(%s) unexpected cmd: %d",
2299                                __location__, (int)aapl_cmd);
2300                 ret = false;
2301                 goto done;
2302         }
2303
2304         aapl_reply_bitmap = BVAL(aapl->data.data, 8);
2305         if (!(aapl_reply_bitmap & SMB2_CRTCTX_AAPL_SERVER_CAPS)) {
2306                 torture_result(tctx, TORTURE_FAIL,
2307                                "(%s) unexpected reply_bitmap: %d",
2308                                __location__, (int)aapl_reply_bitmap);
2309                 ret = false;
2310                 goto done;
2311         }
2312
2313         aapl_server_caps = BVAL(aapl->data.data, 16);
2314         if (!(aapl_server_caps & flags)) {
2315                 torture_result(tctx, TORTURE_FAIL,
2316                                "(%s) unexpected server_caps: %d",
2317                                __location__, (int)aapl_server_caps);
2318                 ret = false;
2319                 goto done;
2320         }
2321
2322 done:
2323         status = smb2_util_close(tree, io.out.file.handle);
2324         CHECK_STATUS(status, NT_STATUS_OK);
2325
2326         smb2_util_unlink(tree, "aapl");
2327         talloc_free(mem_ctx);
2328         return ret;
2329 }
2330
2331 static bool test_copyfile(struct torture_context *torture,
2332                           struct smb2_tree *tree)
2333 {
2334         struct smb2_handle src_h;
2335         struct smb2_handle dest_h;
2336         NTSTATUS status;
2337         union smb_ioctl io;
2338         TALLOC_CTX *tmp_ctx = talloc_new(tree);
2339         struct srv_copychunk_copy cc_copy;
2340         struct srv_copychunk_rsp cc_rsp;
2341         enum ndr_err_code ndr_ret;
2342         bool ok;
2343
2344         /*
2345          * First test a copy_chunk with a 0 chunk count without having
2346          * enabled this via AAPL. The request must not fail and the
2347          * copied length in the response must be 0. This is verified
2348          * against Windows 2008r2.
2349          */
2350
2351         ok = test_setup_copy_chunk(torture, tree, tmp_ctx,
2352                                    0, /* 0 chunks, copyfile semantics */
2353                                    &src_h, 4096, /* fill 4096 byte src file */
2354                                    SEC_FILE_READ_DATA | SEC_FILE_WRITE_DATA,
2355                                    &dest_h, 0,  /* 0 byte dest file */
2356                                    SEC_FILE_READ_DATA | SEC_FILE_WRITE_DATA,
2357                                    &cc_copy,
2358                                    &io);
2359         if (!ok) {
2360                 torture_fail_goto(torture, done, "setup copy chunk error");
2361         }
2362
2363         ndr_ret = ndr_push_struct_blob(&io.smb2.in.out, tmp_ctx,
2364                                        &cc_copy,
2365                         (ndr_push_flags_fn_t)ndr_push_srv_copychunk_copy);
2366         torture_assert_ndr_success(torture, ndr_ret,
2367                                    "ndr_push_srv_copychunk_copy");
2368
2369         status = smb2_ioctl(tree, tmp_ctx, &io.smb2);
2370         torture_assert_ntstatus_ok_goto(torture, status, ok, done, "FSCTL_SRV_COPYCHUNK");
2371
2372         ndr_ret = ndr_pull_struct_blob(&io.smb2.out.out, tmp_ctx,
2373                                        &cc_rsp,
2374                         (ndr_pull_flags_fn_t)ndr_pull_srv_copychunk_rsp);
2375         torture_assert_ndr_success(torture, ndr_ret,
2376                                    "ndr_pull_srv_copychunk_rsp");
2377
2378         ok = check_copy_chunk_rsp(torture, &cc_rsp,
2379                                   0,    /* chunks written */
2380                                   0,    /* chunk bytes unsuccessfully written */
2381                                   0); /* total bytes written */
2382         if (!ok) {
2383                 torture_fail_goto(torture, done, "bad copy chunk response data");
2384         }
2385
2386         /*
2387          * Now enable AAPL copyfile and test again, the file and the
2388          * stream must be copied by the server.
2389          */
2390         ok = neg_aapl_copyfile(torture, tree,
2391                                SMB2_CRTCTX_AAPL_SUPPORTS_OSX_COPYFILE);
2392         if (!ok) {
2393                 torture_skip_goto(torture, done, "missing AAPL copyfile");
2394                 goto done;
2395         }
2396
2397         smb2_util_close(tree, src_h);
2398         smb2_util_close(tree, dest_h);
2399         smb2_util_unlink(tree, FNAME_CC_SRC);
2400         smb2_util_unlink(tree, FNAME_CC_DST);
2401
2402         ok = torture_setup_file(tmp_ctx, tree, FNAME_CC_SRC, false);
2403         if (!ok) {
2404                 torture_fail(torture, "setup file error");
2405         }
2406         ok = write_stream(tree, __location__, torture, tmp_ctx,
2407                             FNAME_CC_SRC, AFPRESOURCE_STREAM,
2408                             10, 10, "1234567890");
2409         if (!ok) {
2410                 torture_fail(torture, "setup stream error");
2411         }
2412
2413         ok = test_setup_copy_chunk(torture, tree, tmp_ctx,
2414                                    0, /* 0 chunks, copyfile semantics */
2415                                    &src_h, 4096, /* fill 4096 byte src file */
2416                                    SEC_FILE_READ_DATA | SEC_FILE_WRITE_DATA,
2417                                    &dest_h, 0,  /* 0 byte dest file */
2418                                    SEC_FILE_READ_DATA | SEC_FILE_WRITE_DATA,
2419                                    &cc_copy,
2420                                    &io);
2421         if (!ok) {
2422                 torture_fail_goto(torture, done, "setup copy chunk error");
2423         }
2424
2425         ndr_ret = ndr_push_struct_blob(&io.smb2.in.out, tmp_ctx,
2426                                        &cc_copy,
2427                         (ndr_push_flags_fn_t)ndr_push_srv_copychunk_copy);
2428         torture_assert_ndr_success(torture, ndr_ret,
2429                                    "ndr_push_srv_copychunk_copy");
2430
2431         status = smb2_ioctl(tree, tmp_ctx, &io.smb2);
2432         torture_assert_ntstatus_ok_goto(torture, status, ok, done, "FSCTL_SRV_COPYCHUNK");
2433
2434         ndr_ret = ndr_pull_struct_blob(&io.smb2.out.out, tmp_ctx,
2435                                        &cc_rsp,
2436                         (ndr_pull_flags_fn_t)ndr_pull_srv_copychunk_rsp);
2437         torture_assert_ndr_success(torture, ndr_ret,
2438                                    "ndr_pull_srv_copychunk_rsp");
2439
2440         ok = check_copy_chunk_rsp(torture, &cc_rsp,
2441                                   0,    /* chunks written */
2442                                   0,    /* chunk bytes unsuccessfully written */
2443                                   4096); /* total bytes written */
2444         if (!ok) {
2445                 torture_fail_goto(torture, done, "bad copy chunk response data");
2446         }
2447
2448         ok = test_setup_open(torture, tree, tmp_ctx, FNAME_CC_DST, &dest_h,
2449                              SEC_FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL);
2450         if (!ok) {
2451                 torture_fail_goto(torture, done,"open failed");
2452         }
2453         ok = check_pattern(torture, tree, tmp_ctx, dest_h, 0, 4096, 0);
2454         if (!ok) {
2455                 torture_fail_goto(torture, done, "inconsistent file data");
2456         }
2457
2458         ok = check_stream(tree, __location__, torture, tmp_ctx,
2459                             FNAME_CC_DST, AFPRESOURCE_STREAM,
2460                             0, 20, 10, 10, "1234567890");
2461         if (!ok) {
2462                 torture_fail_goto(torture, done, "inconsistent stream data");
2463         }
2464
2465 done:
2466         smb2_util_close(tree, src_h);
2467         smb2_util_close(tree, dest_h);
2468         smb2_util_unlink(tree, FNAME_CC_SRC);
2469         smb2_util_unlink(tree, FNAME_CC_DST);
2470         talloc_free(tmp_ctx);
2471         return true;
2472 }
2473
2474 static bool check_stream_list(struct smb2_tree *tree,
2475                               struct torture_context *tctx,
2476                               const char *fname,
2477                               int num_exp,
2478                               const char **exp,
2479                               bool is_dir)
2480 {
2481         bool ret = true;
2482         union smb_fileinfo finfo;
2483         NTSTATUS status;
2484         int i;
2485         TALLOC_CTX *tmp_ctx = talloc_new(tctx);
2486         char **exp_sort;
2487         struct stream_struct *stream_sort;
2488         struct smb2_create create;
2489         struct smb2_handle h;
2490
2491         ZERO_STRUCT(h);
2492         torture_assert_goto(tctx, tmp_ctx != NULL, ret, done, "talloc_new failed");
2493
2494         ZERO_STRUCT(create);
2495         create.in.fname = fname;
2496         create.in.create_disposition = NTCREATEX_DISP_OPEN;
2497         create.in.desired_access = SEC_FILE_ALL;
2498         create.in.create_options = is_dir ? NTCREATEX_OPTIONS_DIRECTORY : 0;
2499         create.in.file_attributes = is_dir ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL;
2500         status = smb2_create(tree, tmp_ctx, &create);
2501         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create");
2502         h = create.out.file.handle;
2503
2504         finfo.generic.level = RAW_FILEINFO_STREAM_INFORMATION;
2505         finfo.generic.in.file.handle = h;
2506
2507         status = smb2_getinfo_file(tree, tctx, &finfo);
2508         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "get stream info");
2509
2510         smb2_util_close(tree, h);
2511
2512         torture_assert_int_equal_goto(tctx, finfo.stream_info.out.num_streams, num_exp,
2513                                       ret, done, "stream count");
2514
2515         if (num_exp == 0) {
2516                 TALLOC_FREE(tmp_ctx);
2517                 goto done;
2518         }
2519
2520         exp_sort = talloc_memdup(tmp_ctx, exp, num_exp * sizeof(*exp));
2521         torture_assert_goto(tctx, exp_sort != NULL, ret, done, __location__);
2522
2523         TYPESAFE_QSORT(exp_sort, num_exp, qsort_string);
2524
2525         stream_sort = talloc_memdup(tmp_ctx, finfo.stream_info.out.streams,
2526                                     finfo.stream_info.out.num_streams *
2527                                     sizeof(*stream_sort));
2528         torture_assert_goto(tctx, stream_sort != NULL, ret, done, __location__);
2529
2530         TYPESAFE_QSORT(stream_sort, finfo.stream_info.out.num_streams, qsort_stream);
2531
2532         for (i=0; i<num_exp; i++) {
2533                 torture_comment(tctx, "i[%d] exp[%s] got[%s]\n",
2534                                 i, exp_sort[i], stream_sort[i].stream_name.s);
2535                 torture_assert_str_equal_goto(tctx, stream_sort[i].stream_name.s, exp_sort[i],
2536                                               ret, done, "stream name");
2537         }
2538
2539 done:
2540         TALLOC_FREE(tmp_ctx);
2541         return ret;
2542 }
2543
2544 /*
2545   test stream names
2546 */
2547 static bool test_stream_names(struct torture_context *tctx,
2548                               struct smb2_tree *tree)
2549 {
2550         TALLOC_CTX *mem_ctx = talloc_new(tctx);
2551         NTSTATUS status;
2552         struct smb2_create create;
2553         struct smb2_handle h;
2554         const char *fname = BASEDIR "\\stream_names.txt";
2555         const char *sname1;
2556         bool ret;
2557         /* UTF8 private use are starts at 0xef 0x80 0x80 (0xf000) */
2558         const char *streams[] = {
2559                 ":foo" "\xef\x80\xa2" "bar:$DATA", /* "foo:bar:$DATA" */
2560                 ":bar" "\xef\x80\xa2" "baz:$DATA", /* "bar:baz:$DATA" */
2561                 "::$DATA"
2562         };
2563
2564         sname1 = talloc_asprintf(mem_ctx, "%s%s", fname, streams[0]);
2565
2566         /* clean slate ...*/
2567         smb2_util_unlink(tree, fname);
2568         smb2_deltree(tree, fname);
2569         smb2_deltree(tree, BASEDIR);
2570
2571         status = torture_smb2_testdir(tree, BASEDIR, &h);
2572         CHECK_STATUS(status, NT_STATUS_OK);
2573         smb2_util_close(tree, h);
2574
2575         torture_comment(tctx, "(%s) testing stream names\n", __location__);
2576         ZERO_STRUCT(create);
2577         create.in.desired_access = SEC_FILE_WRITE_DATA;
2578         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
2579         create.in.share_access =
2580                 NTCREATEX_SHARE_ACCESS_DELETE|
2581                 NTCREATEX_SHARE_ACCESS_READ|
2582                 NTCREATEX_SHARE_ACCESS_WRITE;
2583         create.in.create_disposition = NTCREATEX_DISP_CREATE;
2584         create.in.impersonation_level = SMB2_IMPERSONATION_ANONYMOUS;
2585         create.in.fname = sname1;
2586
2587         status = smb2_create(tree, mem_ctx, &create);
2588         CHECK_STATUS(status, NT_STATUS_OK);
2589         smb2_util_close(tree, create.out.file.handle);
2590
2591         ret = torture_setup_local_xattr(tctx, "localdir", BASEDIR "/stream_names.txt",
2592                                         "user.DosStream.bar:baz:$DATA",
2593                                         "data", strlen("data"));
2594         CHECK_VALUE(ret, true);
2595
2596         ret = check_stream_list(tree, tctx, fname, 3, streams, false);
2597         CHECK_VALUE(ret, true);
2598
2599 done:
2600         status = smb2_util_unlink(tree, fname);
2601         smb2_deltree(tree, BASEDIR);
2602         talloc_free(mem_ctx);
2603
2604         return ret;
2605 }
2606
2607 /* Renaming a directory with open file, should work for OS X AAPL clients */
2608 static bool test_rename_dir_openfile(struct torture_context *torture,
2609                                      struct smb2_tree *tree)
2610 {
2611         bool ret = true;
2612         NTSTATUS status;
2613         union smb_open io;
2614         union smb_close cl;
2615         union smb_setfileinfo sinfo;
2616         struct smb2_handle d1, h1;
2617         const char *renamedir = BASEDIR "-new";
2618
2619         smb2_deltree(tree, BASEDIR);
2620         smb2_util_rmdir(tree, BASEDIR);
2621         smb2_deltree(tree, renamedir);
2622
2623         ZERO_STRUCT(io.smb2);
2624         io.generic.level = RAW_OPEN_SMB2;
2625         io.smb2.in.create_flags = 0;
2626         io.smb2.in.desired_access = 0x0017019f;
2627         io.smb2.in.create_options = NTCREATEX_OPTIONS_DIRECTORY;
2628         io.smb2.in.file_attributes = FILE_ATTRIBUTE_DIRECTORY;
2629         io.smb2.in.share_access = 0;
2630         io.smb2.in.alloc_size = 0;
2631         io.smb2.in.create_disposition = NTCREATEX_DISP_CREATE;
2632         io.smb2.in.impersonation_level = SMB2_IMPERSONATION_ANONYMOUS;
2633         io.smb2.in.security_flags = 0;
2634         io.smb2.in.fname = BASEDIR;
2635
2636         status = smb2_create(tree, torture, &(io.smb2));
2637         torture_assert_ntstatus_ok(torture, status, "smb2_create dir");
2638         d1 = io.smb2.out.file.handle;
2639
2640         ZERO_STRUCT(io.smb2);
2641         io.generic.level = RAW_OPEN_SMB2;
2642         io.smb2.in.create_flags = 0;
2643         io.smb2.in.desired_access = 0x0017019f;
2644         io.smb2.in.create_options = NTCREATEX_OPTIONS_NON_DIRECTORY_FILE;
2645         io.smb2.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
2646         io.smb2.in.share_access = 0;
2647         io.smb2.in.alloc_size = 0;
2648         io.smb2.in.create_disposition = NTCREATEX_DISP_CREATE;
2649         io.smb2.in.impersonation_level = SMB2_IMPERSONATION_ANONYMOUS;
2650         io.smb2.in.security_flags = 0;
2651         io.smb2.in.fname = BASEDIR "\\file.txt";
2652
2653         status = smb2_create(tree, torture, &(io.smb2));
2654         torture_assert_ntstatus_ok(torture, status, "smb2_create file");
2655         h1 = io.smb2.out.file.handle;
2656
2657         torture_comment(torture, "Renaming directory without AAPL, must fail\n");
2658
2659         ZERO_STRUCT(sinfo);
2660         sinfo.rename_information.level = RAW_SFILEINFO_RENAME_INFORMATION;
2661         sinfo.rename_information.in.file.handle = d1;
2662         sinfo.rename_information.in.overwrite = 0;
2663         sinfo.rename_information.in.root_fid = 0;
2664         sinfo.rename_information.in.new_name = renamedir;
2665         status = smb2_setinfo_file(tree, &sinfo);
2666         torture_assert_ntstatus_equal(torture, status, NT_STATUS_ACCESS_DENIED,
2667                                       "smb2_setinfo_file");
2668
2669         ZERO_STRUCT(cl.smb2);
2670         cl.smb2.level = RAW_CLOSE_SMB2;
2671         cl.smb2.in.file.handle = d1;
2672         status = smb2_close(tree, &(cl.smb2));
2673         torture_assert_ntstatus_ok(torture, status, "smb2_close");
2674         ZERO_STRUCT(d1);
2675
2676         torture_comment(torture, "Enabling AAPL\n");
2677
2678         ret = enable_aapl(torture, tree);
2679         torture_assert(torture, ret == true, "enable_aapl failed");
2680
2681         torture_comment(torture, "Renaming directory with AAPL\n");
2682
2683         ZERO_STRUCT(io.smb2);
2684         io.generic.level = RAW_OPEN_SMB2;
2685         io.smb2.in.desired_access = 0x0017019f;
2686         io.smb2.in.file_attributes = FILE_ATTRIBUTE_DIRECTORY;
2687         io.smb2.in.share_access = 0;
2688         io.smb2.in.alloc_size = 0;
2689         io.smb2.in.create_disposition = NTCREATEX_DISP_OPEN;
2690         io.smb2.in.impersonation_level = SMB2_IMPERSONATION_ANONYMOUS;
2691         io.smb2.in.security_flags = 0;
2692         io.smb2.in.fname = BASEDIR;
2693
2694         status = smb2_create(tree, torture, &(io.smb2));
2695         torture_assert_ntstatus_ok(torture, status, "smb2_create dir");
2696         d1 = io.smb2.out.file.handle;
2697
2698         ZERO_STRUCT(io.smb2);
2699         io.generic.level = RAW_OPEN_SMB2;
2700         io.smb2.in.desired_access = 0x0017019f;
2701         io.smb2.in.file_attributes = FILE_ATTRIBUTE_DIRECTORY;
2702         io.smb2.in.share_access = 0;
2703         io.smb2.in.alloc_size = 0;
2704         io.smb2.in.create_disposition = NTCREATEX_DISP_OPEN;
2705         io.smb2.in.impersonation_level = SMB2_IMPERSONATION_ANONYMOUS;
2706         io.smb2.in.security_flags = 0;
2707         io.smb2.in.fname = BASEDIR;
2708         sinfo.rename_information.in.file.handle = d1;
2709
2710         status = smb2_setinfo_file(tree, &sinfo);
2711         torture_assert_ntstatus_ok(torture, status, "smb2_setinfo_file");
2712
2713         ZERO_STRUCT(cl.smb2);
2714         cl.smb2.level = RAW_CLOSE_SMB2;
2715         cl.smb2.in.file.handle = d1;
2716         status = smb2_close(tree, &(cl.smb2));
2717         torture_assert_ntstatus_ok(torture, status, "smb2_close");
2718         ZERO_STRUCT(d1);
2719
2720         cl.smb2.in.file.handle = h1;
2721         status = smb2_close(tree, &(cl.smb2));
2722         torture_assert_ntstatus_ok(torture, status, "smb2_close");
2723         ZERO_STRUCT(h1);
2724
2725         torture_comment(torture, "Cleaning up\n");
2726
2727         if (h1.data) {
2728                 ZERO_STRUCT(cl.smb2);
2729                 cl.smb2.level = RAW_CLOSE_SMB2;
2730                 cl.smb2.in.file.handle = h1;
2731                 status = smb2_close(tree, &(cl.smb2));
2732         }
2733
2734         smb2_deltree(tree, BASEDIR);
2735         smb2_deltree(tree, renamedir);
2736         return ret;
2737 }
2738
2739 /*
2740  * Note: This test depends on "vfs objects = catia fruit streams_xattr".  For
2741  * some tests torture must be run on the host it tests and takes an additional
2742  * argument with the local path to the share:
2743  * "--option=torture:localdir=<SHAREPATH>".
2744  */
2745 struct torture_suite *torture_vfs_fruit(void)
2746 {
2747         struct torture_suite *suite = torture_suite_create(
2748                 talloc_autofree_context(), "fruit");
2749
2750         suite->description = talloc_strdup(suite, "vfs_fruit tests");
2751
2752         torture_suite_add_1smb2_test(suite, "copyfile", test_copyfile);
2753         torture_suite_add_1smb2_test(suite, "read metadata", test_read_atalk_metadata);
2754         torture_suite_add_1smb2_test(suite, "write metadata", test_write_atalk_metadata);
2755         torture_suite_add_1smb2_test(suite, "resource fork IO", test_write_atalk_rfork_io);
2756         torture_suite_add_1smb2_test(suite, "OS X AppleDouble file conversion", test_adouble_conversion);
2757         torture_suite_add_1smb2_test(suite, "SMB2/CREATE context AAPL", test_aapl);
2758         torture_suite_add_1smb2_test(suite, "stream names", test_stream_names);
2759         torture_suite_add_1smb2_test(suite, "truncate resource fork to 0 bytes", test_rfork_truncate);
2760         torture_suite_add_1smb2_test(suite, "opening and creating resource fork", test_rfork_create);
2761         torture_suite_add_1smb2_test(suite, "rename_dir_openfile", test_rename_dir_openfile);
2762
2763         return suite;
2764 }