1 /* 2 * Copyright (c) International Business Machines Corp., 2004 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 12 * the GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18 19 /* 20 * TEST CASE : right.c 21 * 22 * VARIATIONS : 63 23 * 24 * API'S TESTED : dm_request_right 25 * dm_release_right 26 * dm_query_right 27 * dm_upgrade_right 28 * dm_downgrade_right 29 */ 30 #include <string.h> 31 #include <stdio.h> 32 #include <errno.h> 33 #include <pthread.h> 34 #include <unistd.h> 35 #include <sys/stat.h> 36 #include <sys/mount.h> 37 #include <fcntl.h> 38 #include "dm_test.h" 39 40 pthread_t tid; 41 dm_sessid_t sid; 42 char dmMsgBuf[4096]; 43 char command[4096]; 44 char *mountPt; 45 char *deviceNm; 46 char DummyFile[FILENAME_MAX]; 47 char DummySubdir[FILENAME_MAX]; 48 int fd_f; 49 int runTestOnCreate; 50 51 void *Thread(void *); 52 53 int main(int argc, char **argv) 54 { 55 56 char *varstr; 57 int rc; 58 char *szSessionInfo = "dm_test session info"; 59 dm_eventset_t events; 60 61 DMOPT_PARSE(argc, argv); 62 DMLOG_START(); 63 64 DMEV_ZERO(events); 65 DMEV_SET(DM_EVENT_MOUNT, events); 66 67 /* CANNOT DO ANYTHING WITHOUT SUCCESSFUL INITIALIZATION!!! */ 68 if ((rc = dm_init_service(&varstr)) != 0) { 69 DMLOG_PRINT(DMLVL_ERR, 70 "dm_init_service failed! (rc = %d, errno = %d)\n", 71 rc, errno); 72 DM_EXIT(); 73 } else if ((rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &sid)) 74 == -1) { 75 DMLOG_PRINT(DMLVL_ERR, 76 "dm_create_session failed! (rc = %d, errno = %d)\n", 77 rc, errno); 78 DM_EXIT(); 79 } else 80 if ((rc = 81 dm_set_disp(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN, DM_NO_TOKEN, 82 &events, DM_EVENT_MAX)) == -1) { 83 DMLOG_PRINT(DMLVL_ERR, 84 "dm_set_disp failed! (rc = %d, errno = %d)\n", rc, 85 errno); 86 dm_destroy_session(sid); 87 DM_EXIT(); 88 } else if ((rc = pthread_create(&tid, NULL, Thread, NULL)) != 0) { 89 DMLOG_PRINT(DMLVL_ERR, 90 "pthread_create failed! (rc = %d, errno = %d)\n", 91 rc, errno); 92 dm_destroy_session(sid); 93 DM_EXIT(); 94 } else if ((rc = dmimpl_mount(&mountPt, &deviceNm)) == -1) { 95 DMLOG_PRINT(DMLVL_ERR, 96 "dmimpl_mount failed! (rc = %d, errno = %d)\n", rc, 97 errno); 98 dm_destroy_session(sid); 99 DM_EXIT(); 100 } else { 101 sprintf(DummyFile, "%s/%s", mountPt, DUMMY_FILE); 102 sprintf(DummySubdir, "%s/%s", mountPt, DUMMY_SUBDIR); 103 104 remove(DummyFile); 105 rmdir(DummySubdir); 106 } 107 108 fd_f = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE); 109 if (fd_f == -1) { 110 DMLOG_PRINT(DMLVL_ERR, "open failed! (rc = %d, errno = %d)\n", 111 rc, errno); 112 } 113 114 /* This is what kicks off the test case, variations done in thread */ 115 runTestOnCreate = 1; 116 rc = mkdir(DummySubdir, DUMMY_DIR_RW_MODE); 117 runTestOnCreate = 0; 118 if (rc == -1) { 119 DMLOG_PRINT(DMLVL_ERR, "mkdir failed! (rc = %d, errno = %d)\n", 120 rc, errno); 121 } 122 123 rc = rmdir(DummySubdir); 124 if (rc == -1) { 125 DMLOG_PRINT(DMLVL_ERR, "rmdir failed! (rc = %d, errno = %d)\n", 126 rc, errno); 127 } 128 129 rc = close(fd_f); 130 if (rc == -1) { 131 DMLOG_PRINT(DMLVL_ERR, "close failed! (rc = %d, errno = %d)\n", 132 rc, errno); 133 } 134 135 rc = remove(DummyFile); 136 if (rc == -1) { 137 DMLOG_PRINT(DMLVL_ERR, "remove failed! (rc = %d, errno = %d)\n", 138 rc, errno); 139 } 140 141 rc = umount(mountPt); 142 if (rc == -1) { 143 DMLOG_PRINT(DMLVL_ERR, "umount failed! (rc = %d, errno = %d)\n", 144 rc, errno); 145 } 146 147 pthread_join(tid, NULL); 148 149 rc = dm_destroy_session(sid); 150 if (rc == -1) { 151 DMLOG_PRINT(DMLVL_ERR, 152 "dm_destroy_session failed! (rc = %d, errno = %d)\n", 153 rc, errno); 154 } 155 156 DMLOG_STOP(); 157 158 tst_exit(); 159 } 160 161 void DoTest(dm_token_t token, void *hanp, size_t hlen) 162 { 163 164 char *szFuncName; 165 int rc; 166 167 DMLOG_PRINT(DMLVL_DEBUG, "Starting DMAPI rights tests\n"); 168 169 szFuncName = "dm_request_right"; 170 171 /* 172 * TEST : dm_request_right - invalid sid 173 * EXPECTED: rc = -1, errno = EINVAL 174 */ 175 if (DMVAR_EXEC(REQUEST_RIGHT_BASE + 1)) { 176 177 /* Variation set up */ 178 179 /* Variation */ 180 DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n", szFuncName); 181 rc = dm_request_right(INVALID_ADDR, hanp, hlen, token, 0, 182 DM_RIGHT_SHARED); 183 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); 184 185 /* Variation clean up */ 186 } 187 188 /* 189 * TEST : dm_request_right - invalid hanp 190 * EXPECTED: rc = -1, errno = EFAULT 191 */ 192 if (DMVAR_EXEC(REQUEST_RIGHT_BASE + 2)) { 193 194 /* Variation set up */ 195 196 /* Variation */ 197 DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n", szFuncName); 198 rc = dm_request_right(sid, (void *)INVALID_ADDR, hlen, token, 0, 199 DM_RIGHT_SHARED); 200 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT); 201 202 /* Variation clean up */ 203 } 204 205 /* 206 * TEST : dm_request_right - invalid hlen 207 * EXPECTED: rc = -1, errno = EBADF 208 */ 209 if (DMVAR_EXEC(REQUEST_RIGHT_BASE + 3)) { 210 211 /* Variation set up */ 212 213 /* Variation */ 214 DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n", szFuncName); 215 rc = dm_request_right(sid, hanp, INVALID_ADDR, token, 0, 216 DM_RIGHT_SHARED); 217 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF); 218 219 /* Variation clean up */ 220 } 221 222 /* 223 * TEST : dm_request_right - invalid token 224 * EXPECTED: rc = -1, errno = EINVAL 225 */ 226 if (DMVAR_EXEC(REQUEST_RIGHT_BASE + 4)) { 227 228 /* Variation set up */ 229 230 /* Variation */ 231 DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n", szFuncName); 232 rc = dm_request_right(sid, hanp, hlen, INVALID_ADDR, 0, 233 DM_RIGHT_SHARED); 234 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); 235 236 /* Variation clean up */ 237 } 238 239 /* 240 * TEST : dm_request_right - invalid right 241 * EXPECTED: rc = -1, errno = EINVAL 242 * 243 * This variation uncovered XFS BUG #29 (0 returned instead of -1 and 244 * errno EINVAL) 245 */ 246 if (DMVAR_EXEC(REQUEST_RIGHT_BASE + 5)) { 247 248 /* Variation set up */ 249 250 /* Variation */ 251 DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid right)\n", szFuncName); 252 rc = dm_request_right(sid, hanp, hlen, token, 0, INVALID_ADDR); 253 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); 254 255 /* Variation clean up */ 256 } 257 258 /* 259 * TEST : dm_request_right - DM_NO_TOKEN 260 * EXPECTED: rc = -1, errno = EINVAL 261 */ 262 if (DMVAR_EXEC(REQUEST_RIGHT_BASE + 6)) { 263 264 /* Variation set up */ 265 266 /* Variation */ 267 DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_TOKEN)\n", szFuncName); 268 rc = dm_request_right(sid, hanp, hlen, DM_NO_TOKEN, 0, 269 DM_RIGHT_SHARED); 270 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); 271 272 /* Variation clean up */ 273 } 274 275 /* 276 * TEST : dm_request_right - DM_RIGHT_SHARED from DM_RIGHT_NULL 277 * EXPECTED: rc = 0 278 */ 279 if (DMVAR_EXEC(REQUEST_RIGHT_BASE + 7)) { 280 281 /* Variation set up */ 282 283 /* Variation */ 284 DMLOG_PRINT(DMLVL_DEBUG, 285 "%s(DM_RIGHT_NULL -> DM_RIGHT_SHARED)\n", 286 szFuncName); 287 rc = dm_request_right(sid, hanp, hlen, token, 0, 288 DM_RIGHT_SHARED); 289 DMVAR_ENDPASSEXP(szFuncName, 0, rc); 290 291 /* Variation clean up */ 292 rc = dm_release_right(sid, hanp, hlen, token); 293 if (rc == -1) { 294 DMLOG_PRINT(DMLVL_DEBUG, 295 "Unable to clean up variation! (errno = %d)\n", 296 errno); 297 } 298 } 299 300 /* 301 * TEST : dm_request_right - DM_RIGHT_EXCL from DM_RIGHT_NULL 302 * EXPECTED: rc = 0 303 */ 304 if (DMVAR_EXEC(REQUEST_RIGHT_BASE + 8)) { 305 306 /* Variation set up */ 307 308 /* Variation */ 309 DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_RIGHT_NULL -> DM_RIGHT_EXCL)\n", 310 szFuncName); 311 rc = dm_request_right(sid, hanp, hlen, token, 0, DM_RIGHT_EXCL); 312 DMVAR_ENDPASSEXP(szFuncName, 0, rc); 313 314 /* Variation clean up */ 315 rc = dm_release_right(sid, hanp, hlen, token); 316 if (rc == -1) { 317 DMLOG_PRINT(DMLVL_DEBUG, 318 "Unable to clean up variation! (errno = %d)\n", 319 errno); 320 } 321 } 322 323 /* 324 * TEST : dm_request_right - DM_RIGHT_SHARED from DM_RIGHT_SHARED 325 * EXPECTED: rc = 0 326 */ 327 if (DMVAR_EXEC(REQUEST_RIGHT_BASE + 9)) { 328 329 /* Variation set up */ 330 rc = dm_request_right(sid, hanp, hlen, token, 0, 331 DM_RIGHT_SHARED); 332 if (rc == -1) { 333 DMLOG_PRINT(DMLVL_DEBUG, 334 "Unable to set up variation! (errno = %d)\n", 335 errno); 336 DMVAR_SKIP(); 337 } else { 338 /* Variation */ 339 DMLOG_PRINT(DMLVL_DEBUG, 340 "%s(DM_RIGHT_SHARED -> DM_RIGHT_SHARED)\n", 341 szFuncName); 342 rc = dm_request_right(sid, hanp, hlen, token, 0, 343 DM_RIGHT_SHARED); 344 DMVAR_ENDPASSEXP(szFuncName, 0, rc); 345 346 /* Variation clean up */ 347 rc = dm_release_right(sid, hanp, hlen, token); 348 if (rc == -1) { 349 DMLOG_PRINT(DMLVL_DEBUG, 350 "Unable to clean up variation! (errno = %d)\n", 351 errno); 352 } 353 } 354 } 355 356 /* 357 * TEST : dm_request_right - DM_RIGHT_EXCL from DM_RIGHT_SHARED, 358 * DM_RR_WAIT clear 359 * EXPECTED: rc = 0 360 */ 361 if (DMVAR_EXEC(REQUEST_RIGHT_BASE + 10)) { 362 363 /* Variation set up */ 364 rc = dm_request_right(sid, hanp, hlen, token, 0, 365 DM_RIGHT_SHARED); 366 if (rc == -1) { 367 DMLOG_PRINT(DMLVL_DEBUG, 368 "Unable to set up variation! (errno = %d)\n", 369 errno); 370 DMVAR_SKIP(); 371 } else { 372 /* Variation */ 373 DMLOG_PRINT(DMLVL_DEBUG, 374 "%s(DM_RIGHT_SHARED -> DM_RIGHT_EXCL, DM_RR_WAIT clear)\n", 375 szFuncName); 376 rc = dm_request_right(sid, hanp, hlen, token, 0, 377 DM_RIGHT_EXCL); 378 DMVAR_ENDPASSEXP(szFuncName, 0, rc); 379 380 /* Variation clean up */ 381 rc = dm_release_right(sid, hanp, hlen, token); 382 if (rc == -1) { 383 DMLOG_PRINT(DMLVL_DEBUG, 384 "Unable to clean up variation! (errno = %d)\n", 385 errno); 386 } 387 } 388 } 389 390 /* 391 * TEST : dm_request_right - DM_RIGHT_EXCL from DM_RIGHT_SHARED, 392 * DM_RR_WAIT set 393 * EXPECTED: rc = -1, errno = EACCES 394 * 395 * This variation uncovered XFS BUG #30 (0 returned instead of -1 and 396 * errno EACCES) 397 */ 398 if (DMVAR_EXEC(REQUEST_RIGHT_BASE + 11)) { 399 400 /* Variation set up */ 401 rc = dm_request_right(sid, hanp, hlen, token, 0, 402 DM_RIGHT_SHARED); 403 if (rc == -1) { 404 DMLOG_PRINT(DMLVL_DEBUG, 405 "Unable to set up variation! (errno = %d)\n", 406 errno); 407 DMVAR_SKIP(); 408 } else { 409 /* Variation */ 410 DMLOG_PRINT(DMLVL_DEBUG, 411 "%s(DM_RIGHT_SHARED -> DM_RIGHT_EXCL, DM_RR_WAIT set)\n", 412 szFuncName); 413 rc = dm_request_right(sid, hanp, hlen, token, 414 DM_RR_WAIT, DM_RIGHT_EXCL); 415 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EACCES); 416 417 /* Variation clean up */ 418 rc = dm_release_right(sid, hanp, hlen, token); 419 if (rc == -1) { 420 DMLOG_PRINT(DMLVL_DEBUG, 421 "Unable to clean up variation! (errno = %d)\n", 422 errno); 423 } 424 } 425 } 426 427 /* 428 * TEST : dm_request_right - DM_RIGHT_EXCL from DM_RIGHT_EXCL 429 * EXPECTED: rc = 0 430 */ 431 if (DMVAR_EXEC(REQUEST_RIGHT_BASE + 12)) { 432 433 /* Variation set up */ 434 rc = dm_request_right(sid, hanp, hlen, token, 0, DM_RIGHT_EXCL); 435 if (rc == -1) { 436 DMLOG_PRINT(DMLVL_DEBUG, 437 "Unable to set up variation! (errno = %d)\n", 438 errno); 439 DMVAR_SKIP(); 440 } else { 441 /* Variation */ 442 DMLOG_PRINT(DMLVL_DEBUG, 443 "%s(DM_RIGHT_EXCL -> DM_RIGHT_EXCL)\n", 444 szFuncName); 445 rc = dm_request_right(sid, hanp, hlen, token, 0, 446 DM_RIGHT_SHARED); 447 DMVAR_ENDPASSEXP(szFuncName, 0, rc); 448 449 /* Variation clean up */ 450 rc = dm_release_right(sid, hanp, hlen, token); 451 if (rc == -1) { 452 DMLOG_PRINT(DMLVL_DEBUG, 453 "Unable to clean up variation! (errno = %d)\n", 454 errno); 455 } 456 } 457 } 458 459 /* 460 * TEST : dm_request_right - DM_RIGHT_SHARED from DM_RIGHT_EXCL 461 * EXPECTED: rc = 0 462 */ 463 if (DMVAR_EXEC(REQUEST_RIGHT_BASE + 13)) { 464 465 /* Variation set up */ 466 rc = dm_request_right(sid, hanp, hlen, token, 0, DM_RIGHT_EXCL); 467 if (rc == -1) { 468 DMLOG_PRINT(DMLVL_DEBUG, 469 "Unable to set up variation! (errno = %d)\n", 470 errno); 471 DMVAR_SKIP(); 472 } else { 473 /* Variation */ 474 DMLOG_PRINT(DMLVL_DEBUG, 475 "%s(DM_RIGHT_EXCL -> DM_RIGHT_SHARED)\n", 476 szFuncName); 477 rc = dm_request_right(sid, hanp, hlen, token, 0, 478 DM_RIGHT_SHARED); 479 DMVAR_ENDPASSEXP(szFuncName, 0, rc); 480 481 /* Variation clean up */ 482 rc = dm_release_right(sid, hanp, hlen, token); 483 if (rc == -1) { 484 DMLOG_PRINT(DMLVL_DEBUG, 485 "Unable to clean up variation! (errno = %d)\n", 486 errno); 487 } 488 } 489 } 490 491 /* 492 * TEST : dm_request_right - DM_NO_SESSION sid 493 * EXPECTED: rc = -1, errno = EINVAL 494 */ 495 if (DMVAR_EXEC(REQUEST_RIGHT_BASE + 14)) { 496 497 /* Variation set up */ 498 499 /* Variation */ 500 DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n", szFuncName); 501 rc = dm_request_right(DM_NO_SESSION, hanp, hlen, token, 0, 502 DM_RIGHT_SHARED); 503 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); 504 505 /* Variation clean up */ 506 } 507 508 /* 509 * TEST : dm_request_right - global handle 510 * EXPECTED: rc = -1, errno = EBADF 511 */ 512 if (DMVAR_EXEC(REQUEST_RIGHT_BASE + 15)) { 513 514 /* Variation set up */ 515 516 /* Variation */ 517 DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", szFuncName); 518 rc = dm_request_right(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN, 519 token, 0, DM_RIGHT_SHARED); 520 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF); 521 522 /* Variation clean up */ 523 } 524 525 /* 526 * TEST : dm_request_right - file handle 527 * EXPECTED: rc = 0 528 */ 529 if (DMVAR_EXEC(REQUEST_RIGHT_BASE + 16)) { 530 void *fhanp; 531 size_t fhlen; 532 533 /* Variation set up */ 534 rc = dm_fd_to_handle(fd_f, &fhanp, &fhlen); 535 if (rc == -1) { 536 DMLOG_PRINT(DMLVL_DEBUG, 537 "Unable to set up variation! (errno = %d)\n", 538 errno); 539 DMVAR_SKIP(); 540 } else { 541 /* Variation */ 542 DMLOG_PRINT(DMLVL_DEBUG, "%s(file handle)\n", 543 szFuncName); 544 rc = dm_request_right(sid, fhanp, fhlen, token, 0, 545 DM_RIGHT_SHARED); 546 DMVAR_ENDPASSEXP(szFuncName, 0, rc); 547 548 /* Variation clean up */ 549 rc = dm_release_right(sid, fhanp, fhlen, token); 550 if (rc == -1) { 551 DMLOG_PRINT(DMLVL_DEBUG, 552 "Unable to clean up variation! (errno = %d)\n", 553 errno); 554 } 555 dm_handle_free(fhanp, fhlen); 556 } 557 } 558 559 /* 560 * TEST : dm_request_right - fs handle 561 * EXPECTED: rc = 0 562 */ 563 if (DMVAR_EXEC(REQUEST_RIGHT_BASE + 17)) { 564 void *fshanp; 565 size_t fshlen; 566 567 /* Variation set up */ 568 rc = dm_path_to_fshandle(DummyFile, &fshanp, &fshlen); 569 if (rc == -1) { 570 DMLOG_PRINT(DMLVL_DEBUG, 571 "Unable to set up variation! (errno = %d)\n", 572 errno); 573 DMVAR_SKIP(); 574 } else { 575 /* Variation */ 576 DMLOG_PRINT(DMLVL_DEBUG, "%s(fs handle)\n", szFuncName); 577 rc = dm_request_right(sid, fshanp, fshlen, token, 0, 578 DM_RIGHT_SHARED); 579 DMVAR_ENDPASSEXP(szFuncName, 0, rc); 580 581 /* Variation clean up */ 582 rc = dm_release_right(sid, fshanp, fshlen, token); 583 if (rc == -1) { 584 DMLOG_PRINT(DMLVL_DEBUG, 585 "Unable to clean up variation! (errno = %d)\n", 586 errno); 587 } 588 dm_handle_free(fshanp, fshlen); 589 } 590 } 591 592 szFuncName = "dm_release_right"; 593 594 /* 595 * TEST : dm_release_right - invalid sid 596 * EXPECTED: rc = -1, errno = EINVAL 597 */ 598 if (DMVAR_EXEC(RELEASE_RIGHT_BASE + 1)) { 599 600 /* Variation set up */ 601 602 /* Variation */ 603 DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n", szFuncName); 604 rc = dm_release_right(INVALID_ADDR, hanp, hlen, token); 605 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); 606 607 /* Variation clean up */ 608 } 609 610 /* 611 * TEST : dm_release_right - invalid hanp 612 * EXPECTED: rc = -1, errno = EFAULT 613 */ 614 if (DMVAR_EXEC(RELEASE_RIGHT_BASE + 2)) { 615 616 /* Variation set up */ 617 618 /* Variation */ 619 DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n", szFuncName); 620 rc = dm_release_right(sid, (void *)INVALID_ADDR, hlen, token); 621 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT); 622 623 /* Variation clean up */ 624 } 625 626 /* 627 * TEST : dm_release_right - invalid hlen 628 * EXPECTED: rc = -1, errno = EBADF 629 */ 630 if (DMVAR_EXEC(RELEASE_RIGHT_BASE + 3)) { 631 632 /* Variation set up */ 633 634 /* Variation */ 635 DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n", szFuncName); 636 rc = dm_release_right(sid, hanp, INVALID_ADDR, token); 637 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF); 638 639 /* Variation clean up */ 640 } 641 642 /* 643 * TEST : dm_release_right - invalid token 644 * EXPECTED: rc = -1, errno = EINVAL 645 */ 646 if (DMVAR_EXEC(RELEASE_RIGHT_BASE + 4)) { 647 648 /* Variation set up */ 649 650 /* Variation */ 651 DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n", szFuncName); 652 rc = dm_release_right(sid, hanp, hlen, INVALID_ADDR); 653 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); 654 655 /* Variation clean up */ 656 } 657 658 /* 659 * TEST : dm_release_right - DM_NO_TOKEN 660 * EXPECTED: rc = -1, errno = EINVAL 661 */ 662 if (DMVAR_EXEC(RELEASE_RIGHT_BASE + 5)) { 663 664 /* Variation set up */ 665 666 /* Variation */ 667 DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_TOKEN)\n", szFuncName); 668 rc = dm_release_right(sid, hanp, hlen, DM_NO_TOKEN); 669 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); 670 671 /* Variation clean up */ 672 } 673 674 /* 675 * TEST : dm_release_right - DM_RIGHT_NULL 676 * EXPECTED: rc = -1, errno = EACCES 677 */ 678 if (DMVAR_EXEC(RELEASE_RIGHT_BASE + 6)) { 679 680 /* Variation set up */ 681 682 /* Variation */ 683 DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_RIGHT_NULL)\n", szFuncName); 684 rc = dm_release_right(sid, hanp, hlen, token); 685 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EACCES); 686 687 /* Variation clean up */ 688 } 689 690 /* 691 * TEST : dm_release_right - DM_RIGHT_SHARED 692 * EXPECTED: rc = 0 693 */ 694 if (DMVAR_EXEC(RELEASE_RIGHT_BASE + 7)) { 695 696 /* Variation set up */ 697 rc = dm_request_right(sid, hanp, hlen, token, 0, 698 DM_RIGHT_SHARED); 699 if (rc == -1) { 700 DMLOG_PRINT(DMLVL_DEBUG, 701 "Unable to set up variation! (errno = %d)\n", 702 errno); 703 DMVAR_SKIP(); 704 } else { 705 /* Variation */ 706 DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_RIGHT_SHARED)\n", 707 szFuncName); 708 rc = dm_release_right(sid, hanp, hlen, token); 709 DMVAR_ENDPASSEXP(szFuncName, 0, rc); 710 711 /* Variation clean up */ 712 } 713 } 714 715 /* 716 * TEST : dm_release_right - DM_RIGHT_EXCL 717 * EXPECTED: rc = 0 718 */ 719 if (DMVAR_EXEC(RELEASE_RIGHT_BASE + 8)) { 720 721 /* Variation set up */ 722 rc = dm_request_right(sid, hanp, hlen, token, 0, DM_RIGHT_EXCL); 723 if (rc == -1) { 724 DMLOG_PRINT(DMLVL_DEBUG, 725 "Unable to set up variation! (errno = %d)\n", 726 errno); 727 DMVAR_SKIP(); 728 } else { 729 /* Variation */ 730 DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_RIGHT_EXCL)\n", 731 szFuncName); 732 rc = dm_release_right(sid, hanp, hlen, token); 733 DMVAR_ENDPASSEXP(szFuncName, 0, rc); 734 735 /* Variation clean up */ 736 } 737 } 738 739 /* 740 * TEST : dm_release_right - DM_NO_SESSION sid 741 * EXPECTED: rc = -1, errno = EINVAL 742 */ 743 if (DMVAR_EXEC(RELEASE_RIGHT_BASE + 9)) { 744 745 /* Variation set up */ 746 747 /* Variation */ 748 DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n", szFuncName); 749 rc = dm_release_right(DM_NO_SESSION, hanp, hlen, token); 750 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); 751 752 /* Variation clean up */ 753 } 754 755 /* 756 * TEST : dm_release_right - global handle 757 * EXPECTED: rc = -1, errno = EBADF 758 */ 759 if (DMVAR_EXEC(RELEASE_RIGHT_BASE + 10)) { 760 761 /* Variation set up */ 762 763 /* Variation */ 764 DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", szFuncName); 765 rc = dm_release_right(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN, 766 token); 767 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF); 768 769 /* Variation clean up */ 770 } 771 772 /* 773 * TEST : dm_release_right - file handle 774 * EXPECTED: rc = 0 775 */ 776 if (DMVAR_EXEC(RELEASE_RIGHT_BASE + 11)) { 777 void *fhanp; 778 size_t fhlen; 779 780 /* Variation set up */ 781 if ((rc == dm_fd_to_handle(fd_f, &fhanp, &fhlen)) == -1) { 782 /* No clean up */ 783 } else 784 if ((rc = 785 dm_request_right(sid, fhanp, fhlen, token, 0, 786 DM_RIGHT_SHARED)) == -1) { 787 dm_handle_free(fhanp, fhlen); 788 } 789 if (rc == -1) { 790 DMLOG_PRINT(DMLVL_DEBUG, 791 "Unable to set up variation! (errno = %d)\n", 792 errno); 793 DMVAR_SKIP(); 794 } else { 795 /* Variation */ 796 DMLOG_PRINT(DMLVL_DEBUG, "%s(file handle)\n", 797 szFuncName); 798 rc = dm_release_right(sid, fhanp, fhlen, token); 799 DMVAR_ENDPASSEXP(szFuncName, 0, rc); 800 801 /* Variation clean up */ 802 dm_handle_free(fhanp, fhlen); 803 } 804 } 805 806 /* 807 * TEST : dm_release_right - fs handle 808 * EXPECTED: rc = 0 809 */ 810 if (DMVAR_EXEC(RELEASE_RIGHT_BASE + 12)) { 811 void *fshanp; 812 size_t fshlen; 813 814 /* Variation set up */ 815 if ((rc == dm_path_to_fshandle(DummyFile, &fshanp, &fshlen)) == 816 -1) { 817 /* No clean up */ 818 } else 819 if ((rc = 820 dm_request_right(sid, fshanp, fshlen, token, 0, 821 DM_RIGHT_SHARED)) == -1) { 822 dm_handle_free(fshanp, fshlen); 823 } 824 if (rc == -1) { 825 DMLOG_PRINT(DMLVL_DEBUG, 826 "Unable to set up variation! (errno = %d)\n", 827 errno); 828 DMVAR_SKIP(); 829 } else { 830 /* Variation */ 831 DMLOG_PRINT(DMLVL_DEBUG, "%s(fs handle)\n", szFuncName); 832 rc = dm_release_right(sid, fshanp, fshlen, token); 833 DMVAR_ENDPASSEXP(szFuncName, 0, rc); 834 835 /* Variation clean up */ 836 dm_handle_free(fshanp, fshlen); 837 } 838 } 839 840 szFuncName = "dm_query_right"; 841 842 /* 843 * TEST : dm_query_right - invalid sid 844 * EXPECTED: rc = -1, errno = EINVAL 845 */ 846 if (DMVAR_EXEC(QUERY_RIGHT_BASE + 1)) { 847 dm_right_t right; 848 849 /* Variation set up */ 850 851 /* Variation */ 852 DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n", szFuncName); 853 rc = dm_query_right(INVALID_ADDR, hanp, hlen, token, &right); 854 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); 855 856 /* Variation clean up */ 857 } 858 859 /* 860 * TEST : dm_query_right - invalid hanp 861 * EXPECTED: rc = -1, errno = EFAULT 862 */ 863 if (DMVAR_EXEC(QUERY_RIGHT_BASE + 2)) { 864 dm_right_t right; 865 866 /* Variation set up */ 867 868 /* Variation */ 869 DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n", szFuncName); 870 rc = dm_query_right(sid, (void *)INVALID_ADDR, hlen, token, 871 &right); 872 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT); 873 874 /* Variation clean up */ 875 } 876 877 /* 878 * TEST : dm_query_right - invalid hlen 879 * EXPECTED: rc = -1, errno = EBADF 880 */ 881 if (DMVAR_EXEC(QUERY_RIGHT_BASE + 3)) { 882 dm_right_t right; 883 884 /* Variation set up */ 885 886 /* Variation */ 887 DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n", szFuncName); 888 rc = dm_query_right(sid, hanp, INVALID_ADDR, token, &right); 889 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF); 890 891 /* Variation clean up */ 892 } 893 894 /* 895 * TEST : dm_query_right - invalid token 896 * EXPECTED: rc = -1, errno = EINVAL 897 */ 898 if (DMVAR_EXEC(QUERY_RIGHT_BASE + 4)) { 899 dm_right_t right; 900 901 /* Variation set up */ 902 903 /* Variation */ 904 DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n", szFuncName); 905 rc = dm_query_right(sid, hanp, hlen, INVALID_ADDR, &right); 906 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); 907 908 /* Variation clean up */ 909 } 910 911 /* 912 * TEST : dm_query_right - invalid rightp 913 * EXPECTED: rc = -1, errno = EFAULT 914 */ 915 if (DMVAR_EXEC(QUERY_RIGHT_BASE + 5)) { 916 917 /* Variation set up */ 918 919 /* Variation */ 920 DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid rightp)\n", szFuncName); 921 rc = dm_query_right(sid, hanp, hlen, token, 922 (dm_right_t *) INVALID_ADDR); 923 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT); 924 925 /* Variation clean up */ 926 } 927 928 /* 929 * TEST : dm_query_right - DM_NO_TOKEN 930 * EXPECTED: rc = -1, errno = EINVAL 931 */ 932 if (DMVAR_EXEC(QUERY_RIGHT_BASE + 6)) { 933 dm_right_t right; 934 935 /* Variation set up */ 936 937 /* Variation */ 938 DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_TOKEN)\n", szFuncName); 939 rc = dm_query_right(sid, hanp, hlen, DM_NO_TOKEN, &right); 940 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); 941 942 /* Variation clean up */ 943 } 944 945 /* 946 * TEST : dm_query_right - DM_RIGHT_SHARED 947 * EXPECTED: rc = 0 948 */ 949 if (DMVAR_EXEC(QUERY_RIGHT_BASE + 7)) { 950 dm_right_t right; 951 952 /* Variation set up */ 953 rc = dm_request_right(sid, hanp, hlen, token, 0, 954 DM_RIGHT_SHARED); 955 if (rc == -1) { 956 DMLOG_PRINT(DMLVL_DEBUG, 957 "Unable to set up variation! (errno = %d)\n", 958 errno); 959 DMVAR_SKIP(); 960 } else { 961 /* Variation */ 962 DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_RIGHT_SHARED)\n", 963 szFuncName); 964 rc = dm_query_right(sid, hanp, hlen, token, &right); 965 if (rc == 0) { 966 if (right == DM_RIGHT_SHARED) { 967 DMLOG_PRINT(DMLVL_DEBUG, 968 "%s passed with expected rc = %d\n", 969 szFuncName, 0); 970 DMVAR_PASS(); 971 } else { 972 DMLOG_PRINT(DMLVL_ERR, 973 "%s failed with expected rc = %d but unexpected right (%d vs %d)\n", 974 szFuncName, 0, right, 975 DM_RIGHT_SHARED); 976 DMVAR_FAIL(); 977 } 978 } else { 979 DMLOG_PRINT(DMLVL_ERR, 980 "%s failed with unexpected rc = %d (errno = %d)\n", 981 szFuncName, rc, errno); 982 DMVAR_FAIL(); 983 } 984 985 /* Variation clean up */ 986 rc = dm_release_right(sid, hanp, hlen, token); 987 if (rc == -1) { 988 DMLOG_PRINT(DMLVL_DEBUG, 989 "Unable to clean up variation! (errno = %d)\n", 990 errno); 991 } 992 } 993 } 994 995 /* 996 * TEST : dm_query_right - DM_RIGHT_EXCL 997 * EXPECTED: rc = 0 998 */ 999 if (DMVAR_EXEC(QUERY_RIGHT_BASE + 8)) { 1000 dm_right_t right; 1001 1002 /* Variation set up */ 1003 rc = dm_request_right(sid, hanp, hlen, token, 0, DM_RIGHT_EXCL); 1004 if (rc == -1) { 1005 DMLOG_PRINT(DMLVL_DEBUG, 1006 "Unable to set up variation! (errno = %d)\n", 1007 errno); 1008 DMVAR_SKIP(); 1009 } else { 1010 /* Variation */ 1011 DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_RIGHT_SHARED)\n", 1012 szFuncName); 1013 rc = dm_query_right(sid, hanp, hlen, token, &right); 1014 if (rc == 0) { 1015 if (right == DM_RIGHT_EXCL) { 1016 DMLOG_PRINT(DMLVL_DEBUG, 1017 "%s passed with expected rc = %d\n", 1018 szFuncName, 0); 1019 DMVAR_PASS(); 1020 } else { 1021 DMLOG_PRINT(DMLVL_ERR, 1022 "%s failed with expected rc = %d but unexpected right (%d vs %d)\n", 1023 szFuncName, 0, right, 1024 DM_RIGHT_EXCL); 1025 DMVAR_FAIL(); 1026 } 1027 } else { 1028 DMLOG_PRINT(DMLVL_ERR, 1029 "%s failed with unexpected rc = %d (errno = %d)\n", 1030 szFuncName, rc, errno); 1031 DMVAR_FAIL(); 1032 } 1033 1034 /* Variation clean up */ 1035 rc = dm_release_right(sid, hanp, hlen, token); 1036 if (rc == -1) { 1037 DMLOG_PRINT(DMLVL_DEBUG, 1038 "Unable to clean up variation! (errno = %d)\n", 1039 errno); 1040 } 1041 } 1042 } 1043 1044 /* 1045 * TEST : dm_query_right - DM_NO_SESSION sid 1046 * EXPECTED: rc = -1, errno = EINVAL 1047 */ 1048 if (DMVAR_EXEC(QUERY_RIGHT_BASE + 9)) { 1049 dm_right_t right; 1050 1051 /* Variation set up */ 1052 1053 /* Variation */ 1054 DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n", szFuncName); 1055 rc = dm_query_right(DM_NO_SESSION, hanp, hlen, token, &right); 1056 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); 1057 1058 /* Variation clean up */ 1059 } 1060 1061 /* 1062 * TEST : dm_query_right - global handle 1063 * EXPECTED: rc = -1, errno = EBADF 1064 */ 1065 if (DMVAR_EXEC(QUERY_RIGHT_BASE + 10)) { 1066 dm_right_t right; 1067 1068 /* Variation set up */ 1069 1070 /* Variation */ 1071 DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", szFuncName); 1072 rc = dm_query_right(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN, token, 1073 &right); 1074 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF); 1075 1076 /* Variation clean up */ 1077 } 1078 1079 /* 1080 * TEST : dm_query_right - file handle 1081 * EXPECTED: rc = 0 1082 */ 1083 if (DMVAR_EXEC(QUERY_RIGHT_BASE + 11)) { 1084 void *fhanp; 1085 size_t fhlen; 1086 dm_right_t right; 1087 1088 /* Variation set up */ 1089 if ((rc = dm_fd_to_handle(fd_f, &fhanp, &fhlen)) == -1) { 1090 /* No clean up */ 1091 } else 1092 if ((rc = 1093 dm_request_right(sid, fhanp, fhlen, token, 0, 1094 DM_RIGHT_SHARED)) == -1) { 1095 dm_handle_free(fhanp, fhlen); 1096 } 1097 if (rc == -1) { 1098 DMLOG_PRINT(DMLVL_DEBUG, 1099 "Unable to set up variation! (errno = %d)\n", 1100 errno); 1101 DMVAR_SKIP(); 1102 } else { 1103 /* Variation */ 1104 DMLOG_PRINT(DMLVL_DEBUG, "%s(file handle)\n", 1105 szFuncName); 1106 rc = dm_query_right(sid, fhanp, fhlen, token, &right); 1107 if (rc == 0) { 1108 if (right == DM_RIGHT_SHARED) { 1109 DMLOG_PRINT(DMLVL_DEBUG, 1110 "%s passed with expected rc = %d\n", 1111 szFuncName, 0); 1112 DMVAR_PASS(); 1113 } else { 1114 DMLOG_PRINT(DMLVL_ERR, 1115 "%s failed with expected rc = %d but unexpected right (%d vs %d)\n", 1116 szFuncName, 0, right, 1117 DM_RIGHT_SHARED); 1118 DMVAR_FAIL(); 1119 } 1120 } else { 1121 DMLOG_PRINT(DMLVL_ERR, 1122 "%s failed with unexpected rc = %d (errno = %d)\n", 1123 szFuncName, rc, errno); 1124 DMVAR_FAIL(); 1125 } 1126 1127 /* Variation clean up */ 1128 rc = dm_release_right(sid, fhanp, fhlen, token); 1129 if (rc == -1) { 1130 DMLOG_PRINT(DMLVL_DEBUG, 1131 "Unable to clean up variation! (errno = %d)\n", 1132 errno); 1133 } 1134 dm_handle_free(fhanp, fhlen); 1135 } 1136 } 1137 1138 /* 1139 * TEST : dm_query_right - fs handle 1140 * EXPECTED: rc = 0 1141 */ 1142 if (DMVAR_EXEC(QUERY_RIGHT_BASE + 12)) { 1143 void *fshanp; 1144 size_t fshlen; 1145 dm_right_t right; 1146 1147 /* Variation set up */ 1148 if ((rc = 1149 dm_path_to_fshandle(DummyFile, &fshanp, &fshlen)) == -1) { 1150 /* No clean up */ 1151 } else 1152 if ((rc = 1153 dm_request_right(sid, fshanp, fshlen, token, 0, 1154 DM_RIGHT_SHARED)) == -1) { 1155 dm_handle_free(fshanp, fshlen); 1156 } 1157 if (rc == -1) { 1158 DMLOG_PRINT(DMLVL_DEBUG, 1159 "Unable to set up variation! (errno = %d)\n", 1160 errno); 1161 DMVAR_SKIP(); 1162 } else { 1163 /* Variation */ 1164 DMLOG_PRINT(DMLVL_DEBUG, "%s(fs handle)\n", szFuncName); 1165 rc = dm_query_right(sid, fshanp, fshlen, token, &right); 1166 if (rc == 0) { 1167 if (right == DM_RIGHT_SHARED) { 1168 DMLOG_PRINT(DMLVL_DEBUG, 1169 "%s passed with expected rc = %d\n", 1170 szFuncName, 0); 1171 DMVAR_PASS(); 1172 } else { 1173 DMLOG_PRINT(DMLVL_ERR, 1174 "%s failed with expected rc = %d but unexpected right (%d vs %d)\n", 1175 szFuncName, 0, right, 1176 DM_RIGHT_SHARED); 1177 DMVAR_FAIL(); 1178 } 1179 } else { 1180 DMLOG_PRINT(DMLVL_ERR, 1181 "%s failed with unexpected rc = %d (errno = %d)\n", 1182 szFuncName, rc, errno); 1183 DMVAR_FAIL(); 1184 } 1185 1186 /* Variation clean up */ 1187 rc = dm_release_right(sid, fshanp, fshlen, token); 1188 if (rc == -1) { 1189 DMLOG_PRINT(DMLVL_DEBUG, 1190 "Unable to clean up variation! (errno = %d)\n", 1191 errno); 1192 } 1193 dm_handle_free(fshanp, fshlen); 1194 } 1195 } 1196 1197 szFuncName = "dm_upgrade_right"; 1198 1199 /* 1200 * TEST : dm_upgrade_right - invalid sid 1201 * EXPECTED: rc = -1, errno = EINVAL 1202 */ 1203 if (DMVAR_EXEC(UPGRADE_RIGHT_BASE + 1)) { 1204 1205 /* Variation set up */ 1206 rc = dm_request_right(sid, hanp, hlen, token, 0, 1207 DM_RIGHT_SHARED); 1208 if (rc == -1) { 1209 DMLOG_PRINT(DMLVL_DEBUG, 1210 "Unable to set up variation! (errno = %d)\n", 1211 errno); 1212 DMVAR_SKIP(); 1213 } else { 1214 /* Variation */ 1215 DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n", 1216 szFuncName); 1217 rc = dm_upgrade_right(INVALID_ADDR, hanp, hlen, token); 1218 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); 1219 1220 /* Variation clean up */ 1221 rc = dm_release_right(sid, hanp, hlen, token); 1222 if (rc == -1) { 1223 DMLOG_PRINT(DMLVL_DEBUG, 1224 "Unable to clean up variation! (errno = %d)\n", 1225 errno); 1226 } 1227 } 1228 } 1229 1230 /* 1231 * TEST : dm_upgrade_right - invalid hanp 1232 * EXPECTED: rc = -1, errno = EFAULT 1233 */ 1234 if (DMVAR_EXEC(UPGRADE_RIGHT_BASE + 2)) { 1235 1236 /* Variation set up */ 1237 rc = dm_request_right(sid, hanp, hlen, token, 0, 1238 DM_RIGHT_SHARED); 1239 if (rc == -1) { 1240 DMLOG_PRINT(DMLVL_DEBUG, 1241 "Unable to set up variation! (errno = %d)\n", 1242 errno); 1243 DMVAR_SKIP(); 1244 } else { 1245 /* Variation */ 1246 DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n", 1247 szFuncName); 1248 rc = dm_upgrade_right(sid, (void *)INVALID_ADDR, hlen, 1249 token); 1250 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT); 1251 1252 /* Variation clean up */ 1253 rc = dm_release_right(sid, hanp, hlen, token); 1254 if (rc == -1) { 1255 DMLOG_PRINT(DMLVL_DEBUG, 1256 "Unable to clean up variation! (errno = %d)\n", 1257 errno); 1258 } 1259 } 1260 } 1261 1262 /* 1263 * TEST : dm_upgrade_right - invalid hlen 1264 * EXPECTED: rc = -1, errno = EBADF 1265 */ 1266 if (DMVAR_EXEC(UPGRADE_RIGHT_BASE + 3)) { 1267 1268 /* Variation set up */ 1269 rc = dm_request_right(sid, hanp, hlen, token, 0, 1270 DM_RIGHT_SHARED); 1271 if (rc == -1) { 1272 DMLOG_PRINT(DMLVL_DEBUG, 1273 "Unable to set up variation! (errno = %d)\n", 1274 errno); 1275 DMVAR_SKIP(); 1276 } else { 1277 /* Variation */ 1278 DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n", 1279 szFuncName); 1280 rc = dm_upgrade_right(sid, hanp, INVALID_ADDR, token); 1281 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF); 1282 1283 /* Variation clean up */ 1284 rc = dm_release_right(sid, hanp, hlen, token); 1285 if (rc == -1) { 1286 DMLOG_PRINT(DMLVL_DEBUG, 1287 "Unable to clean up variation! (errno = %d)\n", 1288 errno); 1289 } 1290 } 1291 } 1292 1293 /* 1294 * TEST : dm_upgrade_right - invalid token 1295 * EXPECTED: rc = -1, errno = EINVAL 1296 */ 1297 if (DMVAR_EXEC(UPGRADE_RIGHT_BASE + 4)) { 1298 1299 /* Variation set up */ 1300 rc = dm_request_right(sid, hanp, hlen, token, 0, 1301 DM_RIGHT_SHARED); 1302 if (rc == -1) { 1303 DMLOG_PRINT(DMLVL_DEBUG, 1304 "Unable to set up variation! (errno = %d)\n", 1305 errno); 1306 DMVAR_SKIP(); 1307 } else { 1308 /* Variation */ 1309 DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n", 1310 szFuncName); 1311 rc = dm_upgrade_right(sid, hanp, hlen, INVALID_ADDR); 1312 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); 1313 1314 /* Variation clean up */ 1315 rc = dm_release_right(sid, hanp, hlen, token); 1316 if (rc == -1) { 1317 DMLOG_PRINT(DMLVL_DEBUG, 1318 "Unable to clean up variation! (errno = %d)\n", 1319 errno); 1320 } 1321 } 1322 } 1323 1324 /* 1325 * TEST : dm_upgrade_right - DM_RIGHT_NULL 1326 * EXPECTED: rc = -1, errno = EPERM 1327 * 1328 * This variation uncovered XFS BUG #31 (EACCES returned instead of 1329 * EPERM) 1330 */ 1331 if (DMVAR_EXEC(UPGRADE_RIGHT_BASE + 5)) { 1332 1333 /* Variation set up */ 1334 1335 /* Variation */ 1336 DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_RIGHT_NULL)\n", szFuncName); 1337 rc = dm_upgrade_right(sid, hanp, hlen, token); 1338 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EPERM); 1339 1340 /* Variation clean up */ 1341 } 1342 1343 /* 1344 * TEST : dm_upgrade_right - DM_RIGHT_SHARED 1345 * EXPECTED: rc = 0 1346 */ 1347 if (DMVAR_EXEC(UPGRADE_RIGHT_BASE + 6)) { 1348 1349 /* Variation set up */ 1350 rc = dm_request_right(sid, hanp, hlen, token, 0, 1351 DM_RIGHT_SHARED); 1352 if (rc == -1) { 1353 DMLOG_PRINT(DMLVL_DEBUG, 1354 "Unable to set up variation! (errno = %d)\n", 1355 errno); 1356 DMVAR_SKIP(); 1357 } else { 1358 /* Variation */ 1359 DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_RIGHT_SHARED)\n", 1360 szFuncName); 1361 rc = dm_upgrade_right(sid, hanp, hlen, token); 1362 DMVAR_ENDPASSEXP(szFuncName, 0, rc); 1363 1364 /* Variation clean up */ 1365 rc = dm_release_right(sid, hanp, hlen, token); 1366 if (rc == -1) { 1367 DMLOG_PRINT(DMLVL_DEBUG, 1368 "Unable to clean up variation! (errno = %d)\n", 1369 errno); 1370 } 1371 } 1372 } 1373 1374 /* 1375 * TEST : dm_upgrade_right - DM_RIGHT_EXCL 1376 * EXPECTED: rc = 0 1377 */ 1378 if (DMVAR_EXEC(UPGRADE_RIGHT_BASE + 7)) { 1379 1380 /* Variation set up */ 1381 rc = dm_request_right(sid, hanp, hlen, token, 0, DM_RIGHT_EXCL); 1382 if (rc == -1) { 1383 DMLOG_PRINT(DMLVL_DEBUG, 1384 "Unable to set up variation! (errno = %d)\n", 1385 errno); 1386 DMVAR_SKIP(); 1387 } else { 1388 /* Variation */ 1389 DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_RIGHT_EXCL)\n", 1390 szFuncName); 1391 rc = dm_upgrade_right(sid, hanp, hlen, token); 1392 DMVAR_ENDPASSEXP(szFuncName, 0, rc); 1393 1394 /* Variation clean up */ 1395 rc = dm_release_right(sid, hanp, hlen, token); 1396 if (rc == -1) { 1397 DMLOG_PRINT(DMLVL_DEBUG, 1398 "Unable to clean up variation! (errno = %d)\n", 1399 errno); 1400 } 1401 } 1402 } 1403 1404 /* 1405 * TEST : dm_upgrade_right - DM_NO_SESSION sid 1406 * EXPECTED: rc = -1, errno = EINVAL 1407 */ 1408 if (DMVAR_EXEC(UPGRADE_RIGHT_BASE + 8)) { 1409 1410 /* Variation set up */ 1411 rc = dm_request_right(sid, hanp, hlen, token, 0, 1412 DM_RIGHT_SHARED); 1413 if (rc == -1) { 1414 DMLOG_PRINT(DMLVL_DEBUG, 1415 "Unable to set up variation! (errno = %d)\n", 1416 errno); 1417 DMVAR_SKIP(); 1418 } else { 1419 /* Variation */ 1420 DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n", 1421 szFuncName); 1422 rc = dm_upgrade_right(DM_NO_SESSION, hanp, hlen, token); 1423 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); 1424 1425 /* Variation clean up */ 1426 rc = dm_release_right(sid, hanp, hlen, token); 1427 if (rc == -1) { 1428 DMLOG_PRINT(DMLVL_DEBUG, 1429 "Unable to clean up variation! (errno = %d)\n", 1430 errno); 1431 } 1432 } 1433 } 1434 1435 /* 1436 * TEST : dm_upgrade_right - global handle 1437 * EXPECTED: rc = -1, errno = EBADF 1438 */ 1439 if (DMVAR_EXEC(UPGRADE_RIGHT_BASE + 9)) { 1440 1441 /* Variation set up */ 1442 rc = dm_request_right(sid, hanp, hlen, token, 0, 1443 DM_RIGHT_SHARED); 1444 if (rc == -1) { 1445 DMLOG_PRINT(DMLVL_DEBUG, 1446 "Unable to set up variation! (errno = %d)\n", 1447 errno); 1448 DMVAR_SKIP(); 1449 } else { 1450 /* Variation */ 1451 DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", 1452 szFuncName); 1453 rc = dm_upgrade_right(sid, DM_GLOBAL_HANP, 1454 DM_GLOBAL_HLEN, token); 1455 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF); 1456 1457 /* Variation clean up */ 1458 rc = dm_release_right(sid, hanp, hlen, token); 1459 if (rc == -1) { 1460 DMLOG_PRINT(DMLVL_DEBUG, 1461 "Unable to clean up variation! (errno = %d)\n", 1462 errno); 1463 } 1464 } 1465 } 1466 1467 /* 1468 * TEST : dm_upgrade_right - file handle 1469 * EXPECTED: rc = 0 1470 */ 1471 if (DMVAR_EXEC(UPGRADE_RIGHT_BASE + 10)) { 1472 void *fhanp; 1473 size_t fhlen; 1474 1475 /* Variation set up */ 1476 if ((rc = dm_fd_to_handle(fd_f, &fhanp, &fhlen)) == -1) { 1477 /* No clean up */ 1478 } else 1479 if ((rc = 1480 dm_request_right(sid, fhanp, fhlen, token, 0, 1481 DM_RIGHT_SHARED)) == -1) { 1482 dm_handle_free(fhanp, fhlen); 1483 } 1484 if (rc == -1) { 1485 DMLOG_PRINT(DMLVL_DEBUG, 1486 "Unable to set up variation! (errno = %d)\n", 1487 errno); 1488 DMVAR_SKIP(); 1489 } else { 1490 /* Variation */ 1491 DMLOG_PRINT(DMLVL_DEBUG, "%s(file handle)\n", 1492 szFuncName); 1493 rc = dm_upgrade_right(sid, fhanp, fhlen, token); 1494 DMVAR_ENDPASSEXP(szFuncName, 0, rc); 1495 1496 /* Variation clean up */ 1497 rc = dm_release_right(sid, fhanp, fhlen, token); 1498 if (rc == -1) { 1499 DMLOG_PRINT(DMLVL_DEBUG, 1500 "Unable to clean up variation! (errno = %d)\n", 1501 errno); 1502 } 1503 dm_handle_free(fhanp, fhlen); 1504 } 1505 } 1506 1507 /* 1508 * TEST : dm_upgrade_right - fs handle 1509 * EXPECTED: rc = 0 1510 */ 1511 if (DMVAR_EXEC(UPGRADE_RIGHT_BASE + 11)) { 1512 void *fshanp; 1513 size_t fshlen; 1514 1515 /* Variation set up */ 1516 if ((rc = 1517 dm_path_to_fshandle(DummyFile, &fshanp, &fshlen)) == -1) { 1518 /* No clean up */ 1519 } else 1520 if ((rc = 1521 dm_request_right(sid, fshanp, fshlen, token, 0, 1522 DM_RIGHT_SHARED)) == -1) { 1523 dm_handle_free(fshanp, fshlen); 1524 } 1525 if (rc == -1) { 1526 DMLOG_PRINT(DMLVL_DEBUG, 1527 "Unable to set up variation! (errno = %d)\n", 1528 errno); 1529 DMVAR_SKIP(); 1530 } else { 1531 /* Variation */ 1532 DMLOG_PRINT(DMLVL_DEBUG, "%s(fs handle)\n", szFuncName); 1533 rc = dm_upgrade_right(sid, fshanp, fshlen, token); 1534 DMVAR_ENDPASSEXP(szFuncName, 0, rc); 1535 1536 /* Variation clean up */ 1537 rc = dm_release_right(sid, fshanp, fshlen, token); 1538 if (rc == -1) { 1539 DMLOG_PRINT(DMLVL_DEBUG, 1540 "Unable to clean up variation! (errno = %d)\n", 1541 errno); 1542 } 1543 dm_handle_free(fshanp, fshlen); 1544 } 1545 } 1546 1547 szFuncName = "dm_downgrade_right"; 1548 1549 /* 1550 * TEST : dm_downgrade_right - invalid sid 1551 * EXPECTED: rc = -1, errno = EINVAL 1552 */ 1553 if (DMVAR_EXEC(DOWNGRADE_RIGHT_BASE + 1)) { 1554 1555 /* Variation set up */ 1556 rc = dm_request_right(sid, hanp, hlen, token, 0, 1557 DM_RIGHT_SHARED); 1558 if (rc == -1) { 1559 DMLOG_PRINT(DMLVL_DEBUG, 1560 "Unable to set up variation! (errno = %d)\n", 1561 errno); 1562 DMVAR_SKIP(); 1563 } else { 1564 /* Variation */ 1565 DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n", 1566 szFuncName); 1567 rc = dm_downgrade_right(INVALID_ADDR, hanp, hlen, 1568 token); 1569 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); 1570 1571 /* Variation clean up */ 1572 rc = dm_release_right(sid, hanp, hlen, token); 1573 if (rc == -1) { 1574 DMLOG_PRINT(DMLVL_DEBUG, 1575 "Unable to clean up variation! (errno = %d)\n", 1576 errno); 1577 } 1578 } 1579 } 1580 1581 /* 1582 * TEST : dm_downgrade_right - invalid hanp 1583 * EXPECTED: rc = -1, errno = EFAULT 1584 */ 1585 if (DMVAR_EXEC(DOWNGRADE_RIGHT_BASE + 2)) { 1586 1587 /* Variation set up */ 1588 rc = dm_request_right(sid, hanp, hlen, token, 0, 1589 DM_RIGHT_SHARED); 1590 if (rc == -1) { 1591 DMLOG_PRINT(DMLVL_DEBUG, 1592 "Unable to set up variation! (errno = %d)\n", 1593 errno); 1594 DMVAR_SKIP(); 1595 } else { 1596 /* Variation */ 1597 DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n", 1598 szFuncName); 1599 rc = dm_downgrade_right(sid, (void *)INVALID_ADDR, hlen, 1600 token); 1601 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT); 1602 1603 /* Variation clean up */ 1604 rc = dm_release_right(sid, hanp, hlen, token); 1605 if (rc == -1) { 1606 DMLOG_PRINT(DMLVL_DEBUG, 1607 "Unable to clean up variation! (errno = %d)\n", 1608 errno); 1609 } 1610 } 1611 } 1612 1613 /* 1614 * TEST : dm_downgrade_right - invalid hlen 1615 * EXPECTED: rc = -1, errno = EBADF 1616 */ 1617 if (DMVAR_EXEC(DOWNGRADE_RIGHT_BASE + 3)) { 1618 1619 /* Variation set up */ 1620 rc = dm_request_right(sid, hanp, hlen, token, 0, 1621 DM_RIGHT_SHARED); 1622 if (rc == -1) { 1623 DMLOG_PRINT(DMLVL_DEBUG, 1624 "Unable to set up variation! (errno = %d)\n", 1625 errno); 1626 DMVAR_SKIP(); 1627 } else { 1628 /* Variation */ 1629 DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n", 1630 szFuncName); 1631 rc = dm_downgrade_right(sid, hanp, INVALID_ADDR, token); 1632 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF); 1633 1634 /* Variation clean up */ 1635 rc = dm_release_right(sid, hanp, hlen, token); 1636 if (rc == -1) { 1637 DMLOG_PRINT(DMLVL_DEBUG, 1638 "Unable to clean up variation! (errno = %d)\n", 1639 errno); 1640 } 1641 } 1642 } 1643 1644 /* 1645 * TEST : dm_downgrade_right - invalid token 1646 * EXPECTED: rc = -1, errno = EINVAL 1647 */ 1648 if (DMVAR_EXEC(DOWNGRADE_RIGHT_BASE + 4)) { 1649 1650 /* Variation set up */ 1651 rc = dm_request_right(sid, hanp, hlen, token, 0, 1652 DM_RIGHT_SHARED); 1653 if (rc == -1) { 1654 DMLOG_PRINT(DMLVL_DEBUG, 1655 "Unable to set up variation! (errno = %d)\n", 1656 errno); 1657 DMVAR_SKIP(); 1658 } else { 1659 /* Variation */ 1660 DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n", 1661 szFuncName); 1662 rc = dm_downgrade_right(sid, hanp, hlen, INVALID_ADDR); 1663 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); 1664 1665 /* Variation clean up */ 1666 rc = dm_release_right(sid, hanp, hlen, token); 1667 if (rc == -1) { 1668 DMLOG_PRINT(DMLVL_DEBUG, 1669 "Unable to clean up variation! (errno = %d)\n", 1670 errno); 1671 } 1672 } 1673 } 1674 1675 /* 1676 * TEST : dm_downgrade_right - DM_RIGHT_NULL 1677 * EXPECTED: rc = -1, errno = EPERM 1678 * 1679 * This variation uncovered XFS BUG #32 (EACCES returned instead of 1680 * EPERM) 1681 */ 1682 if (DMVAR_EXEC(DOWNGRADE_RIGHT_BASE + 5)) { 1683 1684 /* Variation set up */ 1685 1686 /* Variation */ 1687 DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_RIGHT_NULL)\n", szFuncName); 1688 rc = dm_downgrade_right(sid, hanp, hlen, token); 1689 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EPERM); 1690 1691 /* Variation clean up */ 1692 } 1693 1694 /* 1695 * TEST : dm_downgrade_right - DM_RIGHT_SHARED 1696 * EXPECTED: rc = -1, errno = EPERM 1697 */ 1698 if (DMVAR_EXEC(DOWNGRADE_RIGHT_BASE + 6)) { 1699 1700 /* Variation set up */ 1701 rc = dm_request_right(sid, hanp, hlen, token, 0, 1702 DM_RIGHT_SHARED); 1703 if (rc == -1) { 1704 DMLOG_PRINT(DMLVL_DEBUG, 1705 "Unable to set up variation! (errno = %d)\n", 1706 errno); 1707 DMVAR_SKIP(); 1708 } else { 1709 /* Variation */ 1710 DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_RIGHT_SHARED)\n", 1711 szFuncName); 1712 rc = dm_downgrade_right(sid, hanp, hlen, token); 1713 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EPERM); 1714 1715 /* Variation clean up */ 1716 rc = dm_release_right(sid, hanp, hlen, token); 1717 if (rc == -1) { 1718 DMLOG_PRINT(DMLVL_DEBUG, 1719 "Unable to clean up variation! (errno = %d)\n", 1720 errno); 1721 } 1722 } 1723 } 1724 1725 /* 1726 * TEST : dm_downgrade_right - DM_RIGHT_EXCL 1727 * EXPECTED: rc = 0 1728 */ 1729 if (DMVAR_EXEC(DOWNGRADE_RIGHT_BASE + 7)) { 1730 1731 /* Variation set up */ 1732 rc = dm_request_right(sid, hanp, hlen, token, 0, DM_RIGHT_EXCL); 1733 if (rc == -1) { 1734 DMLOG_PRINT(DMLVL_DEBUG, 1735 "Unable to set up variation! (errno = %d)\n", 1736 errno); 1737 DMVAR_SKIP(); 1738 } else { 1739 /* Variation */ 1740 DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_RIGHT_EXCL)\n", 1741 szFuncName); 1742 rc = dm_downgrade_right(sid, hanp, hlen, token); 1743 DMVAR_ENDPASSEXP(szFuncName, 0, rc); 1744 1745 /* Variation clean up */ 1746 rc = dm_release_right(sid, hanp, hlen, token); 1747 if (rc == -1) { 1748 DMLOG_PRINT(DMLVL_DEBUG, 1749 "Unable to clean up variation! (errno = %d)\n", 1750 errno); 1751 } 1752 } 1753 } 1754 1755 /* 1756 * TEST : dm_downgrade_right - DM_NO_SESSION sid 1757 * EXPECTED: rc = -1, errno = EINVAL 1758 */ 1759 if (DMVAR_EXEC(DOWNGRADE_RIGHT_BASE + 8)) { 1760 1761 /* Variation set up */ 1762 rc = dm_request_right(sid, hanp, hlen, token, 0, 1763 DM_RIGHT_SHARED); 1764 if (rc == -1) { 1765 DMLOG_PRINT(DMLVL_DEBUG, 1766 "Unable to set up variation! (errno = %d)\n", 1767 errno); 1768 DMVAR_SKIP(); 1769 } else { 1770 /* Variation */ 1771 DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n", 1772 szFuncName); 1773 rc = dm_downgrade_right(DM_NO_SESSION, hanp, hlen, 1774 token); 1775 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); 1776 1777 /* Variation clean up */ 1778 rc = dm_release_right(sid, hanp, hlen, token); 1779 if (rc == -1) { 1780 DMLOG_PRINT(DMLVL_DEBUG, 1781 "Unable to clean up variation! (errno = %d)\n", 1782 errno); 1783 } 1784 } 1785 } 1786 1787 /* 1788 * TEST : dm_downgrade_right - global handle 1789 * EXPECTED: rc = -1, errno = EBADF 1790 */ 1791 if (DMVAR_EXEC(DOWNGRADE_RIGHT_BASE + 9)) { 1792 1793 /* Variation set up */ 1794 rc = dm_request_right(sid, hanp, hlen, token, 0, 1795 DM_RIGHT_SHARED); 1796 if (rc == -1) { 1797 DMLOG_PRINT(DMLVL_DEBUG, 1798 "Unable to set up variation! (errno = %d)\n", 1799 errno); 1800 DMVAR_SKIP(); 1801 } else { 1802 /* Variation */ 1803 DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n", 1804 szFuncName); 1805 rc = dm_downgrade_right(sid, DM_GLOBAL_HANP, 1806 DM_GLOBAL_HLEN, token); 1807 DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF); 1808 1809 /* Variation clean up */ 1810 rc = dm_release_right(sid, hanp, hlen, token); 1811 if (rc == -1) { 1812 DMLOG_PRINT(DMLVL_DEBUG, 1813 "Unable to clean up variation! (errno = %d)\n", 1814 errno); 1815 } 1816 } 1817 } 1818 1819 /* 1820 * TEST : dm_downgrade_right - file handle 1821 * EXPECTED: rc = 0 1822 */ 1823 if (DMVAR_EXEC(DOWNGRADE_RIGHT_BASE + 10)) { 1824 void *fhanp; 1825 size_t fhlen; 1826 1827 /* Variation set up */ 1828 if ((rc = dm_fd_to_handle(fd_f, &fhanp, &fhlen)) == -1) { 1829 /* No clean up */ 1830 } else 1831 if ((rc = 1832 dm_request_right(sid, fhanp, fhlen, token, 0, 1833 DM_RIGHT_EXCL)) == -1) { 1834 dm_handle_free(fhanp, fhlen); 1835 } 1836 if (rc == -1) { 1837 DMLOG_PRINT(DMLVL_DEBUG, 1838 "Unable to set up variation! (errno = %d)\n", 1839 errno); 1840 DMVAR_SKIP(); 1841 } else { 1842 /* Variation */ 1843 DMLOG_PRINT(DMLVL_DEBUG, "%s(file handle)\n", 1844 szFuncName); 1845 rc = dm_downgrade_right(sid, fhanp, fhlen, token); 1846 DMVAR_ENDPASSEXP(szFuncName, 0, rc); 1847 1848 /* Variation clean up */ 1849 rc = dm_release_right(sid, fhanp, fhlen, token); 1850 if (rc == -1) { 1851 DMLOG_PRINT(DMLVL_DEBUG, 1852 "Unable to clean up variation! (errno = %d)\n", 1853 errno); 1854 } 1855 dm_handle_free(fhanp, fhlen); 1856 } 1857 } 1858 1859 /* 1860 * TEST : dm_downgrade_right - fs handle 1861 * EXPECTED: rc = 0 1862 */ 1863 if (DMVAR_EXEC(DOWNGRADE_RIGHT_BASE + 11)) { 1864 void *fshanp; 1865 size_t fshlen; 1866 1867 /* Variation set up */ 1868 if ((rc = 1869 dm_path_to_fshandle(DummyFile, &fshanp, &fshlen)) == -1) { 1870 /* No clean up */ 1871 } else 1872 if ((rc = 1873 dm_request_right(sid, fshanp, fshlen, token, 0, 1874 DM_RIGHT_EXCL)) == -1) { 1875 dm_handle_free(fshanp, fshlen); 1876 } 1877 if (rc == -1) { 1878 DMLOG_PRINT(DMLVL_DEBUG, 1879 "Unable to set up variation! (errno = %d)\n", 1880 errno); 1881 DMVAR_SKIP(); 1882 } else { 1883 /* Variation */ 1884 DMLOG_PRINT(DMLVL_DEBUG, "%s(fs handle)\n", szFuncName); 1885 rc = dm_downgrade_right(sid, fshanp, fshlen, token); 1886 DMVAR_ENDPASSEXP(szFuncName, 0, rc); 1887 1888 /* Variation clean up */ 1889 rc = dm_release_right(sid, fshanp, fshlen, token); 1890 if (rc == -1) { 1891 DMLOG_PRINT(DMLVL_DEBUG, 1892 "Unable to clean up variation! (errno = %d)\n", 1893 errno); 1894 } 1895 dm_handle_free(fshanp, fshlen); 1896 } 1897 } 1898 1899 } 1900 1901 void *Thread(void *parm) 1902 { 1903 int rc; 1904 size_t dmMsgBufLen; 1905 dm_eventmsg_t *dmMsg; 1906 int bMounted = DM_FALSE; 1907 dm_eventtype_t type; 1908 dm_token_t token; 1909 dm_eventset_t events; 1910 dm_response_t response; 1911 1912 do { 1913 /* Loop until message received (wait could be interrupted) */ 1914 do { 1915 DMLOG_PRINT(DMLVL_DEBUG, "Waiting for event...\n"); 1916 dmMsgBufLen = 0; 1917 1918 rc = dm_get_events(sid, 1, DM_EV_WAIT, sizeof(dmMsgBuf), 1919 dmMsgBuf, &dmMsgBufLen); 1920 DMLOG_PRINT(DMLVL_DEBUG, 1921 "... dm_get_events returned %d (errno %d)\n", 1922 rc, errno); 1923 } while ((rc == -1) && (errno == EINTR) && (dmMsgBufLen == 0)); 1924 1925 if (rc) { 1926 DMLOG_PRINT(DMLVL_ERR, 1927 "dm_get_events failed with rc = %d, errno = %d\n", 1928 rc, errno); 1929 dm_destroy_session(sid); 1930 DM_EXIT(); 1931 } else { 1932 dmMsg = (dm_eventmsg_t *) dmMsgBuf; 1933 token = dmMsg->ev_token; 1934 type = dmMsg->ev_type; 1935 1936 DMLOG_PRINT(DMLVL_DEBUG, "Received message %d\n", type); 1937 } 1938 1939 if (type == DM_EVENT_MOUNT) { 1940 /* SPECIAL CASE: need to set disposition, events and response */ 1941 dm_mount_event_t *me = 1942 DM_GET_VALUE(dmMsg, ev_data, dm_mount_event_t *); 1943 void *lhanp = DM_GET_VALUE(me, me_handle1, void *); 1944 size_t lhlen = DM_GET_LEN(me, me_handle1); 1945 1946 DMLOG_PRINT(DMLVL_DEBUG, "Message is DM_EVENT_MOUNT\n"); 1947 DMLOG_PRINT(DMLVL_DEBUG, " Mode: %x\n", me->me_mode); 1948 DMLOG_PRINT(DMLVL_DEBUG, " File system handle: %p\n", 1949 lhanp); 1950 DMLOG_PRINT(DMLVL_DEBUG, 1951 " File system handle length: %d\n", lhlen); 1952 DMLOG_PRINT(DMLVL_DEBUG, " Mountpoint handle: %p\n", 1953 DM_GET_VALUE(me, me_handle2, void *)); 1954 DMLOG_PRINT(DMLVL_DEBUG, 1955 " Mountpoint handle length: %d\n", 1956 DM_GET_LEN(me, me_handle2)); 1957 DMLOG_PRINT(DMLVL_DEBUG, " Mountpoint path: %s\n", 1958 DM_GET_VALUE(me, me_name1, char *)); 1959 DMLOG_PRINT(DMLVL_DEBUG, " Media designator: %s\n", 1960 DM_GET_VALUE(me, me_name2, char *)); 1961 DMLOG_PRINT(DMLVL_DEBUG, " Root handle: %p\n", 1962 DM_GET_VALUE(me, me_roothandle, void *)); 1963 DMLOG_PRINT(DMLVL_DEBUG, " Root handle length: %d\n", 1964 DM_GET_LEN(me, me_roothandle)); 1965 1966 bMounted = dm_handle_is_valid(lhanp, lhlen); 1967 1968 rc = dm_request_right(sid, lhanp, lhlen, token, 1969 DM_RR_WAIT, DM_RIGHT_EXCL); 1970 if (rc == -1) { 1971 DMLOG_PRINT(DMLVL_ERR, 1972 "dm_request_right failed! (rc = %d, errno = %d)\n", 1973 rc, errno); 1974 dm_destroy_session(sid); 1975 DM_EXIT(); 1976 } 1977 1978 DMEV_ZERO(events); 1979 DMEV_SET(DM_EVENT_PREUNMOUNT, events); 1980 DMEV_SET(DM_EVENT_UNMOUNT, events); 1981 DMEV_SET(DM_EVENT_CREATE, events); 1982 rc = dm_set_disp(sid, lhanp, lhlen, token, &events, 1983 DM_EVENT_MAX); 1984 if (rc == -1) { 1985 DMLOG_PRINT(DMLVL_ERR, 1986 "dm_set_disp failed! (rc = %d, errno = %d)\n", 1987 rc, errno); 1988 dm_destroy_session(sid); 1989 DM_EXIT(); 1990 } 1991 1992 rc = dm_set_eventlist(sid, lhanp, lhlen, token, &events, 1993 DM_EVENT_MAX); 1994 if (rc == -1) { 1995 DMLOG_PRINT(DMLVL_ERR, 1996 "dm_set_eventlist failed! (rc = %d, errno = %d)\n", 1997 rc, errno); 1998 dm_destroy_session(sid); 1999 DM_EXIT(); 2000 } 2001 2002 rc = dm_release_right(sid, lhanp, lhlen, token); 2003 if (rc == -1) { 2004 DMLOG_PRINT(DMLVL_ERR, 2005 "dm_request_right failed! (rc = %d, errno = %d)\n", 2006 rc, errno); 2007 dm_destroy_session(sid); 2008 DM_EXIT(); 2009 } 2010 2011 response = DM_RESP_CONTINUE; 2012 } else if (type == DM_EVENT_UNMOUNT) { 2013 dm_namesp_event_t *nse = 2014 DM_GET_VALUE(dmMsg, ev_data, dm_namesp_event_t *); 2015 if (nse->ne_retcode == 0) { 2016 bMounted = DM_FALSE; 2017 } 2018 2019 response = DM_RESP_CONTINUE; 2020 } else if (type == DM_EVENT_CREATE) { 2021 dm_namesp_event_t *nse = 2022 DM_GET_VALUE(dmMsg, ev_data, dm_namesp_event_t *); 2023 void *hanp = DM_GET_VALUE(nse, ne_handle1, void *); 2024 size_t hlen = DM_GET_LEN(nse, ne_handle1); 2025 2026 if (runTestOnCreate) { 2027 DoTest(token, hanp, hlen); 2028 } 2029 2030 response = DM_RESP_CONTINUE; 2031 } else { 2032 switch (type) { 2033 case DM_EVENT_PREUNMOUNT: 2034 response = DM_RESP_CONTINUE; 2035 break; 2036 2037 default: 2038 { 2039 DMLOG_PRINT(DMLVL_ERR, 2040 "Message is unexpected!\n"); 2041 response = DM_RESP_ABORT; 2042 break; 2043 } 2044 } 2045 } 2046 2047 if (response != DM_RESP_INVALID) { 2048 DMLOG_PRINT(DMLVL_DEBUG, 2049 "Responding to message %d with %d\n", type, 2050 response); 2051 rc = dm_respond_event(sid, token, response, 2052 response == 2053 DM_RESP_ABORT ? ABORT_ERRNO : 0, 2054 0, NULL); 2055 } 2056 } while (bMounted); 2057 2058 pthread_exit(0); 2059 } 2060