root/source4/torture/raw/rename.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. test_mv
  2. test_osxrename
  3. test_ntrename
  4. test_dir_rename
  5. torture_raw_rename

   1 /* 
   2    Unix SMB/CIFS implementation.
   3    rename 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 "libcli/raw/libcliraw.h"
  23 #include "libcli/libcli.h"
  24 #include "torture/util.h"
  25 
  26 #define CHECK_STATUS(status, correct) do { \
  27         if (!NT_STATUS_EQUAL(status, correct)) { \
  28                 printf("(%s) Incorrect status %s - should be %s\n", \
  29                        __location__, nt_errstr(status), nt_errstr(correct)); \
  30                 ret = false; \
  31                 goto done; \
  32         }} while (0)
  33 
  34 #define CHECK_VALUE(v, correct) do { \
  35         if ((v) != (correct)) { \
  36                 printf("(%s) Incorrect %s %d - should be %d\n", \
  37                        __location__, #v, (int)v, (int)correct); \
  38                 ret = false; \
  39         }} while (0)
  40 
  41 #define BASEDIR "\\testrename"
  42 
  43 /*
  44   test SMBmv ops
  45 */
  46 static bool test_mv(struct torture_context *tctx, 
     /* [<][>][^][v][top][bottom][index][help] */
  47                                         struct smbcli_state *cli)
  48 {
  49         union smb_rename io;
  50         NTSTATUS status;
  51         bool ret = true;
  52         int fnum = -1;
  53         const char *fname1 = BASEDIR "\\test1.txt";
  54         const char *fname2 = BASEDIR "\\test2.txt";
  55         const char *Fname1 = BASEDIR "\\Test1.txt";
  56         union smb_fileinfo finfo;
  57         union smb_open op;
  58 
  59         printf("Testing SMBmv\n");
  60 
  61         if (!torture_setup_dir(cli, BASEDIR)) {
  62                 return false;
  63         }
  64 
  65         printf("Trying simple rename\n");
  66 
  67         op.generic.level = RAW_OPEN_NTCREATEX;
  68         op.ntcreatex.in.root_fid = 0;
  69         op.ntcreatex.in.flags = 0;
  70         op.ntcreatex.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
  71         op.ntcreatex.in.create_options = 0;
  72         op.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
  73         op.ntcreatex.in.share_access = 
  74                 NTCREATEX_SHARE_ACCESS_READ | 
  75                 NTCREATEX_SHARE_ACCESS_WRITE;
  76         op.ntcreatex.in.alloc_size = 0;
  77         op.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN_IF;
  78         op.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS;
  79         op.ntcreatex.in.security_flags = 0;
  80         op.ntcreatex.in.fname = fname1;
  81 
  82         status = smb_raw_open(cli->tree, tctx, &op);
  83         CHECK_STATUS(status, NT_STATUS_OK);
  84         fnum = op.ntcreatex.out.file.fnum;
  85 
  86         io.generic.level = RAW_RENAME_RENAME;
  87         io.rename.in.pattern1 = fname1;
  88         io.rename.in.pattern2 = fname2;
  89         io.rename.in.attrib = 0;
  90         
  91         printf("trying rename while first file open\n");
  92         status = smb_raw_rename(cli->tree, &io);
  93         CHECK_STATUS(status, NT_STATUS_SHARING_VIOLATION);
  94 
  95         smbcli_close(cli->tree, fnum);
  96 
  97         op.ntcreatex.in.access_mask = SEC_FILE_READ_DATA;
  98         op.ntcreatex.in.share_access = 
  99                 NTCREATEX_SHARE_ACCESS_DELETE | 
 100                 NTCREATEX_SHARE_ACCESS_READ |
 101                 NTCREATEX_SHARE_ACCESS_WRITE;
 102         status = smb_raw_open(cli->tree, tctx, &op);
 103         CHECK_STATUS(status, NT_STATUS_OK);
 104         fnum = op.ntcreatex.out.file.fnum;
 105 
 106         printf("trying rename while first file open with SHARE_ACCESS_DELETE\n");
 107         status = smb_raw_rename(cli->tree, &io);
 108         CHECK_STATUS(status, NT_STATUS_OK);
 109 
 110         io.rename.in.pattern1 = fname2;
 111         io.rename.in.pattern2 = fname1;
 112         status = smb_raw_rename(cli->tree, &io);
 113         CHECK_STATUS(status, NT_STATUS_OK);
 114 
 115         printf("Trying case-changing rename\n");
 116         io.rename.in.pattern1 = fname1;
 117         io.rename.in.pattern2 = Fname1;
 118         status = smb_raw_rename(cli->tree, &io);
 119         CHECK_STATUS(status, NT_STATUS_OK);
 120 
 121         finfo.generic.level = RAW_FILEINFO_ALL_INFO;
 122         finfo.all_info.in.file.path = fname1;
 123         status = smb_raw_pathinfo(cli->tree, tctx, &finfo);
 124         CHECK_STATUS(status, NT_STATUS_OK);
 125         if (strcmp(finfo.all_info.out.fname.s, Fname1) != 0) {
 126                 printf("(%s) Incorrect filename [%s] after case-changing "
 127                        "rename, should be [%s]\n", __location__,
 128                        finfo.all_info.out.fname.s, Fname1);
 129         }
 130 
 131         io.rename.in.pattern1 = fname1;
 132         io.rename.in.pattern2 = fname2;
 133 
 134         printf("trying rename while not open\n");
 135         smb_raw_exit(cli->session);
 136         status = smb_raw_rename(cli->tree, &io);
 137         CHECK_STATUS(status, NT_STATUS_OK);
 138         
 139         printf("Trying self rename\n");
 140         io.rename.in.pattern1 = fname2;
 141         io.rename.in.pattern2 = fname2;
 142         status = smb_raw_rename(cli->tree, &io);
 143         CHECK_STATUS(status, NT_STATUS_OK);
 144 
 145         io.rename.in.pattern1 = fname1;
 146         io.rename.in.pattern2 = fname1;
 147         status = smb_raw_rename(cli->tree, &io);
 148         CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_NOT_FOUND);
 149 
 150 
 151         printf("trying wildcard rename\n");
 152         io.rename.in.pattern1 = BASEDIR "\\*.txt";
 153         io.rename.in.pattern2 = fname1;
 154         
 155         status = smb_raw_rename(cli->tree, &io);
 156         CHECK_STATUS(status, NT_STATUS_OK);
 157 
 158         printf("and again\n");
 159         status = smb_raw_rename(cli->tree, &io);
 160         CHECK_STATUS(status, NT_STATUS_OK);
 161 
 162         printf("Trying extension change\n");
 163         io.rename.in.pattern1 = BASEDIR "\\*.txt";
 164         io.rename.in.pattern2 = BASEDIR "\\*.bak";
 165         status = smb_raw_rename(cli->tree, &io);
 166         CHECK_STATUS(status, NT_STATUS_OK);
 167 
 168         status = smb_raw_rename(cli->tree, &io);
 169         CHECK_STATUS(status, NT_STATUS_NO_SUCH_FILE);
 170 
 171         printf("Checking attrib handling\n");
 172         torture_set_file_attribute(cli->tree, BASEDIR "\\test1.bak", FILE_ATTRIBUTE_HIDDEN);
 173         io.rename.in.pattern1 = BASEDIR "\\test1.bak";
 174         io.rename.in.pattern2 = BASEDIR "\\*.txt";
 175         io.rename.in.attrib = 0;
 176         status = smb_raw_rename(cli->tree, &io);
 177         CHECK_STATUS(status, NT_STATUS_NO_SUCH_FILE);
 178 
 179         io.rename.in.attrib = FILE_ATTRIBUTE_HIDDEN;
 180         status = smb_raw_rename(cli->tree, &io);
 181         CHECK_STATUS(status, NT_STATUS_OK);
 182 
 183 done:
 184         smbcli_close(cli->tree, fnum);
 185         smb_raw_exit(cli->session);
 186         smbcli_deltree(cli->tree, BASEDIR);
 187         return ret;
 188 }
 189 
 190 
 191 static bool test_osxrename(struct torture_context *tctx,
     /* [<][>][^][v][top][bottom][index][help] */
 192                            struct smbcli_state *cli)
 193 {
 194         union smb_rename io;
 195         union smb_unlink io_un;
 196         NTSTATUS status;
 197         bool ret = true;
 198         int fnum = -1;
 199         const char *fname1 = BASEDIR "\\test1";
 200         const char *FNAME1 = BASEDIR "\\TEST1";
 201         union smb_fileinfo finfo;
 202         union smb_open op;
 203 
 204         printf("\nTesting OSX Rename\n");
 205         if (!torture_setup_dir(cli, BASEDIR)) {
 206                 return false;
 207         }
 208         op.generic.level = RAW_OPEN_NTCREATEX;
 209         op.ntcreatex.in.root_fid = 0;
 210         op.ntcreatex.in.flags = 0;
 211         op.ntcreatex.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
 212         op.ntcreatex.in.create_options = 0;
 213         op.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
 214         op.ntcreatex.in.share_access =
 215                 NTCREATEX_SHARE_ACCESS_READ |
 216                 NTCREATEX_SHARE_ACCESS_WRITE;
 217         op.ntcreatex.in.alloc_size = 0;
 218         op.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN_IF;
 219         op.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS;
 220         op.ntcreatex.in.security_flags = 0;
 221         op.ntcreatex.in.fname = fname1;
 222 
 223         status = smb_raw_open(cli->tree, tctx, &op);
 224         CHECK_STATUS(status, NT_STATUS_OK);
 225         fnum = op.ntcreatex.out.file.fnum;
 226 
 227         io.generic.level = RAW_RENAME_RENAME;
 228         io.rename.in.attrib = 0;
 229 
 230         smbcli_close(cli->tree, fnum);
 231 
 232         /* Rename by changing case. First check for the
 233          * existence of the file with the "newname".
 234          * If we find one and both the output and input are same case,
 235          * delete it. */
 236 
 237         printf("Checking os X rename (case changing)\n");
 238 
 239         finfo.generic.level = RAW_FILEINFO_ALL_INFO;
 240         finfo.all_info.in.file.path = FNAME1;
 241         printf("Looking for file %s \n",FNAME1);
 242         status = smb_raw_pathinfo(cli->tree, tctx, &finfo);
 243 
 244         if (NT_STATUS_EQUAL(status, NT_STATUS_OK)) {
 245                 printf("Name of the file found %s \n", finfo.all_info.out.fname.s);
 246                 if (strcmp(finfo.all_info.out.fname.s, finfo.all_info.in.file.path) == 0) {
 247                         /* If file is found with the same case delete it */
 248                         printf("Deleting File %s \n", finfo.all_info.out.fname.s);
 249                         io_un.unlink.in.pattern = finfo.all_info.out.fname.s;
 250                         io_un.unlink.in.attrib = 0;
 251                         status = smb_raw_unlink(cli->tree, &io_un);
 252                         CHECK_STATUS(status, NT_STATUS_OK);
 253                 }
 254         }
 255 
 256         io.rename.in.pattern1 = fname1;
 257         io.rename.in.pattern2 = FNAME1;
 258         status = smb_raw_rename(cli->tree, &io);
 259         CHECK_STATUS(status, NT_STATUS_OK);
 260 
 261         finfo.generic.level = RAW_FILEINFO_ALL_INFO;
 262         finfo.all_info.in.file.path = fname1;
 263         status = smb_raw_pathinfo(cli->tree, tctx, &finfo);
 264         CHECK_STATUS(status, NT_STATUS_OK);
 265         printf("File name after rename %s \n",finfo.all_info.out.fname.s);
 266 
 267 done:
 268         smbcli_close(cli->tree, fnum);
 269         smb_raw_exit(cli->session);
 270         smbcli_deltree(cli->tree, BASEDIR);
 271         return ret;
 272 }
 273 
 274 /*
 275   test SMBntrename ops
 276 */
 277 static bool test_ntrename(struct torture_context *tctx, 
     /* [<][>][^][v][top][bottom][index][help] */
 278                                                   struct smbcli_state *cli)
 279 {
 280         union smb_rename io;
 281         NTSTATUS status;
 282         bool ret = true;
 283         int fnum, i;
 284         const char *fname1 = BASEDIR "\\test1.txt";
 285         const char *fname2 = BASEDIR "\\test2.txt";
 286         union smb_fileinfo finfo;
 287 
 288         printf("Testing SMBntrename\n");
 289 
 290         if (!torture_setup_dir(cli, BASEDIR)) {
 291                 return false;
 292         }
 293 
 294         printf("Trying simple rename\n");
 295 
 296         fnum = create_complex_file(cli, tctx, fname1);
 297         
 298         io.generic.level = RAW_RENAME_NTRENAME;
 299         io.ntrename.in.old_name = fname1;
 300         io.ntrename.in.new_name = fname2;
 301         io.ntrename.in.attrib = 0;
 302         io.ntrename.in.cluster_size = 0;
 303         io.ntrename.in.flags = RENAME_FLAG_RENAME;
 304         
 305         status = smb_raw_rename(cli->tree, &io);
 306         CHECK_STATUS(status, NT_STATUS_SHARING_VIOLATION);
 307         
 308         smb_raw_exit(cli->session);
 309         status = smb_raw_rename(cli->tree, &io);
 310         CHECK_STATUS(status, NT_STATUS_OK);
 311 
 312         printf("Trying self rename\n");
 313         io.ntrename.in.old_name = fname2;
 314         io.ntrename.in.new_name = fname2;
 315         status = smb_raw_rename(cli->tree, &io);
 316         CHECK_STATUS(status, NT_STATUS_OK);
 317 
 318         io.ntrename.in.old_name = fname1;
 319         io.ntrename.in.new_name = fname1;
 320         status = smb_raw_rename(cli->tree, &io);
 321         CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_NOT_FOUND);
 322 
 323         printf("trying wildcard rename\n");
 324         io.ntrename.in.old_name = BASEDIR "\\*.txt";
 325         io.ntrename.in.new_name = fname1;
 326         
 327         status = smb_raw_rename(cli->tree, &io);
 328         CHECK_STATUS(status, NT_STATUS_OBJECT_PATH_SYNTAX_BAD);
 329 
 330         printf("Checking attrib handling\n");
 331         torture_set_file_attribute(cli->tree, fname2, FILE_ATTRIBUTE_HIDDEN);
 332         io.ntrename.in.old_name = fname2;
 333         io.ntrename.in.new_name = fname1;
 334         io.ntrename.in.attrib = 0;
 335         status = smb_raw_rename(cli->tree, &io);
 336         CHECK_STATUS(status, NT_STATUS_NO_SUCH_FILE);
 337 
 338         io.ntrename.in.attrib = FILE_ATTRIBUTE_HIDDEN;
 339         status = smb_raw_rename(cli->tree, &io);
 340         CHECK_STATUS(status, NT_STATUS_OK);
 341 
 342         torture_set_file_attribute(cli->tree, fname1, FILE_ATTRIBUTE_NORMAL);
 343 
 344         printf("Checking hard link\n");
 345         io.ntrename.in.old_name = fname1;
 346         io.ntrename.in.new_name = fname2;
 347         io.ntrename.in.attrib = 0;
 348         io.ntrename.in.flags = RENAME_FLAG_HARD_LINK;
 349         status = smb_raw_rename(cli->tree, &io);
 350         CHECK_STATUS(status, NT_STATUS_OK);
 351 
 352         torture_set_file_attribute(cli->tree, fname1, FILE_ATTRIBUTE_SYSTEM);
 353 
 354         finfo.generic.level = RAW_FILEINFO_ALL_INFO;
 355         finfo.generic.in.file.path = fname2;
 356         status = smb_raw_pathinfo(cli->tree, tctx, &finfo);
 357         CHECK_STATUS(status, NT_STATUS_OK);
 358         CHECK_VALUE(finfo.all_info.out.nlink, 2);
 359         CHECK_VALUE(finfo.all_info.out.attrib, FILE_ATTRIBUTE_SYSTEM);
 360 
 361         finfo.generic.in.file.path = fname1;
 362         status = smb_raw_pathinfo(cli->tree, tctx, &finfo);
 363         CHECK_STATUS(status, NT_STATUS_OK);
 364         CHECK_VALUE(finfo.all_info.out.nlink, 2);
 365         CHECK_VALUE(finfo.all_info.out.attrib, FILE_ATTRIBUTE_SYSTEM);
 366 
 367         torture_set_file_attribute(cli->tree, fname1, FILE_ATTRIBUTE_NORMAL);
 368 
 369         smbcli_unlink(cli->tree, fname2);
 370 
 371         finfo.generic.in.file.path = fname1;
 372         status = smb_raw_pathinfo(cli->tree, tctx, &finfo);
 373         CHECK_STATUS(status, NT_STATUS_OK);
 374         CHECK_VALUE(finfo.all_info.out.nlink, 1);
 375         CHECK_VALUE(finfo.all_info.out.attrib, FILE_ATTRIBUTE_NORMAL);
 376 
 377         printf("Checking copy\n");
 378         io.ntrename.in.old_name = fname1;
 379         io.ntrename.in.new_name = fname2;
 380         io.ntrename.in.attrib = 0;
 381         io.ntrename.in.flags = RENAME_FLAG_COPY;
 382         status = smb_raw_rename(cli->tree, &io);
 383         CHECK_STATUS(status, NT_STATUS_OK);
 384 
 385         finfo.generic.level = RAW_FILEINFO_ALL_INFO;
 386         finfo.generic.in.file.path = fname1;
 387         status = smb_raw_pathinfo(cli->tree, tctx, &finfo);
 388         CHECK_STATUS(status, NT_STATUS_OK);
 389         CHECK_VALUE(finfo.all_info.out.nlink, 1);
 390         CHECK_VALUE(finfo.all_info.out.attrib, FILE_ATTRIBUTE_NORMAL);
 391 
 392         finfo.generic.level = RAW_FILEINFO_ALL_INFO;
 393         finfo.generic.in.file.path = fname2;
 394         status = smb_raw_pathinfo(cli->tree, tctx, &finfo);
 395         CHECK_STATUS(status, NT_STATUS_OK);
 396         CHECK_VALUE(finfo.all_info.out.nlink, 1);
 397         CHECK_VALUE(finfo.all_info.out.attrib, FILE_ATTRIBUTE_NORMAL);
 398 
 399         torture_set_file_attribute(cli->tree, fname1, FILE_ATTRIBUTE_SYSTEM);
 400 
 401         finfo.generic.level = RAW_FILEINFO_ALL_INFO;
 402         finfo.generic.in.file.path = fname2;
 403         status = smb_raw_pathinfo(cli->tree, tctx, &finfo);
 404         CHECK_STATUS(status, NT_STATUS_OK);
 405         CHECK_VALUE(finfo.all_info.out.nlink, 1);
 406         CHECK_VALUE(finfo.all_info.out.attrib, FILE_ATTRIBUTE_NORMAL);
 407 
 408         finfo.generic.in.file.path = fname1;
 409         status = smb_raw_pathinfo(cli->tree, tctx, &finfo);
 410         CHECK_STATUS(status, NT_STATUS_OK);
 411         CHECK_VALUE(finfo.all_info.out.nlink, 1);
 412         CHECK_VALUE(finfo.all_info.out.attrib, FILE_ATTRIBUTE_SYSTEM);
 413 
 414         torture_set_file_attribute(cli->tree, fname1, FILE_ATTRIBUTE_NORMAL);
 415 
 416         smbcli_unlink(cli->tree, fname2);
 417 
 418         finfo.generic.in.file.path = fname1;
 419         status = smb_raw_pathinfo(cli->tree, tctx, &finfo);
 420         CHECK_STATUS(status, NT_STATUS_OK);
 421         CHECK_VALUE(finfo.all_info.out.nlink, 1);
 422 
 423         printf("Checking invalid flags\n");
 424         io.ntrename.in.old_name = fname1;
 425         io.ntrename.in.new_name = fname2;
 426         io.ntrename.in.attrib = 0;
 427         io.ntrename.in.flags = 0;
 428         status = smb_raw_rename(cli->tree, &io);
 429         CHECK_STATUS(status, NT_STATUS_ACCESS_DENIED);
 430 
 431         io.ntrename.in.flags = 300;
 432         status = smb_raw_rename(cli->tree, &io);
 433         CHECK_STATUS(status, NT_STATUS_ACCESS_DENIED);
 434 
 435         io.ntrename.in.flags = 0x106;
 436         status = smb_raw_rename(cli->tree, &io);
 437         CHECK_STATUS(status, NT_STATUS_ACCESS_DENIED);
 438 
 439         printf("Checking unknown field\n");
 440         io.ntrename.in.old_name = fname1;
 441         io.ntrename.in.new_name = fname2;
 442         io.ntrename.in.attrib = 0;
 443         io.ntrename.in.flags = RENAME_FLAG_RENAME;
 444         io.ntrename.in.cluster_size = 0xff;
 445         status = smb_raw_rename(cli->tree, &io);
 446         CHECK_STATUS(status, NT_STATUS_OK);
 447 
 448         printf("Trying RENAME_FLAG_MOVE_CLUSTER_INFORMATION\n");
 449 
 450         io.ntrename.in.old_name = fname2;
 451         io.ntrename.in.new_name = fname1;
 452         io.ntrename.in.attrib = 0;
 453         io.ntrename.in.flags = RENAME_FLAG_MOVE_CLUSTER_INFORMATION;
 454         io.ntrename.in.cluster_size = 1;
 455         status = smb_raw_rename(cli->tree, &io);
 456         CHECK_STATUS(status, NT_STATUS_INVALID_PARAMETER);
 457 
 458         io.ntrename.in.flags = RENAME_FLAG_COPY;
 459         status = smb_raw_rename(cli->tree, &io);
 460         CHECK_STATUS(status, NT_STATUS_OK);
 461 
 462 #if 0
 463         {
 464                 char buf[16384];
 465                 fnum = smbcli_open(cli->tree, fname1, O_RDWR, DENY_NONE);
 466                 memset(buf, 1, sizeof(buf));
 467                 smbcli_write(cli->tree, fnum, 0, buf, 0, sizeof(buf));
 468                 smbcli_close(cli->tree, fnum);
 469 
 470                 fnum = smbcli_open(cli->tree, fname2, O_RDWR, DENY_NONE);
 471                 memset(buf, 1, sizeof(buf));
 472                 smbcli_write(cli->tree, fnum, 0, buf, 0, sizeof(buf)-1);
 473                 smbcli_close(cli->tree, fnum);
 474 
 475                 torture_all_info(cli->tree, fname1);
 476                 torture_all_info(cli->tree, fname2);
 477         }
 478         
 479 
 480         io.ntrename.in.flags = RENAME_FLAG_MOVE_CLUSTER_INFORMATION;
 481         status = smb_raw_rename(cli->tree, &io);
 482         CHECK_STATUS(status, NT_STATUS_INVALID_PARAMETER);
 483 
 484         for (i=0;i<20000;i++) {
 485                 io.ntrename.in.cluster_size = i;
 486                 status = smb_raw_rename(cli->tree, &io);
 487                 if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_PARAMETER)) {
 488                         printf("i=%d status=%s\n", i, nt_errstr(status));
 489                 }
 490         }
 491 #endif
 492 
 493         printf("Checking other flags\n");
 494 
 495         for (i=0;i<0xFFF;i++) {
 496                 if (i == RENAME_FLAG_RENAME ||
 497                     i == RENAME_FLAG_HARD_LINK ||
 498                     i == RENAME_FLAG_COPY) {
 499                         continue;
 500                 }
 501 
 502                 io.ntrename.in.old_name = fname2;
 503                 io.ntrename.in.new_name = fname1;
 504                 io.ntrename.in.flags = i;
 505                 io.ntrename.in.attrib = 0;
 506                 io.ntrename.in.cluster_size = 0;
 507                 status = smb_raw_rename(cli->tree, &io);
 508                 if (!NT_STATUS_EQUAL(status, NT_STATUS_ACCESS_DENIED)) {
 509                         printf("flags=0x%x status=%s\n", i, nt_errstr(status));
 510                 }
 511         }
 512         
 513 done:
 514         smb_raw_exit(cli->session);
 515         smbcli_deltree(cli->tree, BASEDIR);
 516         return ret;
 517 }
 518 
 519 /*
 520   test dir rename.
 521 */
 522 static bool test_dir_rename(struct torture_context *tctx, struct smbcli_state *cli)
     /* [<][>][^][v][top][bottom][index][help] */
 523 {
 524         union smb_open io;
 525         union smb_rename ren_io;
 526         NTSTATUS status;
 527         const char *dname1 = BASEDIR "\\dir_for_rename";
 528         const char *dname2 = BASEDIR "\\renamed_dir";
 529         const char *fname = BASEDIR "\\dir_for_rename\\file.txt";
 530         const char *sname = BASEDIR "\\dir_for_rename:a stream:$DATA";
 531         bool ret = true;
 532         int fnum = -1;
 533 
 534         printf("Checking rename on a directory containing an open file.\n");
 535 
 536         if (!torture_setup_dir(cli, BASEDIR)) {
 537                 return false;
 538         }
 539 
 540         /* create a directory */
 541         smbcli_rmdir(cli->tree, dname1);
 542         smbcli_rmdir(cli->tree, dname2);
 543         smbcli_unlink(cli->tree, dname1);
 544         smbcli_unlink(cli->tree, dname2);
 545 
 546         ZERO_STRUCT(io);
 547         io.generic.level = RAW_OPEN_NTCREATEX;
 548         io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE;
 549         io.ntcreatex.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
 550         io.ntcreatex.in.alloc_size = 0;
 551         io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
 552         io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_READ | NTCREATEX_SHARE_ACCESS_WRITE;
 553         io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE;
 554         io.ntcreatex.in.create_options = NTCREATEX_OPTIONS_DIRECTORY;
 555         io.ntcreatex.in.fname = dname1;
 556         status = smb_raw_open(cli->tree, tctx, &io);
 557         CHECK_STATUS(status, NT_STATUS_OK);
 558 
 559         fnum = io.ntcreatex.out.file.fnum;
 560         smbcli_close(cli->tree, fnum);
 561 
 562         /* Now create and hold open a file. */
 563         ZERO_STRUCT(io);
 564 
 565         io.generic.level = RAW_OPEN_NTCREATEX;
 566         io.ntcreatex.in.flags = NTCREATEX_FLAGS_EXTENDED;
 567         io.ntcreatex.in.root_fid = 0;
 568         io.ntcreatex.in.alloc_size = 0;
 569         io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL;
 570         io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
 571         io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_READ | NTCREATEX_SHARE_ACCESS_WRITE | NTCREATEX_SHARE_ACCESS_DELETE;
 572         io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE;
 573         io.ntcreatex.in.create_options = 0;
 574         io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS;
 575         io.ntcreatex.in.security_flags = 0;
 576         io.ntcreatex.in.fname = fname;
 577 
 578         /* Create the file. */
 579 
 580         status = smb_raw_open(cli->tree, tctx, &io);
 581         CHECK_STATUS(status, NT_STATUS_OK);
 582         fnum = io.ntcreatex.out.file.fnum;
 583 
 584         /* Now try and rename the directory. */
 585 
 586         ZERO_STRUCT(ren_io);
 587         ren_io.generic.level = RAW_RENAME_RENAME;
 588         ren_io.rename.in.pattern1 = dname1;
 589         ren_io.rename.in.pattern2 = dname2;
 590         ren_io.rename.in.attrib = 0;
 591         
 592         status = smb_raw_rename(cli->tree, &ren_io);
 593         CHECK_STATUS(status, NT_STATUS_ACCESS_DENIED);
 594 
 595         /* Close the file and try the rename. */
 596         smbcli_close(cli->tree, fnum);
 597 
 598         status = smb_raw_rename(cli->tree, &ren_io);
 599         CHECK_STATUS(status, NT_STATUS_OK);
 600 
 601         /*
 602          * Now try just holding a second handle on the directory and holding
 603          * it open across a rename.  This should be allowed.
 604          */
 605         io.ntcreatex.in.fname = dname2;
 606         io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN_IF;
 607 
 608         io.ntcreatex.in.access_mask = SEC_STD_READ_CONTROL |
 609             SEC_FILE_READ_ATTRIBUTE | SEC_FILE_READ_EA | SEC_FILE_READ_DATA;
 610 
 611         status = smb_raw_open(cli->tree, tctx, &io);
 612         CHECK_STATUS(status, NT_STATUS_OK);
 613         fnum = io.ntcreatex.out.file.fnum;
 614 
 615         ren_io.generic.level = RAW_RENAME_RENAME;
 616         ren_io.rename.in.pattern1 = dname2;
 617         ren_io.rename.in.pattern2 = dname1;
 618         ren_io.rename.in.attrib = 0;
 619 
 620         status = smb_raw_rename(cli->tree, &ren_io);
 621         CHECK_STATUS(status, NT_STATUS_OK);
 622 
 623         /* close our handle to the directory. */
 624         smbcli_close(cli->tree, fnum);
 625 
 626         /*
 627          * Now try opening a stream on the directory and holding it open
 628          * across a rename.  This should be allowed.
 629          */
 630         io.ntcreatex.in.fname = sname;
 631 
 632         status = smb_raw_open(cli->tree, tctx, &io);
 633         CHECK_STATUS(status, NT_STATUS_OK);
 634         fnum = io.ntcreatex.out.file.fnum;
 635 
 636         ren_io.generic.level = RAW_RENAME_RENAME;
 637         ren_io.rename.in.pattern1 = dname1;
 638         ren_io.rename.in.pattern2 = dname2;
 639         ren_io.rename.in.attrib = 0;
 640 
 641         status = smb_raw_rename(cli->tree, &ren_io);
 642         CHECK_STATUS(status, NT_STATUS_OK);
 643 
 644 done:
 645         
 646         if (fnum != -1) {
 647                 smbcli_close(cli->tree, fnum);
 648         }
 649         smb_raw_exit(cli->session);
 650         smbcli_deltree(cli->tree, BASEDIR);
 651         return ret;
 652 }
 653 
 654 extern bool test_trans2rename(struct torture_context *tctx, struct smbcli_state *cli1, struct smbcli_state *cli2);
 655 extern bool test_nttransrename(struct torture_context *tctx, struct smbcli_state *cli1);
 656 
 657 /* 
 658    basic testing of rename calls
 659 */
 660 struct torture_suite *torture_raw_rename(TALLOC_CTX *mem_ctx)
     /* [<][>][^][v][top][bottom][index][help] */
 661 {
 662         struct torture_suite *suite = torture_suite_create(mem_ctx, "RENAME");
 663 
 664         torture_suite_add_1smb_test(suite, "mv", test_mv);
 665         /* test_trans2rename and test_nttransrename are actually in torture/raw/oplock.c to
 666            use the handlers and macros there. */
 667         torture_suite_add_2smb_test(suite, "trans2rename", test_trans2rename);
 668         torture_suite_add_1smb_test(suite, "nttransrename", test_nttransrename);
 669         torture_suite_add_1smb_test(suite, "ntrename", test_ntrename);
 670         torture_suite_add_1smb_test(suite, "osxrename", test_osxrename);
 671         torture_suite_add_1smb_test(suite, "directory rename", test_dir_rename);
 672 
 673         return suite;
 674 }

/* [<][>][^][v][top][bottom][index][help] */