VirtualBox

Changeset 37791 in vbox


Ignore:
Timestamp:
Jul 6, 2011 9:14:14 AM (13 years ago)
Author:
vboxsync
Message:

VBoxService/ls: Also handle single files, factored out actual printing routine.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxService/VBoxServiceToolBox.cpp

    r37405 r37791  
    401401
    402402/**
     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 */
     412static 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/**
    403561 * Helper routine for ls tool doing the actual parsing and output of
    404562 * a specified directory.
     
    408566 * @param   uFlags                  Flags of type VBOXSERVICETOOLBOXLSFLAG.
    409567 */
    410 static int VBoxServiceToolboxLsOutput(const char *pszDir, uint32_t uFlags)
     568static int VBoxServiceToolboxLsHandleDir(const char *pszDir, uint32_t uFlags)
    411569{
    412570    AssertPtrReturn(pszDir, VERR_INVALID_PARAMETER);
     
    474632        RTListForEach(&dirList, pNodeIt, VBOXSERVICETOOLBOXDIRENTRY, Node)
    475633        {
    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);
    612637            if (RT_FAILURE(rc))
    613                     break;
     638                break;
    614639        }
    615640
     
    643668                                            pszDir, pNodeIt->dirEntry.szName);
    644669                            if (RT_SUCCESS(rc))
    645                                 rc = VBoxServiceToolboxLsOutput(szPath, uFlags);
     670                                rc = VBoxServiceToolboxLsHandleDir(szPath, uFlags);
    646671                        }
    647672                        break;
     
    781806        RTListForEach(&fileList, pNodeIt, VBOXSERVICETOOLBOXPATHENTRY, Node)
    782807        {
    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);
    784832            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",
    786834                           pNodeIt->pszName, rc);
    787835        }
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette