Changeset 37791 in vbox
- Timestamp:
- Jul 6, 2011 9:14:14 AM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/common/VBoxService/VBoxServiceToolBox.cpp
r37405 r37791 401 401 402 402 /** 403 * Prints information (based on given flags) of a file system object (file/directory/...) 404 * to stdout. 405 * 406 * @return IPRT status code. 407 * @param pszName Object name. 408 * @param cbName Size of object name. 409 * @param uFlags Output / handling flags. 410 * @param pObjInfo Pointer to object information. 411 */ 412 static int VBoxServiceToolboxLsPrintFsInfo(const char *pszName, uint16_t cbName, uint32_t uFlags, 413 PRTFSOBJINFO pObjInfo) 414 { 415 AssertPtrReturn(pszName, VERR_INVALID_POINTER); 416 AssertReturn(cbName, VERR_INVALID_PARAMETER); 417 AssertPtrReturn(pObjInfo, VERR_INVALID_POINTER); 418 419 RTFMODE fMode = pObjInfo->Attr.fMode; 420 char cFileType; 421 switch (fMode & RTFS_TYPE_MASK) 422 { 423 case RTFS_TYPE_FIFO: cFileType = 'f'; break; 424 case RTFS_TYPE_DEV_CHAR: cFileType = 'c'; break; 425 case RTFS_TYPE_DIRECTORY: cFileType = 'd'; break; 426 case RTFS_TYPE_DEV_BLOCK: cFileType = 'b'; break; 427 case RTFS_TYPE_FILE: cFileType = '-'; break; 428 case RTFS_TYPE_SYMLINK: cFileType = 'l'; break; 429 case RTFS_TYPE_SOCKET: cFileType = 's'; break; 430 case RTFS_TYPE_WHITEOUT: cFileType = 'w'; break; 431 default: 432 cFileType = '?'; 433 break; 434 } 435 /** @todo sticy bits++ */ 436 437 if (!(uFlags & VBOXSERVICETOOLBOXLSFLAG_LONG)) 438 { 439 if (uFlags & VBOXSERVICETOOLBOXLSFLAG_PARSEABLE) 440 { 441 /** @todo Skip node_id if not present/available! */ 442 RTPrintf("ftype=%c%cnode_id=%RU64%cname_len=%RU16%cname=%s%c", 443 cFileType, 0, (uint64_t)pObjInfo->Attr.u.Unix.INodeId, 0, 444 cbName, 0, pszName, 0); 445 } 446 else 447 RTPrintf("%c %#18llx %3d %s\n", (uint64_t)pObjInfo->Attr.u.Unix.INodeId, 448 cFileType, cbName, pszName); 449 450 if (uFlags & VBOXSERVICETOOLBOXLSFLAG_PARSEABLE) /* End of data block. */ 451 RTPrintf("%c%c", 0, 0); 452 } 453 else 454 { 455 if (uFlags & VBOXSERVICETOOLBOXLSFLAG_PARSEABLE) 456 { 457 RTPrintf("ftype=%c%c", cFileType, 0); 458 RTPrintf("owner_mask=%c%c%c%c", 459 fMode & RTFS_UNIX_IRUSR ? 'r' : '-', 460 fMode & RTFS_UNIX_IWUSR ? 'w' : '-', 461 fMode & RTFS_UNIX_IXUSR ? 'x' : '-', 0); 462 RTPrintf("group_mask=%c%c%c%c", 463 fMode & RTFS_UNIX_IRGRP ? 'r' : '-', 464 fMode & RTFS_UNIX_IWGRP ? 'w' : '-', 465 fMode & RTFS_UNIX_IXGRP ? 'x' : '-', 0); 466 RTPrintf("other_mask=%c%c%c%c", 467 fMode & RTFS_UNIX_IROTH ? 'r' : '-', 468 fMode & RTFS_UNIX_IWOTH ? 'w' : '-', 469 fMode & RTFS_UNIX_IXOTH ? 'x' : '-', 0); 470 RTPrintf("dos_mask=%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c", 471 fMode & RTFS_DOS_READONLY ? 'R' : '-', 472 fMode & RTFS_DOS_HIDDEN ? 'H' : '-', 473 fMode & RTFS_DOS_SYSTEM ? 'S' : '-', 474 fMode & RTFS_DOS_DIRECTORY ? 'D' : '-', 475 fMode & RTFS_DOS_ARCHIVED ? 'A' : '-', 476 fMode & RTFS_DOS_NT_DEVICE ? 'd' : '-', 477 fMode & RTFS_DOS_NT_NORMAL ? 'N' : '-', 478 fMode & RTFS_DOS_NT_TEMPORARY ? 'T' : '-', 479 fMode & RTFS_DOS_NT_SPARSE_FILE ? 'P' : '-', 480 fMode & RTFS_DOS_NT_REPARSE_POINT ? 'J' : '-', 481 fMode & RTFS_DOS_NT_COMPRESSED ? 'C' : '-', 482 fMode & RTFS_DOS_NT_OFFLINE ? 'O' : '-', 483 fMode & RTFS_DOS_NT_NOT_CONTENT_INDEXED ? 'I' : '-', 484 fMode & RTFS_DOS_NT_ENCRYPTED ? 'E' : '-', 0); 485 486 char szTimeBirth[256]; 487 RTTimeSpecToString(&pObjInfo->BirthTime, szTimeBirth, sizeof(szTimeBirth)); 488 char szTimeChange[256]; 489 RTTimeSpecToString(&pObjInfo->ChangeTime, szTimeChange, sizeof(szTimeChange)); 490 char szTimeModification[256]; 491 RTTimeSpecToString(&pObjInfo->ModificationTime, szTimeModification, sizeof(szTimeModification)); 492 char szTimeAccess[256]; 493 RTTimeSpecToString(&pObjInfo->AccessTime, szTimeAccess, sizeof(szTimeAccess)); 494 495 RTPrintf("hlinks=%RU32%cuid=%RU32%cgid=%RU32%cst_size=%RI64%calloc=%RI64%c" 496 "st_birthtime=%s%cst_ctime=%s%cst_mtime=%s%cst_atime=%s%c", 497 pObjInfo->Attr.u.Unix.cHardlinks, 0, 498 pObjInfo->Attr.u.Unix.uid, 0, 499 pObjInfo->Attr.u.Unix.gid, 0, 500 pObjInfo->cbObject, 0, 501 pObjInfo->cbAllocated, 0, 502 szTimeBirth, 0, 503 szTimeChange, 0, 504 szTimeModification, 0, 505 szTimeAccess, 0); 506 RTPrintf("cname_len=%RU16%cname=%s%c", 507 cbName, 0, pszName, 0); 508 509 /* End of data block. */ 510 RTPrintf("%c%c", 0, 0); 511 } 512 else 513 { 514 RTPrintf("%c", cFileType); 515 RTPrintf("%c%c%c", 516 fMode & RTFS_UNIX_IRUSR ? 'r' : '-', 517 fMode & RTFS_UNIX_IWUSR ? 'w' : '-', 518 fMode & RTFS_UNIX_IXUSR ? 'x' : '-'); 519 RTPrintf("%c%c%c", 520 fMode & RTFS_UNIX_IRGRP ? 'r' : '-', 521 fMode & RTFS_UNIX_IWGRP ? 'w' : '-', 522 fMode & RTFS_UNIX_IXGRP ? 'x' : '-'); 523 RTPrintf("%c%c%c", 524 fMode & RTFS_UNIX_IROTH ? 'r' : '-', 525 fMode & RTFS_UNIX_IWOTH ? 'w' : '-', 526 fMode & RTFS_UNIX_IXOTH ? 'x' : '-'); 527 RTPrintf(" %c%c%c%c%c%c%c%c%c%c%c%c%c%c", 528 fMode & RTFS_DOS_READONLY ? 'R' : '-', 529 fMode & RTFS_DOS_HIDDEN ? 'H' : '-', 530 fMode & RTFS_DOS_SYSTEM ? 'S' : '-', 531 fMode & RTFS_DOS_DIRECTORY ? 'D' : '-', 532 fMode & RTFS_DOS_ARCHIVED ? 'A' : '-', 533 fMode & RTFS_DOS_NT_DEVICE ? 'd' : '-', 534 fMode & RTFS_DOS_NT_NORMAL ? 'N' : '-', 535 fMode & RTFS_DOS_NT_TEMPORARY ? 'T' : '-', 536 fMode & RTFS_DOS_NT_SPARSE_FILE ? 'P' : '-', 537 fMode & RTFS_DOS_NT_REPARSE_POINT ? 'J' : '-', 538 fMode & RTFS_DOS_NT_COMPRESSED ? 'C' : '-', 539 fMode & RTFS_DOS_NT_OFFLINE ? 'O' : '-', 540 fMode & RTFS_DOS_NT_NOT_CONTENT_INDEXED ? 'I' : '-', 541 fMode & RTFS_DOS_NT_ENCRYPTED ? 'E' : '-'); 542 RTPrintf(" %d %4d %4d %10lld %10lld %#llx %#llx %#llx %#llx", 543 pObjInfo->Attr.u.Unix.cHardlinks, 544 pObjInfo->Attr.u.Unix.uid, 545 pObjInfo->Attr.u.Unix.gid, 546 pObjInfo->cbObject, 547 pObjInfo->cbAllocated, 548 pObjInfo->BirthTime, 549 pObjInfo->ChangeTime, 550 pObjInfo->ModificationTime, 551 pObjInfo->AccessTime); 552 RTPrintf(" %2d %s\n", cbName, pszName); 553 } 554 } 555 556 return VINF_SUCCESS; 557 } 558 559 560 /** 403 561 * Helper routine for ls tool doing the actual parsing and output of 404 562 * a specified directory. … … 408 566 * @param uFlags Flags of type VBOXSERVICETOOLBOXLSFLAG. 409 567 */ 410 static int VBoxServiceToolboxLs Output(const char *pszDir, uint32_t uFlags)568 static int VBoxServiceToolboxLsHandleDir(const char *pszDir, uint32_t uFlags) 411 569 { 412 570 AssertPtrReturn(pszDir, VERR_INVALID_PARAMETER); … … 474 632 RTListForEach(&dirList, pNodeIt, VBOXSERVICETOOLBOXDIRENTRY, Node) 475 633 { 476 RTFMODE fMode = pNodeIt->dirEntry.Info.Attr.fMode; 477 char cFileType; 478 switch (fMode & RTFS_TYPE_MASK) 479 { 480 case RTFS_TYPE_FIFO: cFileType = 'f'; break; 481 case RTFS_TYPE_DEV_CHAR: cFileType = 'c'; break; 482 case RTFS_TYPE_DIRECTORY: cFileType = 'd'; break; 483 case RTFS_TYPE_DEV_BLOCK: cFileType = 'b'; break; 484 case RTFS_TYPE_FILE: cFileType = '-'; break; 485 case RTFS_TYPE_SYMLINK: cFileType = 'l'; break; 486 case RTFS_TYPE_SOCKET: cFileType = 's'; break; 487 case RTFS_TYPE_WHITEOUT: cFileType = 'w'; break; 488 default: 489 cFileType = '?'; 490 break; 491 } 492 /** @todo sticy bits++ */ 493 494 if (!(uFlags & VBOXSERVICETOOLBOXLSFLAG_LONG)) 495 { 496 if (uFlags & VBOXSERVICETOOLBOXLSFLAG_PARSEABLE) 497 { 498 /** @todo Skip node_id if not present/available! */ 499 RTPrintf("ftype=%c%cnode_id=%RU64%cname_len=%RU16%cname=%s%c", 500 cFileType, 0, (uint64_t)pNodeIt->dirEntry.Info.Attr.u.Unix.INodeId, 0, 501 pNodeIt->dirEntry.cbName, 0, pNodeIt->dirEntry.szName, 0); 502 } 503 else 504 RTPrintf("%c %#18llx %3d %s\n", (uint64_t)pNodeIt->dirEntry.Info.Attr.u.Unix.INodeId, 505 cFileType, pNodeIt->dirEntry.cbName, pNodeIt->dirEntry.szName); 506 507 if (uFlags & VBOXSERVICETOOLBOXLSFLAG_PARSEABLE) /* End of data block. */ 508 RTPrintf("%c%c", 0, 0); 509 } 510 else 511 { 512 if (uFlags & VBOXSERVICETOOLBOXLSFLAG_PARSEABLE) 513 { 514 RTPrintf("ftype=%c%c", cFileType, 0); 515 RTPrintf("owner_mask=%c%c%c%c", 516 fMode & RTFS_UNIX_IRUSR ? 'r' : '-', 517 fMode & RTFS_UNIX_IWUSR ? 'w' : '-', 518 fMode & RTFS_UNIX_IXUSR ? 'x' : '-', 0); 519 RTPrintf("group_mask=%c%c%c%c", 520 fMode & RTFS_UNIX_IRGRP ? 'r' : '-', 521 fMode & RTFS_UNIX_IWGRP ? 'w' : '-', 522 fMode & RTFS_UNIX_IXGRP ? 'x' : '-', 0); 523 RTPrintf("other_mask=%c%c%c%c", 524 fMode & RTFS_UNIX_IROTH ? 'r' : '-', 525 fMode & RTFS_UNIX_IWOTH ? 'w' : '-', 526 fMode & RTFS_UNIX_IXOTH ? 'x' : '-', 0); 527 RTPrintf("dos_mask=%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c", 528 fMode & RTFS_DOS_READONLY ? 'R' : '-', 529 fMode & RTFS_DOS_HIDDEN ? 'H' : '-', 530 fMode & RTFS_DOS_SYSTEM ? 'S' : '-', 531 fMode & RTFS_DOS_DIRECTORY ? 'D' : '-', 532 fMode & RTFS_DOS_ARCHIVED ? 'A' : '-', 533 fMode & RTFS_DOS_NT_DEVICE ? 'd' : '-', 534 fMode & RTFS_DOS_NT_NORMAL ? 'N' : '-', 535 fMode & RTFS_DOS_NT_TEMPORARY ? 'T' : '-', 536 fMode & RTFS_DOS_NT_SPARSE_FILE ? 'P' : '-', 537 fMode & RTFS_DOS_NT_REPARSE_POINT ? 'J' : '-', 538 fMode & RTFS_DOS_NT_COMPRESSED ? 'C' : '-', 539 fMode & RTFS_DOS_NT_OFFLINE ? 'O' : '-', 540 fMode & RTFS_DOS_NT_NOT_CONTENT_INDEXED ? 'I' : '-', 541 fMode & RTFS_DOS_NT_ENCRYPTED ? 'E' : '-', 0); 542 543 char szTimeBirth[256]; 544 RTTimeSpecToString(&pNodeIt->dirEntry.Info.BirthTime, szTimeBirth, sizeof(szTimeBirth)); 545 char szTimeChange[256]; 546 RTTimeSpecToString(&pNodeIt->dirEntry.Info.ChangeTime, szTimeChange, sizeof(szTimeChange)); 547 char szTimeModification[256]; 548 RTTimeSpecToString(&pNodeIt->dirEntry.Info.ModificationTime, szTimeModification, sizeof(szTimeModification)); 549 char szTimeAccess[256]; 550 RTTimeSpecToString(&pNodeIt->dirEntry.Info.AccessTime, szTimeAccess, sizeof(szTimeAccess)); 551 552 RTPrintf("hlinks=%RU32%cuid=%RU32%cgid=%RU32%cst_size=%RI64%calloc=%RI64%c" 553 "st_birthtime=%s%cst_ctime=%s%cst_mtime=%s%cst_atime=%s%c", 554 pNodeIt->dirEntry.Info.Attr.u.Unix.cHardlinks, 0, 555 pNodeIt->dirEntry.Info.Attr.u.Unix.uid, 0, 556 pNodeIt->dirEntry.Info.Attr.u.Unix.gid, 0, 557 pNodeIt->dirEntry.Info.cbObject, 0, 558 pNodeIt->dirEntry.Info.cbAllocated, 0, 559 szTimeBirth, 0, 560 szTimeChange, 0, 561 szTimeModification, 0, 562 szTimeAccess, 0); 563 RTPrintf("cname_len=%RU16%cname=%s%c", 564 pNodeIt->dirEntry.cbName, 0, pNodeIt->dirEntry.szName, 0); 565 566 /* End of data block. */ 567 RTPrintf("%c%c", 0, 0); 568 } 569 else 570 { 571 RTPrintf("%c", cFileType); 572 RTPrintf("%c%c%c", 573 fMode & RTFS_UNIX_IRUSR ? 'r' : '-', 574 fMode & RTFS_UNIX_IWUSR ? 'w' : '-', 575 fMode & RTFS_UNIX_IXUSR ? 'x' : '-'); 576 RTPrintf("%c%c%c", 577 fMode & RTFS_UNIX_IRGRP ? 'r' : '-', 578 fMode & RTFS_UNIX_IWGRP ? 'w' : '-', 579 fMode & RTFS_UNIX_IXGRP ? 'x' : '-'); 580 RTPrintf("%c%c%c", 581 fMode & RTFS_UNIX_IROTH ? 'r' : '-', 582 fMode & RTFS_UNIX_IWOTH ? 'w' : '-', 583 fMode & RTFS_UNIX_IXOTH ? 'x' : '-'); 584 RTPrintf(" %c%c%c%c%c%c%c%c%c%c%c%c%c%c", 585 fMode & RTFS_DOS_READONLY ? 'R' : '-', 586 fMode & RTFS_DOS_HIDDEN ? 'H' : '-', 587 fMode & RTFS_DOS_SYSTEM ? 'S' : '-', 588 fMode & RTFS_DOS_DIRECTORY ? 'D' : '-', 589 fMode & RTFS_DOS_ARCHIVED ? 'A' : '-', 590 fMode & RTFS_DOS_NT_DEVICE ? 'd' : '-', 591 fMode & RTFS_DOS_NT_NORMAL ? 'N' : '-', 592 fMode & RTFS_DOS_NT_TEMPORARY ? 'T' : '-', 593 fMode & RTFS_DOS_NT_SPARSE_FILE ? 'P' : '-', 594 fMode & RTFS_DOS_NT_REPARSE_POINT ? 'J' : '-', 595 fMode & RTFS_DOS_NT_COMPRESSED ? 'C' : '-', 596 fMode & RTFS_DOS_NT_OFFLINE ? 'O' : '-', 597 fMode & RTFS_DOS_NT_NOT_CONTENT_INDEXED ? 'I' : '-', 598 fMode & RTFS_DOS_NT_ENCRYPTED ? 'E' : '-'); 599 RTPrintf(" %d %4d %4d %10lld %10lld %#llx %#llx %#llx %#llx", 600 pNodeIt->dirEntry.Info.Attr.u.Unix.cHardlinks, 601 pNodeIt->dirEntry.Info.Attr.u.Unix.uid, 602 pNodeIt->dirEntry.Info.Attr.u.Unix.gid, 603 pNodeIt->dirEntry.Info.cbObject, 604 pNodeIt->dirEntry.Info.cbAllocated, 605 pNodeIt->dirEntry.Info.BirthTime, 606 pNodeIt->dirEntry.Info.ChangeTime, 607 pNodeIt->dirEntry.Info.ModificationTime, 608 pNodeIt->dirEntry.Info.AccessTime); 609 RTPrintf(" %2d %s\n", pNodeIt->dirEntry.cbName, pNodeIt->dirEntry.szName); 610 } 611 } 634 rc = VBoxServiceToolboxLsPrintFsInfo(pNodeIt->dirEntry.szName, pNodeIt->dirEntry.cbName, 635 uFlags, 636 &pNodeIt->dirEntry.Info); 612 637 if (RT_FAILURE(rc)) 613 break;638 break; 614 639 } 615 640 … … 643 668 pszDir, pNodeIt->dirEntry.szName); 644 669 if (RT_SUCCESS(rc)) 645 rc = VBoxServiceToolboxLs Output(szPath, uFlags);670 rc = VBoxServiceToolboxLsHandleDir(szPath, uFlags); 646 671 } 647 672 break; … … 781 806 RTListForEach(&fileList, pNodeIt, VBOXSERVICETOOLBOXPATHENTRY, Node) 782 807 { 783 rc = VBoxServiceToolboxLsOutput(pNodeIt->pszName, fFlags); 808 if (RTFileExists(pNodeIt->pszName)) 809 { 810 RTFILE file; 811 rc = RTFileOpen(&file, pNodeIt->pszName, RTFILE_O_OPEN | RTFILE_O_DENY_NONE | RTFILE_O_READ); 812 if (RT_SUCCESS(rc)) 813 { 814 RTFSOBJINFO objInfo; 815 rc = RTFileQueryInfo(file, &objInfo, RTFSOBJATTRADD_UNIX); 816 if (RT_SUCCESS(rc)) 817 { 818 rc = VBoxServiceToolboxLsPrintFsInfo(pNodeIt->pszName, strlen(pNodeIt->pszName), 819 fFlags, &objInfo); 820 } 821 else 822 RTMsgError("ls: Unable to query information for '%s', rc=%Rrc\n", 823 pNodeIt->pszName, rc); 824 RTFileClose(file); 825 } 826 else 827 RTMsgError("ls: Failed opening '%s', rc=%Rrc\n", 828 pNodeIt->pszName, rc); 829 } 830 else 831 rc = VBoxServiceToolboxLsHandleDir(pNodeIt->pszName, fFlags); 784 832 if (RT_FAILURE(rc)) 785 RTMsgError("ls: Failed while enumerating directory'%s', rc=%Rrc\n",833 RTMsgError("ls: Failed while enumerating '%s', rc=%Rrc\n", 786 834 pNodeIt->pszName, rc); 787 835 }
Note:
See TracChangeset
for help on using the changeset viewer.

