r25035: Fix some more warnings, use service pointer rather than service number in...
[samba.git] / source4 / torture / smb2 / util.c
index 9be9b07c5b8575c41cc46cf4e27393fb4bb29e93..8c55813c8c2e244c6c5e38ba3b9f30d45847df33 100644 (file)
@@ -7,7 +7,7 @@
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
@@ -16,8 +16,7 @@
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
@@ -26,6 +25,9 @@
 #include "lib/cmdline/popt_common.h"
 #include "lib/events/events.h"
 #include "system/time.h"
+#include "librpc/gen_ndr/ndr_security.h"
+#include "param/param.h"
+#include "torture/smb2/proto.h"
 
 
 /*
@@ -36,7 +38,7 @@ NTSTATUS smb2_util_close(struct smb2_tree *tree, struct smb2_handle h)
        struct smb2_close c;
 
        ZERO_STRUCT(c);
-       c.in.handle = h;
+       c.in.file.handle = h;
 
        return smb2_close(tree, &c);
 }
@@ -66,7 +68,7 @@ NTSTATUS smb2_util_unlink(struct smb2_tree *tree, const char *fname)
        }
        NT_STATUS_NOT_OK_RETURN(status);
 
-       return smb2_util_close(tree, io.out.handle);
+       return smb2_util_close(tree, io.out.file.handle);
 }
 
 /*
@@ -79,8 +81,8 @@ NTSTATUS smb2_util_write(struct smb2_tree *tree,
        struct smb2_write w;
 
        ZERO_STRUCT(w);
+       w.in.file.handle = handle;
        w.in.offset      = offset;
-       w.in.handle      = handle;
        w.in.data        = data_blob_const(buf, size);
 
        return smb2_write(tree, &w);
@@ -134,7 +136,7 @@ static NTSTATUS smb2_create_complex(struct smb2_tree *tree, const char *fname,
        talloc_free(tmp_ctx);
        NT_STATUS_NOT_OK_RETURN(status);
 
-       *handle = io.out.handle;
+       *handle = io.out.file.handle;
 
        if (!dir) {
                status = smb2_util_write(tree, *handle, buf, 0, sizeof(buf));
@@ -144,39 +146,49 @@ static NTSTATUS smb2_create_complex(struct smb2_tree *tree, const char *fname,
        /* make sure all the timestamps aren't the same, and are also 
           in different DST zones*/
        setfile.generic.level = RAW_SFILEINFO_BASIC_INFORMATION;
-       setfile.generic.file.handle = *handle;
+       setfile.generic.in.file.handle = *handle;
 
-       setfile.basic_info.in.create_time = t +  9*30*24*60*60;
-       setfile.basic_info.in.access_time = t +  6*30*24*60*60;
-       setfile.basic_info.in.write_time  = t +  3*30*24*60*60;
-       setfile.basic_info.in.change_time = t +  1*30*24*60*60;
+       unix_to_nt_time(&setfile.basic_info.in.create_time, t + 9*30*24*60*60);
+       unix_to_nt_time(&setfile.basic_info.in.access_time, t + 6*30*24*60*60);
+       unix_to_nt_time(&setfile.basic_info.in.write_time,  t + 3*30*24*60*60);
+       unix_to_nt_time(&setfile.basic_info.in.change_time, t + 1*30*24*60*60);
        setfile.basic_info.in.attrib      = FILE_ATTRIBUTE_NORMAL;
 
        status = smb2_setinfo_file(tree, &setfile);
        if (!NT_STATUS_IS_OK(status)) {
                printf("Failed to setup file times - %s\n", nt_errstr(status));
+               return status;
        }
 
        /* make sure all the timestamps aren't the same */
-       fileinfo.generic.level = RAW_FILEINFO_BASIC_INFORMATION;
-       fileinfo.generic.file.handle = *handle;
+       fileinfo.generic.level = RAW_FILEINFO_SMB2_ALL_INFORMATION;
+       fileinfo.generic.in.file.handle = *handle;
 
        status = smb2_getinfo_file(tree, tree, &fileinfo);
        if (!NT_STATUS_IS_OK(status)) {
                printf("Failed to query file times - %s\n", nt_errstr(status));
+               return status;
+               
        }
 
-       if (setfile.basic_info.in.create_time != fileinfo.basic_info.out.create_time) {
-               printf("create_time not setup correctly\n");
-       }
-       if (setfile.basic_info.in.access_time != fileinfo.basic_info.out.access_time) {
-               printf("access_time not setup correctly\n");
-       }
-       if (setfile.basic_info.in.write_time != fileinfo.basic_info.out.write_time) {
-               printf("write_time not setup correctly\n");
-       }
-       
-       return NT_STATUS_OK;
+#define CHECK_TIME(field) do {\
+       if (setfile.basic_info.in.field != fileinfo.all_info2.out.field) { \
+               printf("(%s) " #field " not setup correctly: %s(%llu) => %s(%llu)\n", \
+                       __location__, \
+                       nt_time_string(tree, setfile.basic_info.in.field), \
+                       (unsigned long long)setfile.basic_info.in.field, \
+                       nt_time_string(tree, fileinfo.basic_info.out.field), \
+                       (unsigned long long)fileinfo.basic_info.out.field); \
+               status = NT_STATUS_INVALID_PARAMETER; \
+       } \
+} while (0)
+
+       CHECK_TIME(create_time);
+       CHECK_TIME(access_time);
+       CHECK_TIME(write_time);
+       CHECK_TIME(change_time);
+
+       return status;
 }
 
 /*
@@ -207,7 +219,7 @@ void torture_smb2_all_info(struct smb2_tree *tree, struct smb2_handle handle)
        union smb_fileinfo io;
 
        io.generic.level = RAW_FILEINFO_SMB2_ALL_INFORMATION;
-       io.generic.file.handle = handle;
+       io.generic.in.file.handle = handle;
 
        status = smb2_getinfo_file(tree, tmp_ctx, &io);
        if (!NT_STATUS_IS_OK(status)) {
@@ -291,8 +303,8 @@ void torture_smb2_all_info(struct smb2_tree *tree, struct smb2_handle handle)
 BOOL torture_smb2_connection(TALLOC_CTX *mem_ctx, struct smb2_tree **tree)
 {
        NTSTATUS status;
-       const char *host = lp_parm_string(-1, "torture", "host");
-       const char *share = lp_parm_string(-1, "torture", "share");
+       const char *host = lp_parm_string(NULL, "torture", "host");
+       const char *share = lp_parm_string(NULL, "torture", "share");
        struct cli_credentials *credentials = cmdline_credentials;
 
        status = smb2_connect(mem_ctx, host, share, credentials, tree, 
@@ -331,12 +343,12 @@ NTSTATUS torture_smb2_testfile(struct smb2_tree *tree, const char *fname,
        status = smb2_create(tree, tree, &io);
        NT_STATUS_NOT_OK_RETURN(status);
 
-       *handle = io.out.handle;
+       *handle = io.out.file.handle;
 
        ZERO_STRUCT(r);
+       r.in.file.handle = *handle;
        r.in.length      = 5;
        r.in.offset      = 0;
-       r.in.handle      = *handle;
 
        smb2_read(tree, tree, &r);
 
@@ -364,7 +376,7 @@ NTSTATUS torture_smb2_testdir(struct smb2_tree *tree, const char *fname,
        status = smb2_create(tree, tree, &io);
        NT_STATUS_NOT_OK_RETURN(status);
 
-       *handle = io.out.handle;
+       *handle = io.out.file.handle;
 
        return NT_STATUS_OK;
 }
@@ -416,7 +428,7 @@ NTSTATUS smb2_util_roothandle(struct smb2_tree *tree, struct smb2_handle *handle
        status = smb2_create(tree, tree, &io);
        NT_STATUS_NOT_OK_RETURN(status);
 
-       *handle = io.out.handle;
+       *handle = io.out.file.handle;
 
        return NT_STATUS_OK;
 }