r23792: convert Samba4 to GPLv3
[ira/wip.git] / source / torture / basic / unlink.c
1 /* 
2    Unix SMB/CIFS implementation.
3
4    unlink tester
5
6    Copyright (C) Andrew Tridgell 2003
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 "torture/torture.h"
24 #include "system/filesys.h"
25 #include "libcli/raw/libcliraw.h"
26 #include "libcli/libcli.h"
27 #include "torture/util.h"
28
29 #define BASEDIR "\\unlinktest"
30
31 /*
32   This test checks that 
33
34   1) the server does not allow an unlink on a file that is open
35 */
36 BOOL torture_unlinktest(struct torture_context *tctx, struct smbcli_state *cli)
37 {
38         const char *fname = BASEDIR "\\unlink.tst";
39         int fnum;
40         BOOL correct = True;
41         union smb_open io;
42         NTSTATUS status;
43
44         torture_assert(tctx, torture_setup_dir(cli, BASEDIR), 
45                                    talloc_asprintf(tctx, "Failed setting up %s", BASEDIR));
46
47         cli->session->pid = 1;
48
49         torture_comment(tctx, "Opening a file\n");
50
51         fnum = smbcli_open(cli->tree, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
52         torture_assert(tctx, fnum != -1, talloc_asprintf(tctx, "open of %s failed (%s)", fname, smbcli_errstr(cli->tree)));
53
54         torture_comment(tctx, "Unlinking a open file\n");
55
56         torture_assert(tctx, !NT_STATUS_IS_OK(smbcli_unlink(cli->tree, fname)),
57                 "server allowed unlink on an open file");
58         
59         correct = check_error(__location__, cli, ERRDOS, ERRbadshare, 
60                                       NT_STATUS_SHARING_VIOLATION);
61
62         smbcli_close(cli->tree, fnum);
63         smbcli_unlink(cli->tree, fname);
64
65         torture_comment(tctx, "testing unlink after ntcreatex with DELETE access\n");
66
67         io.ntcreatex.level = RAW_OPEN_NTCREATEX;
68         io.ntcreatex.in.root_fid = 0;
69         io.ntcreatex.in.flags = NTCREATEX_FLAGS_EXTENDED;
70         io.ntcreatex.in.create_options = NTCREATEX_OPTIONS_NON_DIRECTORY_FILE;
71         io.ntcreatex.in.file_attr = 0;
72         io.ntcreatex.in.alloc_size = 0;
73         io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE;
74         io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_IMPERSONATION;
75         io.ntcreatex.in.security_flags = 0;
76         io.ntcreatex.in.fname = fname;
77         io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_DELETE;
78         io.ntcreatex.in.access_mask  = SEC_RIGHTS_FILE_ALL;
79
80         status = smb_raw_open(cli->tree, cli, &io);
81         torture_assert_ntstatus_ok(tctx, status, talloc_asprintf(tctx, "failed to open %s", fname));
82
83         torture_assert(tctx, !NT_STATUS_IS_OK(smbcli_unlink(cli->tree, fname)),
84                 "server allowed unlink on an open file");
85
86         correct = check_error(__location__, cli, ERRDOS, ERRbadshare, 
87                                       NT_STATUS_SHARING_VIOLATION);
88
89         return correct;
90 }
91
92