s4:torture: add smb2.durable_open test reopen3
[samba.git] / source4 / torture / gentest.c
index b0ab41cb3dbaa4da6610d078729aed49a06b71ea..91b60e2c4e795c7adf462a1a65e13cab37b1abec 100644 (file)
@@ -38,6 +38,7 @@
 #include "dynconfig/dynconfig.h"
 #include "libcli/security/security.h"
 #include "libcli/raw/raw_proto.h"
+#include "../libcli/smb/smbXcli_base.h"
 
 #define NSERVERS 2
 #define NINSTANCES 2
@@ -48,9 +49,9 @@ static struct gentest_options {
        int analyze;
        int analyze_always;
        int analyze_continuous;
-       uint_t max_open_handles;
-       uint_t seed;
-       uint_t numops;
+       unsigned int max_open_handles;
+       unsigned int seed;
+       unsigned int numops;
        int use_oplocks;
        char **ignore_patterns;
        const char *seeds_file;
@@ -67,12 +68,12 @@ static struct gentest_options {
 /* mapping between open handles on the server and local handles */
 static struct {
        bool active;
-       uint_t instance;
+       unsigned int instance;
        struct smb2_handle smb2_handle[NSERVERS]; /* SMB2 */
        uint16_t smb_handle[NSERVERS];            /* SMB */
        const char *name;
 } *open_handles;
-static uint_t num_open_handles;
+static unsigned int num_open_handles;
 
 /* state information for the servers. We open NINSTANCES connections to
    each server */
@@ -86,7 +87,7 @@ static struct {
 
 /* the seeds and flags for each operation */
 static struct {
-       uint_t seed;
+       unsigned int seed;
        bool disabled;
 } *op_parms;
 
@@ -111,9 +112,9 @@ static struct {
 /* info relevant to the current operation */
 static struct {
        const char *name;
-       uint_t seed;
+       unsigned int seed;
        NTSTATUS status;
-       uint_t opnum;
+       unsigned int opnum;
        TALLOC_CTX *mem_ctx;
        const char *mismatch;
 } current_op;
@@ -215,8 +216,8 @@ static bool connect_servers(struct tevent_context *ev,
                        NTSTATUS status;
                        struct smbcli_options smb_options;
                        struct smbcli_session_options smb_session_options;
-                       lp_smbcli_options(lp_ctx, &smb_options);
-                       lp_smbcli_session_options(lp_ctx, &smb_session_options);
+                       lpcfg_smbcli_options(lp_ctx, &smb_options);
+                       lpcfg_smbcli_session_options(lp_ctx, &smb_session_options);
 
                        printf("Connecting to \\\\%s\\%s as %s - instance %d\n",
                               servers[i].server_name, servers[i].share_name, 
@@ -227,28 +228,27 @@ static bool connect_servers(struct tevent_context *ev,
 
                        if (options.smb2) {
                                status = smb2_connect(NULL, servers[i].server_name, 
-                                                                         lp_smb_ports(lp_ctx),
+                                                                         lpcfg_smb_ports(lp_ctx),
                                                      servers[i].share_name,
-                                                     lp_resolve_context(lp_ctx),
+                                                     lpcfg_resolve_context(lp_ctx),
                                                      servers[i].credentials,
                                                      &servers[i].smb2_tree[j],
                                                      ev, &smb_options,
-                                                         lp_socket_options(lp_ctx),
-                                                         lp_gensec_settings(lp_ctx, lp_ctx)
+                                                         lpcfg_socket_options(lp_ctx),
+                                                         lpcfg_gensec_settings(lp_ctx, lp_ctx)
                                                          );
                        } else {
                                status = smbcli_tree_full_connection(NULL,
                                                                     &servers[i].smb_tree[j], 
                                                                     servers[i].server_name, 
-                                                                    lp_smb_ports(lp_ctx),
+                                                                    lpcfg_smb_ports(lp_ctx),
                                                                     servers[i].share_name, "A:",
-                                                                        lp_socket_options(lp_ctx),
+                                                                        lpcfg_socket_options(lp_ctx),
                                                                     servers[i].credentials,
-                                                                    lp_resolve_context(lp_ctx), ev,
+                                                                    lpcfg_resolve_context(lp_ctx), ev,
                                                                     &smb_options,
                                                                     &smb_session_options,
-                                                                        lp_iconv_convenience(lp_ctx),
-                                                                        lp_gensec_settings(lp_ctx, lp_ctx));
+                                                                        lpcfg_gensec_settings(lp_ctx, lp_ctx));
                        }
                        if (!NT_STATUS_IS_OK(status)) {
                                printf("Failed to connect to \\\\%s\\%s - %s\n",
@@ -277,16 +277,24 @@ static bool connect_servers(struct tevent_context *ev,
 /*
   work out the time skew between the servers - be conservative
 */
-static uint_t time_skew(void)
+static unsigned int time_skew(void)
 {
-       uint_t ret;
+       unsigned int ret;
+       NTTIME nt0, nt1;
+
        if (options.smb2) {
-               ret = labs(servers[0].smb2_tree[0]->session->transport->negotiate.system_time -
-                          servers[1].smb2_tree[0]->session->transport->negotiate.system_time);
+               struct smbXcli_conn *c0, *c1;
+
+               c0 = servers[0].smb2_tree[0]->session->transport->conn;
+               c1 = servers[1].smb2_tree[0]->session->transport->conn;
+
+               nt0 = smbXcli_conn_server_system_time(c0);
+               nt1 = smbXcli_conn_server_system_time(c1);
        } else {
-               ret = labs(servers[0].smb_tree[0]->session->transport->negotiate.server_time -
-                          servers[1].smb_tree[0]->session->transport->negotiate.server_time);
+               nt0 = servers[0].smb_tree[0]->session->transport->negotiate.server_time;
+               nt1 = servers[1].smb_tree[0]->session->transport->negotiate.server_time;
        }
+       ret = labs(nt0 - nt1);
        return ret + 300;
 }
 
@@ -299,9 +307,9 @@ static bool smb2_handle_equal(const struct smb2_handle *h1, const struct smb2_ha
 /*
   turn a server handle into a local handle
 */
-static uint_t fnum_to_handle_smb2(int server, int instance, struct smb2_handle server_handle)
+static unsigned int fnum_to_handle_smb2(int server, int instance, struct smb2_handle server_handle)
 {
-       uint_t i;
+       unsigned int i;
        for (i=0;i<options.max_open_handles;i++) {
                if (!open_handles[i].active ||
                    instance != open_handles[i].instance) continue;
@@ -317,9 +325,9 @@ static uint_t fnum_to_handle_smb2(int server, int instance, struct smb2_handle s
 /*
   turn a server handle into a local handle
 */
-static uint_t fnum_to_handle_smb(int server, int instance, uint16_t server_handle)
+static unsigned int fnum_to_handle_smb(int server, int instance, uint16_t server_handle)
 {
-       uint_t i;
+       unsigned int i;
        for (i=0;i<options.max_open_handles;i++) {
                if (!open_handles[i].active ||
                    instance != open_handles[i].instance) continue;
@@ -450,7 +458,7 @@ static void gen_remove_handle_smb(int instance, uint16_t handles[NSERVERS])
 /*
   return true with 'chance' probability as a percentage
 */
-static bool gen_chance(uint_t chance)
+static bool gen_chance(unsigned int chance)
 {
        return ((random() % 100) <= chance);
 }
@@ -511,7 +519,7 @@ static uint16_t gen_fnum_close(int instance)
 */
 static int gen_int_range(uint64_t min, uint64_t max)
 {
-       uint_t r = random();
+       unsigned int r = random();
        return min + (r % (1+max-min));
 }
 
@@ -640,9 +648,9 @@ static uint32_t gen_bits_levels(int nlevels, ...)
 /*
   generate a bitmask
 */
-static uint32_t gen_bits_mask(uint_t mask)
+static uint32_t gen_bits_mask(unsigned int mask)
 {
-       uint_t ret = random();
+       unsigned int ret = random();
        return ret & mask;
 }
 
@@ -869,9 +877,9 @@ static NTTIME gen_timewarp(void)
 /*
   generate a file allocation size
 */
-static uint_t gen_alloc_size(void)
+static unsigned int gen_alloc_size(void)
 {
-       uint_t ret;
+       unsigned int ret;
 
        if (gen_chance(30)) return 0;
 
@@ -1212,7 +1220,7 @@ static void check_pending(void)
 {
        int i, j;
 
-       msleep(20);
+       smb_msleep(20);
 
        for (j=0;j<NINSTANCES;j++) {
                for (i=0;i<NSERVERS;i++) {
@@ -2319,6 +2327,18 @@ static void gen_setfileinfo(int instance, union smb_setfileinfo *info)
        case RAW_SFILEINFO_UNIX_INFO2:
        case RAW_SFILEINFO_UNIX_LINK:
        case RAW_SFILEINFO_UNIX_HLINK:
+       case RAW_SFILEINFO_LINK_INFORMATION:
+       case RAW_SFILEINFO_PIPE_INFORMATION:
+       case RAW_SFILEINFO_VALID_DATA_INFORMATION:
+       case RAW_SFILEINFO_SHORT_NAME_INFORMATION:
+       case RAW_SFILEINFO_1027:
+       case RAW_SFILEINFO_1030:
+       case RAW_SFILEINFO_1031:
+       case RAW_SFILEINFO_1036:
+       case RAW_SFILEINFO_1041:
+       case RAW_SFILEINFO_1042:
+       case RAW_SFILEINFO_1043:
+       case RAW_SFILEINFO_1044:
                /* Untested */
                break;
        }
@@ -2447,10 +2467,12 @@ static void async_notify_smb(struct smbcli_request *req)
        union smb_notify notify;
        NTSTATUS status;
        int i, j;
-       uint16_t tid;
+       uint16_t tid = 0;
        struct smbcli_transport *transport = req->transport;
 
-       tid = SVAL(req->in.hdr, HDR_TID);
+       if (req->tree) {
+               tid = req->tree->tid;
+       }
 
        notify.nttrans.level = RAW_NOTIFY_NTTRANS;
        status = smb_raw_changenotify_recv(req, current_op.mem_ctx, &notify);
@@ -3186,7 +3208,7 @@ static bool split_unc_name(const char *unc, char **server, char **share)
        while((opt = poptGetNextOpt(pc)) != -1) {
                switch (opt) {
                case OPT_UNCLIST:
-                       lp_set_cmdline(cmdline_lp_ctx, "torture:unclist", poptGetOptArg(pc));
+                       lpcfg_set_cmdline(cmdline_lp_ctx, "torture:unclist", poptGetOptArg(pc));
                        break;
                case 'U':
                        if (username_count == 2) {
@@ -3248,7 +3270,7 @@ static bool split_unc_name(const char *unc, char **server, char **share)
 
        ev = s4_event_context_init(talloc_autofree_context());
 
-       gensec_init(lp_ctx);
+       gensec_init();
 
        ret = start_gentest(ev, lp_ctx);