s3: Add two tests a CLEAR_IF_FIRST crash
[kai/samba.git] / source3 / torture / locktest.c
index d248a9459db35dddd771fd69c741b2b2b1e9f7b2..04928f20ac85084dfef760310ddbbf0d981ccda0 100644 (file)
@@ -5,7 +5,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,
    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"
+#include "libsmb/libsmb.h"
+#include "system/filesys.h"
+#include "locking/proto.h"
+#include "libsmb/nmblib.h"
+#include "../libcli/smb/smbXcli_base.h"
 
 static fstring password[2];
 static fstring username[2];
 static int got_user;
 static int got_pass;
-static BOOL use_kerberos;
+static bool use_kerberos;
 static int numops = 1000;
-static BOOL showall;
-static BOOL analyze;
-static BOOL hide_unlock_fails;
-static BOOL use_oplocks;
+static bool showall;
+static bool analyze;
+static bool hide_unlock_fails;
+static bool use_oplocks;
 static unsigned lock_range = 100;
 static unsigned lock_base = 0;
 static unsigned min_length = 0;
-static BOOL exact_error_codes;
-static BOOL zero_zero;
+static bool exact_error_codes;
+static bool zero_zero;
 
 extern char *optarg;
 extern int optind;
@@ -72,7 +76,7 @@ struct record {
        enum lock_op lock_op;
        enum brl_type lock_type;
        char conn, f;
-       SMB_BIG_UINT start, len;
+       uint64_t start, len;
        char needed;
 };
 
@@ -116,30 +120,32 @@ static struct record preset[] = {
 
 static struct record *recorded;
 
-static void print_brl(SMB_DEV_T dev,
-                       SMB_INO_T ino,
-                       struct process_id pid, 
+static void print_brl(struct file_id id,
+                       struct server_id pid, 
                        enum brl_type lock_type,
                        enum brl_flavour lock_flav,
                        br_off start,
-                       br_off size)
+                       br_off size,
+                       void *private_data)
 {
 #if NASTY_POSIX_LOCK_HACK
        {
-               pstring cmd;
                static SMB_INO_T lastino;
 
                if (lastino != ino) {
-                       slprintf(cmd, sizeof(cmd), 
-                                "egrep POSIX.*%u /proc/locks", (int)ino);
-                       system(cmd);
+                       char *cmd;
+                       if (asprintf(&cmd,
+                                "egrep POSIX.*%u /proc/locks", (int)ino) > 0) {
+                               system(cmd);
+                               SAFE_FREE(cmd);
+                       }
                }
                lastino = ino;
        }
 #endif
 
-       printf("%s   %05x:%05x    %s  %.0f:%.0f(%.0f)\n", 
-              procid_str_static(&pid), (int)dev, (int)ino, 
+       printf("%s   %s    %s  %.0f:%.0f(%.0f)\n", 
+              procid_str_static(&pid), file_id_string_tos(&id),
               lock_type==READ_LOCK?"R":"W",
               (double)start, (double)start+size-1,(double)size);
 
@@ -148,7 +154,7 @@ static void print_brl(SMB_DEV_T dev,
 
 static void show_locks(void)
 {
-       brl_forall(print_brl);
+       brl_forall(print_brl, NULL);
        /* system("cat /proc/locks"); */
 }
 
@@ -159,12 +165,12 @@ return a connection to a server
 static struct cli_state *connect_one(char *share, int snum)
 {
        struct cli_state *c;
-       struct nmb_name called, calling;
        char *server_n;
        fstring server;
-       struct in_addr ip;
        fstring myname;
        static int count;
+       NTSTATUS status;
+       int flags = 0;
 
        fstrcpy(server,share+2);
        share = strchr_m(server,'\\');
@@ -173,39 +179,31 @@ static struct cli_state *connect_one(char *share, int snum)
        share++;
 
        server_n = server;
-       
-        zero_ip(&ip);
 
        slprintf(myname,sizeof(myname), "lock-%lu-%u", (unsigned long)getpid(), count++);
 
-       make_nmb_name(&calling, myname, 0x0);
-       make_nmb_name(&called , server, 0x20);
-
- again:
-        zero_ip(&ip);
-
        /* have to open a new connection */
-       if (!(c=cli_initialise()) || !cli_connect(c, server_n, &ip)) {
-               DEBUG(0,("Connection to %s failed\n", server_n));
-               return NULL;
-       }
 
-       c->use_kerberos = use_kerberos;
+       if (use_kerberos) {
+               flags |= CLI_FULL_CONNECTION_USE_KERBEROS;
+       }
+       if (use_oplocks) {
+               flags |= CLI_FULL_CONNECTION_OPLOCKS;
+       }
 
-       if (!cli_session_request(c, &calling, &called)) {
-               DEBUG(0,("session request to %s failed\n", called.name));
-               cli_shutdown(c);
-               if (strcmp(called.name, "*SMBSERVER")) {
-                       make_nmb_name(&called , "*SMBSERVER", 0x20);
-                       goto again;
-               }
+       status = cli_connect_nb(server_n, NULL, 0, 0x20, myname,
+                               SMB_SIGNING_DEFAULT, flags, &c);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(0, ("Connection to %s failed. Error %s\n", server_n,
+                         nt_errstr(status)));
                return NULL;
        }
 
-       DEBUG(4,(" session request ok\n"));
-
-       if (!cli_negprot(c)) {
-               DEBUG(0,("protocol negotiation failed\n"));
+       status = smbXcli_negprot(c->conn, c->timeout, PROTOCOL_CORE,
+                                PROTOCOL_NT1);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(0, ("protocol negotiation failed: %s\n",
+                         nt_errstr(status)));
                cli_shutdown(c);
                return NULL;
        }
@@ -219,17 +217,16 @@ static struct cli_state *connect_one(char *share, int snum)
        }
 
        if (got_pass == 1) {
-               fstrcpy(password[1], password[0]);
-               fstrcpy(username[1], username[0]);
+               strlcpy(password[1], password[0],sizeof(password[1]));
+               strlcpy(username[1], username[0],sizeof(username[1]));
        }
 
-       if (!NT_STATUS_IS_OK(cli_session_setup(c, username[snum], 
-                                              password[snum],
-                                              strlen(password[snum]),
-                                              password[snum],
-                                              strlen(password[snum]),
-                                              lp_workgroup()))) {
-               DEBUG(0,("session setup failed: %s\n", cli_errstr(c)));
+       status = cli_session_setup(c, username[snum],
+                                  password[snum], strlen(password[snum]),
+                                  password[snum], strlen(password[snum]),
+                                  lp_workgroup());
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(0,("session setup failed: %s\n", nt_errstr(status)));
                return NULL;
        }
 
@@ -247,22 +244,21 @@ static struct cli_state *connect_one(char *share, int snum)
        
        DEBUG(4,(" session setup ok\n"));
 
-       if (!cli_send_tconX(c, share, "?????",
-                           password[snum], strlen(password[snum])+1)) {
-               DEBUG(0,("tree connect failed: %s\n", cli_errstr(c)));
+       status = cli_tree_connect(c, share, "?????", password[snum],
+                                 strlen(password[snum])+1);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(0,("tree connect failed: %s\n", nt_errstr(status)));
                cli_shutdown(c);
                return NULL;
        }
 
        DEBUG(4,(" tconx ok\n"));
 
-       c->use_oplocks = use_oplocks;
-
        return c;
 }
 
 
-static void reconnect(struct cli_state *cli[NSERVERS][NCONNECTIONS], int fnum[NSERVERS][NCONNECTIONS][NFILES],
+static void reconnect(struct cli_state *cli[NSERVERS][NCONNECTIONS], uint16_t fnum[NSERVERS][NCONNECTIONS][NFILES],
                      char *share[NSERVERS])
 {
        int server, conn, f;
@@ -271,9 +267,9 @@ static void reconnect(struct cli_state *cli[NSERVERS][NCONNECTIONS], int fnum[NS
        for (conn=0;conn<NCONNECTIONS;conn++) {
                if (cli[server][conn]) {
                        for (f=0;f<NFILES;f++) {
-                               if (fnum[server][conn][f] != -1) {
+                               if (fnum[server][conn][f] != (uint16_t)-1) {
                                        cli_close(cli[server][conn], fnum[server][conn][f]);
-                                       fnum[server][conn][f] = -1;
+                                       fnum[server][conn][f] = (uint16_t)-1;
                                }
                        }
                        cli_ulogoff(cli[server][conn]);
@@ -289,27 +285,26 @@ static void reconnect(struct cli_state *cli[NSERVERS][NCONNECTIONS], int fnum[NS
 
 
 
-static BOOL test_one(struct cli_state *cli[NSERVERS][NCONNECTIONS], 
-                    int fnum[NSERVERS][NCONNECTIONS][NFILES],
+static bool test_one(struct cli_state *cli[NSERVERS][NCONNECTIONS], 
+                    uint16_t fnum[NSERVERS][NCONNECTIONS][NFILES],
                     struct record *rec)
 {
        unsigned conn = rec->conn;
        unsigned f = rec->f;
-       SMB_BIG_UINT start = rec->start;
-       SMB_BIG_UINT len = rec->len;
+       uint64_t start = rec->start;
+       uint64_t len = rec->len;
        enum brl_type op = rec->lock_type;
        int server;
-       BOOL ret[NSERVERS];
        NTSTATUS status[NSERVERS];
 
        switch (rec->lock_op) {
        case OP_LOCK:
                /* set a lock */
                for (server=0;server<NSERVERS;server++) {
-                       ret[server] = cli_lock64(cli[server][conn], 
-                                                fnum[server][conn][f],
-                                                start, len, LOCK_TIMEOUT, op);
-                       status[server] = cli_nt_error(cli[server][conn]);
+                       status[server] = cli_lock64(cli[server][conn],
+                                                   fnum[server][conn][f],
+                                                   start, len, LOCK_TIMEOUT,
+                                                   op);
                        if (!exact_error_codes && 
                            NT_STATUS_EQUAL(status[server], 
                                            NT_STATUS_FILE_LOCK_CONFLICT)) {
@@ -330,10 +325,9 @@ static BOOL test_one(struct cli_state *cli[NSERVERS][NCONNECTIONS],
        case OP_UNLOCK:
                /* unset a lock */
                for (server=0;server<NSERVERS;server++) {
-                       ret[server] = cli_unlock64(cli[server][conn], 
-                                                  fnum[server][conn][f],
-                                                  start, len);
-                       status[server] = cli_nt_error(cli[server][conn]);
+                       status[server] = cli_unlock64(cli[server][conn],
+                                                     fnum[server][conn][f],
+                                                     start, len);
                }
                if (showall || 
                    (!hide_unlock_fails && !NT_STATUS_EQUAL(status[0],status[1]))) {
@@ -351,13 +345,13 @@ static BOOL test_one(struct cli_state *cli[NSERVERS][NCONNECTIONS],
                /* reopen the file */
                for (server=0;server<NSERVERS;server++) {
                        cli_close(cli[server][conn], fnum[server][conn][f]);
-                       fnum[server][conn][f] = -1;
+                       fnum[server][conn][f] = (uint16_t)-1;
                }
                for (server=0;server<NSERVERS;server++) {
-                       fnum[server][conn][f] = cli_open(cli[server][conn], FILENAME,
+                       fnum[server][conn][f] = (uint16_t)-1;
+                       if (!NT_STATUS_IS_OK(cli_openx(cli[server][conn], FILENAME,
                                                         O_RDWR|O_CREAT,
-                                                        DENY_NONE);
-                       if (fnum[server][conn][f] == -1) {
+                                                        DENY_NONE, &fnum[server][conn][f]))) {
                                printf("failed to reopen on share%d\n", server);
                                return False;
                        }
@@ -374,35 +368,36 @@ static BOOL test_one(struct cli_state *cli[NSERVERS][NCONNECTIONS],
 }
 
 static void close_files(struct cli_state *cli[NSERVERS][NCONNECTIONS], 
-                       int fnum[NSERVERS][NCONNECTIONS][NFILES])
+                       uint16_t fnum[NSERVERS][NCONNECTIONS][NFILES])
 {
        int server, conn, f; 
 
        for (server=0;server<NSERVERS;server++)
        for (conn=0;conn<NCONNECTIONS;conn++)
        for (f=0;f<NFILES;f++) {
-               if (fnum[server][conn][f] != -1) {
+               if (fnum[server][conn][f] != (uint16_t)-1) {
                        cli_close(cli[server][conn], fnum[server][conn][f]);
-                       fnum[server][conn][f] = -1;
+                       fnum[server][conn][f] = (uint16_t)-1;
                }
        }
        for (server=0;server<NSERVERS;server++) {
-               cli_unlink(cli[server][0], FILENAME);
+               cli_unlink(cli[server][0], FILENAME, FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN);
        }
 }
 
 static void open_files(struct cli_state *cli[NSERVERS][NCONNECTIONS], 
-                      int fnum[NSERVERS][NCONNECTIONS][NFILES])
+                      uint16_t fnum[NSERVERS][NCONNECTIONS][NFILES])
 {
        int server, conn, f; 
 
        for (server=0;server<NSERVERS;server++)
        for (conn=0;conn<NCONNECTIONS;conn++)
        for (f=0;f<NFILES;f++) {
-               fnum[server][conn][f] = cli_open(cli[server][conn], FILENAME,
+               fnum[server][conn][f] = (uint16_t)-1;
+               if (!NT_STATUS_IS_OK(cli_openx(cli[server][conn], FILENAME,
                                                 O_RDWR|O_CREAT,
-                                                DENY_NONE);
-               if (fnum[server][conn][f] == -1) {
+                                                DENY_NONE,
+                                                &fnum[server][conn][f]))) {
                        fprintf(stderr,"Failed to open fnum[%u][%u][%u]\n",
                                server, conn, f);
                        exit(1);
@@ -412,7 +407,7 @@ static void open_files(struct cli_state *cli[NSERVERS][NCONNECTIONS],
 
 
 static int retest(struct cli_state *cli[NSERVERS][NCONNECTIONS], 
-                  int fnum[NSERVERS][NCONNECTIONS][NFILES],
+                  uint16_t fnum[NSERVERS][NCONNECTIONS][NFILES],
                   int n)
 {
        int i;
@@ -438,7 +433,7 @@ static int retest(struct cli_state *cli[NSERVERS][NCONNECTIONS],
 static void test_locks(char *share[NSERVERS])
 {
        struct cli_state *cli[NSERVERS][NCONNECTIONS];
-       int fnum[NSERVERS][NCONNECTIONS][NFILES];
+       uint16_t fnum[NSERVERS][NCONNECTIONS][NFILES];
        int n, i, n1, skip, r1, r2; 
 
        ZERO_STRUCT(fnum);
@@ -592,14 +587,12 @@ static void usage(void)
 
        load_case_tables();
 
-       dbf = x_stderr;
-
        if (argc < 3 || argv[1][0] == '-') {
                usage();
                exit(1);
        }
 
-       setup_logging(argv[0],True);
+       setup_logging(argv[0], DEBUG_STDOUT);
 
        for (server=0;server<NSERVERS;server++) {
                share[server] = argv[1+server];
@@ -609,7 +602,7 @@ static void usage(void)
        argc -= NSERVERS;
        argv += NSERVERS;
 
-       lp_load(dyn_CONFIGFILE,True,False,False,True);
+       lp_load_global(get_dyn_CONFIGFILE());
        load_interfaces();
 
        if (getenv("USER")) {