r11730: added parsing and tests for a bunch more SMB2 getinfo levels
[bbaumbach/samba-autobuild/.git] / source4 / torture / smb2 / util.c
1 /* 
2    Unix SMB/CIFS implementation.
3
4    helper functions for SMB2 test suite
5
6    Copyright (C) Andrew Tridgell 2005
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 2 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, write to the Free Software
20    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23 #include "includes.h"
24 #include "libcli/raw/libcliraw.h"
25 #include "libcli/smb2/smb2.h"
26 #include "libcli/smb2/smb2_calls.h"
27 #include "lib/cmdline/popt_common.h"
28 #include "lib/events/events.h"
29
30 /*
31   show lots of information about a file
32 */
33 void torture_smb2_all_info(struct smb2_tree *tree, struct smb2_handle handle)
34 {
35         NTSTATUS status;
36         TALLOC_CTX *tmp_ctx = talloc_new(tree);
37         union smb2_fileinfo io;
38
39         status = smb2_getinfo_level(tree, tmp_ctx, handle, SMB2_GETINFO_FILE_ALL_INFO, &io);
40         if (!NT_STATUS_IS_OK(status)) {
41                 DEBUG(0,("getinfo failed - %s\n", nt_errstr(status)));
42                 talloc_free(tmp_ctx);
43                 return;
44         }
45
46         d_printf("\tcreate_time:    %s\n", nt_time_string(tmp_ctx, io.all_info.create_time));
47         d_printf("\taccess_time:    %s\n", nt_time_string(tmp_ctx, io.all_info.access_time));
48         d_printf("\twrite_time:     %s\n", nt_time_string(tmp_ctx, io.all_info.write_time));
49         d_printf("\tchange_time:    %s\n", nt_time_string(tmp_ctx, io.all_info.change_time));
50         d_printf("\tattrib:         0x%x\n", io.all_info.file_attr);
51         d_printf("\talloc_size:     %llu\n", (uint64_t)io.all_info.alloc_size);
52         d_printf("\tsize:           %llu\n", (uint64_t)io.all_info.size);
53         d_printf("\tnlink:          %u\n", io.all_info.nlink);
54         d_printf("\tdelete_pending: %u\n", io.all_info.delete_pending);
55         d_printf("\tdirectory:      %u\n", io.all_info.directory);
56         d_printf("\tfile_id:        %llu\n", io.all_info.file_id);
57         d_printf("\tea_size:        %u\n", io.all_info.ea_size);
58         d_printf("\taccess_mask:    0x%08x\n", io.all_info.access_mask);
59         d_printf("\tunknown5:       0x%llx\n", io.all_info.unknown5);
60         d_printf("\tunknown6:       0x%llx\n", io.all_info.unknown6);
61         d_printf("\tfname:          '%s'\n", io.all_info.fname);
62
63         talloc_free(tmp_ctx);   
64 }
65
66
67 /*
68   open a smb2 connection
69 */
70 BOOL torture_smb2_connection(TALLOC_CTX *mem_ctx, struct smb2_tree **tree)
71 {
72         NTSTATUS status;
73         const char *host = lp_parm_string(-1, "torture", "host");
74         const char *share = lp_parm_string(-1, "torture", "share");
75         struct cli_credentials *credentials = cmdline_credentials;
76
77         status = smb2_connect(mem_ctx, host, share, credentials, tree, 
78                               event_context_find(mem_ctx));
79         if (!NT_STATUS_IS_OK(status)) {
80                 printf("Failed to connect to SMB2 share \\\\%s\\%s - %s\n",
81                        host, share, nt_errstr(status));
82                 return False;
83         }
84         return True;
85 }
86
87
88 /*
89   create and return a handle to a test file
90 */
91 NTSTATUS torture_smb2_testfile(struct smb2_tree *tree, const char *fname, 
92                                struct smb2_handle *handle)
93 {
94         struct smb2_create io;
95         struct smb2_read r;
96         NTSTATUS status;
97
98         ZERO_STRUCT(io);
99         io.in.buffer_code = 0x39;
100         io.in.oplock_flags = 0;
101         io.in.access_mask = SEC_RIGHTS_FILE_ALL;
102         io.in.file_attr   = FILE_ATTRIBUTE_NORMAL;
103         io.in.open_disposition = NTCREATEX_DISP_OPEN_IF;
104         io.in.share_access = 
105                 NTCREATEX_SHARE_ACCESS_DELETE|
106                 NTCREATEX_SHARE_ACCESS_READ|
107                 NTCREATEX_SHARE_ACCESS_WRITE;
108         io.in.create_options = NTCREATEX_OPTIONS_DELETE_ON_CLOSE;
109         io.in.fname = fname;
110
111         status = smb2_create(tree, &io);
112         NT_STATUS_NOT_OK_RETURN(status);
113
114         *handle = io.out.handle;
115
116         ZERO_STRUCT(r);
117         r.in.buffer_code = 0x31;
118         r.in.length      = 5;
119         r.in.offset      = 0;
120         r.in.handle      = *handle;
121
122         smb2_read(tree, tree, &r);
123
124         return NT_STATUS_OK;
125 }
126
127 /*
128   create and return a handle to a test directory
129 */
130 NTSTATUS torture_smb2_testdir(struct smb2_tree *tree, const char *fname, 
131                               struct smb2_handle *handle)
132 {
133         struct smb2_create io;
134         NTSTATUS status;
135
136         ZERO_STRUCT(io);
137         io.in.buffer_code = 0x39;
138         io.in.oplock_flags = 0;
139         io.in.access_mask = SEC_RIGHTS_DIR_ALL;
140         io.in.file_attr   = FILE_ATTRIBUTE_DIRECTORY;
141         io.in.open_disposition = NTCREATEX_DISP_OPEN_IF;
142         io.in.share_access = NTCREATEX_SHARE_ACCESS_READ|NTCREATEX_SHARE_ACCESS_WRITE;
143         io.in.create_options = NTCREATEX_OPTIONS_DIRECTORY;
144         io.in.fname = fname;
145
146         status = smb2_create(tree, &io);
147         NT_STATUS_NOT_OK_RETURN(status);
148
149         *handle = io.out.handle;
150
151         return NT_STATUS_OK;
152 }
153
154
155 /*
156   create a complex file using the old SMB protocol, to make it easier to 
157   find fields in SMB2 getinfo levels
158 */
159 BOOL torture_setup_complex_file(const char *fname)
160 {
161         struct smbcli_state *cli;
162         int fnum;
163
164         if (!torture_open_connection(&cli)) {
165                 return False;
166         }
167
168         fnum = create_complex_file(cli, cli, fname);
169
170         if (DEBUGLVL(1)) {
171                 torture_all_info(cli->tree, fname);
172         }
173         
174         talloc_free(cli);
175         return fnum != -1;
176 }
177
178 /*
179   create a complex directory using the old SMB protocol, to make it easier to 
180   find fields in SMB2 getinfo levels
181 */
182 BOOL torture_setup_complex_dir(const char *dname)
183 {
184         struct smbcli_state *cli;
185         int fnum;
186
187         if (!torture_open_connection(&cli)) {
188                 return False;
189         }
190
191         fnum = create_complex_dir(cli, cli, dname);
192
193         if (DEBUGLVL(1)) {
194                 torture_all_info(cli->tree, dname);
195         }
196         
197         talloc_free(cli);
198         return fnum != -1;
199 }