r24473: Prove this is also the same for NTcreateX. It's pretty much
[ira/wip.git] / source4 / torture / raw / samba3misc.c
1 /* 
2    Unix SMB/CIFS implementation.
3    Test some misc Samba3 code paths
4    Copyright (C) Volker Lendecke 2006
5    
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10    
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15    
16    You should have received a copy of the GNU General Public License
17    along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #include "includes.h"
21 #include "torture/torture.h"
22 #include "libcli/raw/libcliraw.h"
23 #include "system/time.h"
24 #include "system/filesys.h"
25 #include "libcli/libcli.h"
26 #include "torture/util.h"
27
28 #define CHECK_STATUS(status, correct) do { \
29         if (!NT_STATUS_EQUAL(status, correct)) { \
30                 printf("(%s) Incorrect status %s - should be %s\n", \
31                        __location__, nt_errstr(status), nt_errstr(correct)); \
32                 ret = False; \
33         } \
34 } while (0)
35
36 BOOL torture_samba3_checkfsp(struct torture_context *torture)
37 {
38         struct smbcli_state *cli;
39         const char *fname = "test.txt";
40         const char *dirname = "testdir";
41         int fnum;
42         NTSTATUS status;
43         BOOL ret = True;
44         TALLOC_CTX *mem_ctx;
45         ssize_t nread;
46         char buf[16];
47         struct smbcli_tree *tree2;
48
49         if ((mem_ctx = talloc_init("torture_samba3_checkfsp")) == NULL) {
50                 d_printf("talloc_init failed\n");
51                 return False;
52         }
53
54         if (!torture_open_connection_share(
55                     torture, &cli, torture_setting_string(torture, "host", NULL),
56                     torture_setting_string(torture, "share", NULL), NULL)) {
57                 d_printf("torture_open_connection_share failed\n");
58                 ret = False;
59                 goto done;
60         }
61
62         smbcli_deltree(cli->tree, dirname);
63
64         status = torture_second_tcon(torture, cli->session,
65                                      torture_setting_string(torture, "share", NULL),
66                                      &tree2);
67         CHECK_STATUS(status, NT_STATUS_OK);
68         if (!NT_STATUS_IS_OK(status))
69                 goto done;
70
71         /* Try a read on an invalid FID */
72
73         nread = smbcli_read(cli->tree, 4711, buf, 0, sizeof(buf));
74         CHECK_STATUS(smbcli_nt_error(cli->tree), NT_STATUS_INVALID_HANDLE);
75
76         /* Try a read on a directory handle */
77
78         status = smbcli_mkdir(cli->tree, dirname);
79         if (!NT_STATUS_IS_OK(status)) {
80                 d_printf("smbcli_mkdir failed: %s\n", nt_errstr(status));
81                 ret = False;
82                 goto done;
83         }
84
85         /* Open the directory */
86         {
87                 union smb_open io;
88                 io.generic.level = RAW_OPEN_NTCREATEX;
89                 io.ntcreatex.in.flags = NTCREATEX_FLAGS_EXTENDED;
90                 io.ntcreatex.in.root_fid = 0;
91                 io.ntcreatex.in.security_flags = 0;
92                 io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE;
93                 io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL;
94                 io.ntcreatex.in.alloc_size = 0;
95                 io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_DIRECTORY;
96                 io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_NONE;
97                 io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN;
98                 io.ntcreatex.in.create_options = 0;
99                 io.ntcreatex.in.fname = dirname;
100                 status = smb_raw_open(cli->tree, mem_ctx, &io);
101                 if (!NT_STATUS_IS_OK(status)) {
102                         d_printf("smb_open on the directory failed: %s\n",
103                                  nt_errstr(status));
104                         ret = False;
105                         goto done;
106                 }
107                 fnum = io.ntcreatex.out.file.fnum;
108         }
109
110         /* Try a read on the directory */
111
112         nread = smbcli_read(cli->tree, fnum, buf, 0, sizeof(buf));
113         if (nread >= 0) {
114                 d_printf("smbcli_read on a directory succeeded, expected "
115                          "failure\n");
116                 ret = False;
117         }
118
119         CHECK_STATUS(smbcli_nt_error(cli->tree),
120                      NT_STATUS_INVALID_DEVICE_REQUEST);
121
122         /* Same test on the second tcon */
123
124         nread = smbcli_read(tree2, fnum, buf, 0, sizeof(buf));
125         if (nread >= 0) {
126                 d_printf("smbcli_read on a directory succeeded, expected "
127                          "failure\n");
128                 ret = False;
129         }
130
131         CHECK_STATUS(smbcli_nt_error(tree2), NT_STATUS_INVALID_HANDLE);
132
133         smbcli_close(cli->tree, fnum);
134
135         /* Try a normal file read on a second tcon */
136
137         fnum = smbcli_open(cli->tree, fname, O_RDWR|O_CREAT, DENY_NONE);
138         if (fnum == -1) {
139                 d_printf("Failed to create %s - %s\n", fname,
140                          smbcli_errstr(cli->tree));
141                 ret = False;
142                 goto done;
143         }
144
145         nread = smbcli_read(tree2, fnum, buf, 0, sizeof(buf));
146         CHECK_STATUS(smbcli_nt_error(tree2), NT_STATUS_INVALID_HANDLE);
147
148         smbcli_close(cli->tree, fnum);
149
150  done:
151         smbcli_deltree(cli->tree, dirname);
152         torture_close_connection(cli);
153         talloc_free(mem_ctx);
154
155         return ret;
156 }
157
158 static NTSTATUS raw_smbcli_open(struct smbcli_tree *tree, const char *fname, int flags, int share_mode, int *fnum)
159 {
160         union smb_open open_parms;
161         uint_t openfn=0;
162         uint_t accessmode=0;
163         TALLOC_CTX *mem_ctx;
164         NTSTATUS status;
165
166         mem_ctx = talloc_init("raw_open");
167         if (!mem_ctx) return NT_STATUS_NO_MEMORY;
168
169         if (flags & O_CREAT) {
170                 openfn |= OPENX_OPEN_FUNC_CREATE;
171         }
172         if (!(flags & O_EXCL)) {
173                 if (flags & O_TRUNC) {
174                         openfn |= OPENX_OPEN_FUNC_TRUNC;
175                 } else {
176                         openfn |= OPENX_OPEN_FUNC_OPEN;
177                 }
178         }
179
180         accessmode = (share_mode<<OPENX_MODE_DENY_SHIFT);
181
182         if ((flags & O_ACCMODE) == O_RDWR) {
183                 accessmode |= OPENX_MODE_ACCESS_RDWR;
184         } else if ((flags & O_ACCMODE) == O_WRONLY) {
185                 accessmode |= OPENX_MODE_ACCESS_WRITE;
186         } else if ((flags & O_ACCMODE) == O_RDONLY) {
187                 accessmode |= OPENX_MODE_ACCESS_READ;
188         }
189
190 #if defined(O_SYNC)
191         if ((flags & O_SYNC) == O_SYNC) {
192                 accessmode |= OPENX_MODE_WRITE_THRU;
193         }
194 #endif
195
196         if (share_mode == DENY_FCB) {
197                 accessmode = OPENX_MODE_ACCESS_FCB | OPENX_MODE_DENY_FCB;
198         }
199
200         open_parms.openx.level = RAW_OPEN_OPENX;
201         open_parms.openx.in.flags = 0;
202         open_parms.openx.in.open_mode = accessmode;
203         open_parms.openx.in.search_attrs = FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN;
204         open_parms.openx.in.file_attrs = 0;
205         open_parms.openx.in.write_time = 0;
206         open_parms.openx.in.open_func = openfn;
207         open_parms.openx.in.size = 0;
208         open_parms.openx.in.timeout = 0;
209         open_parms.openx.in.fname = fname;
210
211         status = smb_raw_open(tree, mem_ctx, &open_parms);
212         talloc_free(mem_ctx);
213
214         if (fnum && NT_STATUS_IS_OK(status)) {
215                 *fnum = open_parms.openx.out.file.fnum;
216         }
217
218         return status;
219 }
220
221 static NTSTATUS raw_smbcli_t2open(struct smbcli_tree *tree, const char *fname, int flags, int share_mode, int *fnum)
222 {
223         union smb_open io;
224         uint_t openfn=0;
225         uint_t accessmode=0;
226         TALLOC_CTX *mem_ctx;
227         NTSTATUS status;
228
229         mem_ctx = talloc_init("raw_t2open");
230         if (!mem_ctx) return NT_STATUS_NO_MEMORY;
231
232         if (flags & O_CREAT) {
233                 openfn |= OPENX_OPEN_FUNC_CREATE;
234         }
235         if (!(flags & O_EXCL)) {
236                 if (flags & O_TRUNC) {
237                         openfn |= OPENX_OPEN_FUNC_TRUNC;
238                 } else {
239                         openfn |= OPENX_OPEN_FUNC_OPEN;
240                 }
241         }
242
243         accessmode = (share_mode<<OPENX_MODE_DENY_SHIFT);
244
245         if ((flags & O_ACCMODE) == O_RDWR) {
246                 accessmode |= OPENX_MODE_ACCESS_RDWR;
247         } else if ((flags & O_ACCMODE) == O_WRONLY) {
248                 accessmode |= OPENX_MODE_ACCESS_WRITE;
249         } else if ((flags & O_ACCMODE) == O_RDONLY) {
250                 accessmode |= OPENX_MODE_ACCESS_READ;
251         }
252
253 #if defined(O_SYNC)
254         if ((flags & O_SYNC) == O_SYNC) {
255                 accessmode |= OPENX_MODE_WRITE_THRU;
256         }
257 #endif
258
259         if (share_mode == DENY_FCB) {
260                 accessmode = OPENX_MODE_ACCESS_FCB | OPENX_MODE_DENY_FCB;
261         }
262
263         memset(&io, '\0', sizeof(io));
264         io.t2open.level = RAW_OPEN_T2OPEN;
265         io.t2open.in.flags = 0;
266         io.t2open.in.open_mode = accessmode;
267         io.t2open.in.search_attrs = FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN;
268         io.t2open.in.file_attrs = 0;
269         io.t2open.in.write_time = 0;
270         io.t2open.in.open_func = openfn;
271         io.t2open.in.size = 0;
272         io.t2open.in.timeout = 0;
273         io.t2open.in.fname = fname;
274
275         io.t2open.in.num_eas = 1;
276         io.t2open.in.eas = talloc_array(mem_ctx, struct ea_struct, io.t2open.in.num_eas);
277         io.t2open.in.eas[0].flags = 0;
278         io.t2open.in.eas[0].name.s = ".CLASSINFO";
279         io.t2open.in.eas[0].value = data_blob_talloc(mem_ctx, "first value", 11);
280
281         status = smb_raw_open(tree, mem_ctx, &io);
282         talloc_free(mem_ctx);
283
284         if (fnum && NT_STATUS_IS_OK(status)) {
285                 *fnum = io.openx.out.file.fnum;
286         }
287
288         return status;
289 }
290
291 static NTSTATUS raw_smbcli_ntcreate(struct smbcli_tree *tree, const char *fname, int *fnum)
292 {
293         union smb_open io;
294         TALLOC_CTX *mem_ctx;
295         NTSTATUS status;
296
297         mem_ctx = talloc_init("raw_t2open");
298         if (!mem_ctx) return NT_STATUS_NO_MEMORY;
299
300         memset(&io, '\0', sizeof(io));
301         io.generic.level = RAW_OPEN_NTCREATEX;
302         io.ntcreatex.in.flags = NTCREATEX_FLAGS_EXTENDED;
303         io.ntcreatex.in.root_fid = 0;
304         io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL;
305         io.ntcreatex.in.alloc_size = 0;
306         io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
307         io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_READ | NTCREATEX_SHARE_ACCESS_WRITE;
308         io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE;
309         io.ntcreatex.in.create_options = 0;
310         io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS;
311         io.ntcreatex.in.security_flags = 0;
312         io.ntcreatex.in.fname = fname;
313
314         status = smb_raw_open(tree, mem_ctx, &io);
315         talloc_free(mem_ctx);
316
317         if (fnum && NT_STATUS_IS_OK(status)) {
318                 *fnum = io.openx.out.file.fnum;
319         }
320
321         return status;
322 }
323
324
325 BOOL torture_samba3_badpath(struct torture_context *torture)
326 {
327         struct smbcli_state *cli_nt;
328         struct smbcli_state *cli_dos;
329         const char *fname = "test.txt";
330         const char *dirname = "testdir";
331         char *fpath;
332         int fnum;
333         NTSTATUS status;
334         BOOL ret = True;
335         TALLOC_CTX *mem_ctx;
336         BOOL nt_status_support;
337
338         if (!(mem_ctx = talloc_init("torture_samba3_badpath"))) {
339                 d_printf("talloc_init failed\n");
340                 return False;
341         }
342
343         nt_status_support = lp_nt_status_support();
344
345         if (!lp_set_cmdline("nt status support", "yes")) {
346                 printf("Could not set 'nt status support = yes'\n");
347                 goto fail;
348         }
349
350         if (!torture_open_connection(&cli_nt, 0)) {
351                 goto fail;
352         }
353
354         if (!lp_set_cmdline("nt status support", "no")) {
355                 printf("Could not set 'nt status support = yes'\n");
356                 goto fail;
357         }
358
359         if (!torture_open_connection(&cli_dos, 1)) {
360                 goto fail;
361         }
362
363         if (!lp_set_cmdline("nt status support",
364                             nt_status_support ? "yes":"no")) {
365                 printf("Could not reset 'nt status support = yes'");
366                 goto fail;
367         }
368
369         smbcli_deltree(cli_nt->tree, dirname);
370
371         status = smbcli_mkdir(cli_nt->tree, dirname);
372         if (!NT_STATUS_IS_OK(status)) {
373                 d_printf("smbcli_mkdir failed: %s\n", nt_errstr(status));
374                 ret = False;
375                 goto done;
376         }
377
378         status = smbcli_chkpath(cli_nt->tree, dirname);
379         CHECK_STATUS(status, NT_STATUS_OK);
380
381         status = smbcli_chkpath(cli_nt->tree,
382                                 talloc_asprintf(mem_ctx, "%s\\bla", dirname));
383         CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_NOT_FOUND);
384
385         status = smbcli_chkpath(cli_dos->tree,
386                                 talloc_asprintf(mem_ctx, "%s\\bla", dirname));
387         CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath));
388
389         status = smbcli_chkpath(cli_nt->tree,
390                                 talloc_asprintf(mem_ctx, "%s\\bla\\blub",
391                                                 dirname));
392         CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_NOT_FOUND);
393         status = smbcli_chkpath(cli_dos->tree,
394                                 talloc_asprintf(mem_ctx, "%s\\bla\\blub",
395                                                 dirname));
396         CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath));
397
398         if (!(fpath = talloc_asprintf(mem_ctx, "%s\\%s", dirname, fname))) {
399                 goto fail;
400         }
401         fnum = smbcli_open(cli_nt->tree, fpath, O_RDWR | O_CREAT, DENY_NONE);
402         if (fnum == -1) {
403                 d_printf("Could not create file %s: %s\n", fpath,
404                          smbcli_errstr(cli_nt->tree));
405                 goto fail;
406         }
407         smbcli_close(cli_nt->tree, fnum);
408
409         /*
410          * Do a whole bunch of error code checks on chkpath
411          */
412
413         status = smbcli_chkpath(cli_nt->tree, fpath);
414         CHECK_STATUS(status, NT_STATUS_NOT_A_DIRECTORY);
415         status = smbcli_chkpath(cli_dos->tree, fpath);
416         CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath));
417
418         status = smbcli_chkpath(cli_nt->tree, "..");
419         CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_SYNTAX_BAD);
420         status = smbcli_chkpath(cli_dos->tree, "..");
421         CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidpath));
422
423         status = smbcli_chkpath(cli_nt->tree, ".");
424         CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);
425         status = smbcli_chkpath(cli_dos->tree, ".");
426         CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath));
427
428         status = smbcli_chkpath(cli_nt->tree, "\t");
429         CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);
430         status = smbcli_chkpath(cli_dos->tree, "\t");
431         CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath));
432
433         status = smbcli_chkpath(cli_nt->tree, "\t\\bla");
434         CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);
435         status = smbcli_chkpath(cli_dos->tree, "\t\\bla");
436         CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath));
437
438         status = smbcli_chkpath(cli_nt->tree, "<");
439         CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);
440         status = smbcli_chkpath(cli_dos->tree, "<");
441         CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath));
442
443         status = smbcli_chkpath(cli_nt->tree, "<\\bla");
444         CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);
445         status = smbcli_chkpath(cli_dos->tree, "<\\bla");
446         CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRbadpath));
447
448         /*
449          * .... And the same gang against getatr. Note that the DOS error codes
450          * differ....
451          */
452
453         status = smbcli_getatr(cli_nt->tree, fpath, NULL, NULL, NULL);
454         CHECK_STATUS(status, NT_STATUS_OK);
455         status = smbcli_getatr(cli_dos->tree, fpath, NULL, NULL, NULL);
456         CHECK_STATUS(status, NT_STATUS_OK);
457
458         status = smbcli_getatr(cli_nt->tree, "..", NULL, NULL, NULL);
459         CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_SYNTAX_BAD);
460         status = smbcli_getatr(cli_dos->tree, "..", NULL, NULL, NULL);
461         CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidpath));
462
463         status = smbcli_getatr(cli_nt->tree, ".", NULL, NULL, NULL);
464         CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);
465         status = smbcli_getatr(cli_dos->tree, ".", NULL, NULL, NULL);
466         CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidname));
467
468         status = smbcli_getatr(cli_nt->tree, "\t", NULL, NULL, NULL);
469         CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);
470         status = smbcli_getatr(cli_dos->tree, "\t", NULL, NULL, NULL);
471         CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidname));
472
473         status = smbcli_getatr(cli_nt->tree, "\t\\bla", NULL, NULL, NULL);
474         CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);
475         status = smbcli_getatr(cli_dos->tree, "\t\\bla", NULL, NULL, NULL);
476         CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidname));
477
478         status = smbcli_getatr(cli_nt->tree, "<", NULL, NULL, NULL);
479         CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);
480         status = smbcli_getatr(cli_dos->tree, "<", NULL, NULL, NULL);
481         CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidname));
482
483         status = smbcli_getatr(cli_nt->tree, "<\\bla", NULL, NULL, NULL);
484         CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);
485         status = smbcli_getatr(cli_dos->tree, "<\\bla", NULL, NULL, NULL);
486         CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidname));
487
488         /* Try the same set with openX. */
489
490         status = raw_smbcli_open(cli_nt->tree, "..", O_RDONLY, DENY_NONE, NULL);
491         CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_SYNTAX_BAD);
492         status = raw_smbcli_open(cli_dos->tree, "..", O_RDONLY, DENY_NONE, NULL);
493         CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidpath));
494
495         status = raw_smbcli_open(cli_nt->tree, ".", O_RDONLY, DENY_NONE, NULL);
496         CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);
497         status = raw_smbcli_open(cli_dos->tree, ".", O_RDONLY, DENY_NONE, NULL);
498         CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidname));
499
500         status = raw_smbcli_open(cli_nt->tree, "\t", O_RDONLY, DENY_NONE, NULL);
501         CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);
502         status = raw_smbcli_open(cli_dos->tree, "\t", O_RDONLY, DENY_NONE, NULL);
503         CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidname));
504
505         status = raw_smbcli_open(cli_nt->tree, "\t\\bla", O_RDONLY, DENY_NONE, NULL);
506         CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);
507         status = raw_smbcli_open(cli_dos->tree, "\t\\bla", O_RDONLY, DENY_NONE, NULL);
508         CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidname));
509
510         status = raw_smbcli_open(cli_nt->tree, "<", O_RDONLY, DENY_NONE, NULL);
511         CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);
512         status = raw_smbcli_open(cli_dos->tree, "<", O_RDONLY, DENY_NONE, NULL);
513         CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidname));
514
515         status = raw_smbcli_open(cli_nt->tree, "<\\bla", O_RDONLY, DENY_NONE, NULL);
516         CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_INVALID);
517         status = raw_smbcli_open(cli_dos->tree, "<\\bla", O_RDONLY, DENY_NONE, NULL);
518         CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS, ERRinvalidname));
519
520         /* Let's test EEXIST error code mapping. */
521         status = raw_smbcli_open(cli_nt->tree, fpath, O_RDONLY | O_CREAT| O_EXCL, DENY_NONE, NULL);
522         CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_COLLISION);
523         status = raw_smbcli_open(cli_dos->tree, fpath, O_RDONLY | O_CREAT| O_EXCL, DENY_NONE, NULL);
524         CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS,ERRfilexists));
525
526         status = raw_smbcli_t2open(cli_nt->tree, fpath, O_RDONLY | O_CREAT| O_EXCL, DENY_NONE, NULL);
527         CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_COLLISION);
528         status = raw_smbcli_t2open(cli_dos->tree, fpath, O_RDONLY | O_CREAT| O_EXCL, DENY_NONE, NULL);
529         CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS,ERRfilexists));
530
531         status = raw_smbcli_ntcreate(cli_nt->tree, fpath, NULL);
532         CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_COLLISION);
533         status = raw_smbcli_ntcreate(cli_dos->tree, fpath, NULL);
534         CHECK_STATUS(status, NT_STATUS_DOS(ERRDOS,ERRfilexists));
535
536         goto done;
537
538  fail:
539         ret = False;
540
541  done:
542         if (cli_nt != NULL) {
543                 smbcli_deltree(cli_nt->tree, dirname);
544                 torture_close_connection(cli_nt);
545         }
546         if (cli_dos != NULL) {
547                 torture_close_connection(cli_dos);
548         }
549         talloc_free(mem_ctx);
550
551         return ret;
552 }