r25000: Fix some more C++ compatibility warnings.
[tprouty/samba.git] / source4 / torture / raw / close.c
1 /* 
2    Unix SMB/CIFS implementation.
3    RAW_CLOSE_* individual test suite
4    Copyright (C) Andrew Tridgell 2003
5    
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10    
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15    
16    You should have received a copy of the GNU General Public License
17    along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #include "includes.h"
21 #include "torture/torture.h"
22 #include "system/time.h"
23 #include "libcli/raw/libcliraw.h"
24 #include "libcli/libcli.h"
25 #include "torture/util.h"
26
27 /**
28  * basic testing of all RAW_CLOSE_* calls 
29 */
30 bool torture_raw_close(struct torture_context *torture,
31                        struct smbcli_state *cli)
32 {
33         bool ret = true;
34         union smb_close io;
35         union smb_flush io_flush;
36         int fnum;
37         const char *fname = "\\torture_close.txt";
38         time_t basetime = (time(NULL) + 3*86400) & ~1;
39         union smb_fileinfo finfo, finfo2;
40         NTSTATUS status;
41
42 #define REOPEN do { \
43         fnum = create_complex_file(cli, torture, fname); \
44         if (fnum == -1) { \
45                 printf("(%d) Failed to create %s\n", __LINE__, fname); \
46                 ret = false; \
47                 goto done; \
48         }} while (0)
49
50 #define CHECK_STATUS(status, correct) do { \
51         if (!NT_STATUS_EQUAL(status, correct)) { \
52                 printf("(%d) Incorrect status %s - should be %s\n", \
53                        __LINE__, nt_errstr(status), nt_errstr(correct)); \
54                 ret = false; \
55                 goto done; \
56         }} while (0)
57
58         REOPEN;
59
60         io.close.level = RAW_CLOSE_CLOSE;
61         io.close.in.file.fnum = fnum;
62         io.close.in.write_time = basetime;
63         status = smb_raw_close(cli->tree, &io);
64         CHECK_STATUS(status, NT_STATUS_OK);
65
66         status = smb_raw_close(cli->tree, &io);
67         CHECK_STATUS(status, NT_STATUS_INVALID_HANDLE);
68         
69         printf("testing close.in.write_time\n");
70
71         /* the file should have the write time set */
72         finfo.generic.level = RAW_FILEINFO_ALL_INFO;
73         finfo.generic.in.file.path = fname;
74         status = smb_raw_pathinfo(cli->tree, torture, &finfo);
75         CHECK_STATUS(status, NT_STATUS_OK);
76
77         if (basetime != nt_time_to_unix(finfo.all_info.out.write_time)) {
78                 printf("Incorrect write time on file - %s - %s\n",
79                        timestring(torture, basetime), 
80                        nt_time_string(torture, finfo.all_info.out.write_time));
81                 dump_all_info(torture, &finfo);
82                 ret = false;
83         }
84
85         printf("testing other times\n");
86
87         /* none of the other times should be set to that time */
88         if (nt_time_equal(&finfo.all_info.out.write_time, 
89                           &finfo.all_info.out.access_time) ||
90             nt_time_equal(&finfo.all_info.out.write_time, 
91                           &finfo.all_info.out.create_time) ||
92             nt_time_equal(&finfo.all_info.out.write_time, 
93                           &finfo.all_info.out.change_time)) {
94                 printf("Incorrect times after close - only write time should be set\n");
95                 dump_all_info(torture, &finfo);
96
97                 if (!torture_setting_bool(torture, "samba3", false)) {
98                         /*
99                          * In Samba3 as of 3.0.23d we don't yet support all
100                          * file times, so don't mark this as a critical
101                          * failure
102                          */
103                         ret = false;
104                 }
105         }
106             
107
108         smbcli_unlink(cli->tree, fname);
109         REOPEN;
110
111         finfo2.generic.level = RAW_FILEINFO_ALL_INFO;
112         finfo2.generic.in.file.path = fname;
113         status = smb_raw_pathinfo(cli->tree, torture, &finfo2);
114         CHECK_STATUS(status, NT_STATUS_OK);
115
116         io.close.level = RAW_CLOSE_CLOSE;
117         io.close.in.file.fnum = fnum;
118         io.close.in.write_time = 0;
119         status = smb_raw_close(cli->tree, &io);
120         CHECK_STATUS(status, NT_STATUS_OK);
121
122         /* the file should have the write time set equal to access time */
123         finfo.generic.level = RAW_FILEINFO_ALL_INFO;
124         finfo.generic.in.file.path = fname;
125         status = smb_raw_pathinfo(cli->tree, torture, &finfo);
126         CHECK_STATUS(status, NT_STATUS_OK);
127
128         if (!nt_time_equal(&finfo.all_info.out.write_time, 
129                            &finfo2.all_info.out.write_time)) {
130                 printf("Incorrect write time on file - 0 time should be ignored\n");
131                 dump_all_info(torture, &finfo);
132                 ret = false;
133         }
134
135         printf("testing splclose\n");
136
137         /* check splclose on a file */
138         REOPEN;
139         io.splclose.level = RAW_CLOSE_SPLCLOSE;
140         io.splclose.in.file.fnum = fnum;
141         status = smb_raw_close(cli->tree, &io);
142         CHECK_STATUS(status, NT_STATUS_DOS(ERRSRV, ERRerror));
143
144         printf("testing flush\n");
145         smbcli_close(cli->tree, fnum);
146
147         io_flush.flush.level            = RAW_FLUSH_FLUSH;
148         io_flush.flush.in.file.fnum     = fnum;
149         status = smb_raw_flush(cli->tree, &io_flush);
150         CHECK_STATUS(status, NT_STATUS_INVALID_HANDLE);
151
152         io_flush.flush_all.level        = RAW_FLUSH_ALL;
153         status = smb_raw_flush(cli->tree, &io_flush);
154         CHECK_STATUS(status, NT_STATUS_OK);
155
156         REOPEN;
157
158         io_flush.flush.level            = RAW_FLUSH_FLUSH;
159         io_flush.flush.in.file.fnum     = fnum;
160         status = smb_raw_flush(cli->tree, &io_flush);
161         CHECK_STATUS(status, NT_STATUS_OK);
162
163         printf("Testing SMBexit\n");
164         smb_raw_exit(cli->session);
165
166         io_flush.flush.level            = RAW_FLUSH_FLUSH;
167         io_flush.flush.in.file.fnum     = fnum;
168         status = smb_raw_flush(cli->tree, &io_flush);
169         CHECK_STATUS(status, NT_STATUS_INVALID_HANDLE);
170         
171
172 done:
173         smbcli_close(cli->tree, fnum);
174         smbcli_unlink(cli->tree, fname);
175         return ret;
176 }