VirtualBox

Changeset 69614 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Nov 8, 2017 12:58:04 PM (7 years ago)
Author:
vboxsync
Message:

RTLs: Quickly hacked up human readable size, owners and groups. Stack usage isn't optimal here...

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/tools/RTLs.cpp

    r69434 r69614  
    5656    /** Symbolic link target (allocated after the name). */
    5757    const char *pszTarget;
     58    /** Owner if applicable(allocated after the name). */
     59    const char *pszOwner;
     60    /** Group if applicable (allocated after the name). */
     61    const char *pszGroup;
    5862    /** The length of szName. */
    5963    size_t      cchName;
     
    529533static const char *rtCmdLsFormatSizeHumanReadable(PRTCMDLSOPTS pOpts, uint64_t cb, char *pszDst, size_t cbDst)
    530534{
    531     /** @todo human readable size formatting (IPRT?). */
    532     RT_NOREF(pOpts);
    533     RTStrFormatU64(pszDst, cbDst, cb, 10, 0, 0, 0);
     535    if (pOpts->fHumanReadableSizes)
     536    {
     537        static const struct
     538        {
     539            const char *pszSuffix;
     540            uint64_t    cbFactor;
     541            uint64_t    cbMin;
     542        } s_aUnits[] =
     543        {
     544            {  "E", _1E, _1E + _1E/2 },
     545            {  "P", _1P, _1P + _1P/2 },
     546            {  "T", _1T, _1T + _1T/2 },
     547            {  "G", _1G, _1G + _1G/2 },
     548            {  "M", _1M, _1M + _1M/2 },
     549            {  "k", _1K, _1K + _1K/2 },
     550
     551            {  "E", UINT64_C(1000000000000000000), UINT64_C(1010000000000000000),  },
     552            {  "P", UINT64_C(1000000000000000),    UINT64_C(1010000000000000),     },
     553            {  "T", UINT64_C(1000000000000),       UINT64_C(1010000000000),        },
     554            {  "G", UINT64_C(1000000000),          UINT64_C(1010000000),           },
     555            {  "M", UINT64_C(1000000),             UINT64_C(1010000),              },
     556            {  "K", UINT64_C(1000),                UINT64_C(1010),                 },
     557        };
     558        unsigned const iEnd = !pOpts->fSiUnits ? 6 : 12;
     559        for (unsigned i = !pOpts->fSiUnits ? 0 : 6; i < iEnd; i++)
     560            if (cb >= s_aUnits[i].cbMin)
     561            {
     562                RTStrFormatU64(pszDst, cbDst, cb / s_aUnits[i].cbFactor, 10, 0, 0, 0);
     563                RTStrCat(pszDst, cbDst, s_aUnits[i].pszSuffix);
     564                return pszDst;
     565            }
     566    }
     567    else if (pOpts->cbBlock)
     568        RTStrFormatU64(pszDst, cbDst, (cb + pOpts->cbBlock - 1) / pOpts->cbBlock, 10, 0, 0, 0);
     569    else
     570        RTStrFormatU64(pszDst, cbDst, cb, 10, 0, 0, 0);
    534571    return pszDst;
    535572}
     
    616653 * @param   pOpts           The options and state.
    617654 * @param   gid             The GID to format.
     655 * @param   pszOwner        The owner returned by the FS.
    618656 * @param   pszDst          The output buffer.
    619657 * @param   cbDst           The output buffer size.
    620658 */
    621 static const char *rtCmdLsDecimalFormatGroup(PRTCMDLSOPTS pOpts, RTGID gid, char *pszDst, size_t cbDst)
     659static const char *rtCmdLsDecimalFormatGroup(PRTCMDLSOPTS pOpts, RTGID gid, const char *pszGroup, char *pszDst, size_t cbDst)
    622660{
    623661    if (!pOpts->fNumericalIds)
    624662    {
    625         /** @todo resolve GIDs to names. */
     663        if (pszGroup)
     664        {
     665            RTStrCopy(pszDst, cbDst, pszGroup);
     666            return pszDst;
     667        }
    626668        if (gid == NIL_RTGID)
    627669            return "<Nil>";
     
    638680 * @param   pOpts           The options and state.
    639681 * @param   uid             The UID to format.
     682 * @param   pszOwner        The owner returned by the FS.
    640683 * @param   pszDst          The output buffer.
    641684 * @param   cbDst           The output buffer size.
    642685 */
    643 static const char *rtCmdLsDecimalFormatOwner(PRTCMDLSOPTS pOpts, RTUID uid, char *pszDst, size_t cbDst)
     686static const char *rtCmdLsDecimalFormatOwner(PRTCMDLSOPTS pOpts, RTUID uid, const char *pszOwner, char *pszDst, size_t cbDst)
    644687{
    645688    if (!pOpts->fNumericalIds)
    646689    {
    647         /** @todo resolve UIDs to names. */
     690        if (pszOwner)
     691        {
     692            RTStrCopy(pszDst, cbDst, pszOwner);
     693            return pszDst;
     694        }
    648695        if (uid == NIL_RTUID)
    649696            return "<Nil>";
     
    727774        if (pOpts->fShowOwner)
    728775        {
    729             rtCmdLsDecimalFormatOwner(pOpts, pEntry->Info.Attr.u.Unix.uid, pszTmp, cbTmp);
     776            rtCmdLsDecimalFormatOwner(pOpts, pEntry->Info.Attr.u.Unix.uid, pEntry->pszOwner, pszTmp, cbTmp);
    730777            cchTmp = strlen(pszTmp);
    731778            if (cchTmp > cchUidCol)
     
    735782        if (pOpts->fShowGroup)
    736783        {
    737             rtCmdLsDecimalFormatGroup(pOpts, pEntry->Info.Attr.u.Unix.gid, pszTmp, cbTmp);
     784            rtCmdLsDecimalFormatGroup(pOpts, pEntry->Info.Attr.u.Unix.gid, pEntry->pszGroup, pszTmp, cbTmp);
    738785            cchTmp = strlen(pszTmp);
    739786            if (cchTmp > cchGidCol)
     
    820867        RTPrintf(" %*u", cchLinkCol, pEntry->Info.Attr.u.Unix.cHardlinks);
    821868        if (cchUidCol)
    822             RTPrintf(" %*s", cchUidCol, rtCmdLsDecimalFormatOwner(pOpts, pEntry->Info.Attr.u.Unix.uid, pszTmp, cbTmp));
     869            RTPrintf(" %*s", cchUidCol,
     870                     rtCmdLsDecimalFormatOwner(pOpts, pEntry->Info.Attr.u.Unix.uid, pEntry->pszOwner, pszTmp, cbTmp));
    823871        if (cchGidCol)
    824             RTPrintf(" %*s", cchGidCol, rtCmdLsDecimalFormatGroup(pOpts, pEntry->Info.Attr.u.Unix.gid, pszTmp, cbTmp));
     872            RTPrintf(" %*s", cchGidCol,
     873                     rtCmdLsDecimalFormatGroup(pOpts, pEntry->Info.Attr.u.Unix.gid, pEntry->pszGroup, pszTmp, cbTmp));
    825874        RTPrintf(" %*s", cchSizeCol, rtCmdLsFormatSize(pOpts, pEntry->Info.cbObject, pszTmp, cbTmp));
    826875
     
    10301079 * @param   pszEntry            The entry name.
    10311080 * @param   pInfo               The entry info.
    1032  */
    1033 static RTEXITCODE rtCmdLsAddOne(PRTCMDLSCOLLECTION pCollection, const char *pszEntry, PRTFSOBJINFO pInfo)
    1034 {
     1081 * @param   pszOwner            The owner name if available, otherwise NULL.
     1082 * @param   pszGroup            The group anme if available, otherwise NULL.
     1083 * @param   pszTarget           The symbolic link target if applicable and
     1084 *                              available, otherwise NULL.
     1085 */
     1086static RTEXITCODE rtCmdLsAddOne(PRTCMDLSCOLLECTION pCollection, const char *pszEntry, PRTFSOBJINFO pInfo,
     1087                                const char *pszOwner, const char *pszGroup, const char *pszTarget)
     1088{
     1089
    10351090    /* Make sure there is space in the collection for the new entry. */
    10361091    if (pCollection->cEntries >= pCollection->cEntriesAllocated)
     
    10461101    /* Create and insert a new entry. */
    10471102    size_t const cchEntry = strlen(pszEntry);
    1048     PRTCMDLSENTRY pEntry = (PRTCMDLSENTRY)RTMemAlloc(RT_OFFSETOF(RTCMDLSENTRY, szName[cchEntry + 1]));
     1103    size_t const cbOwner  = pszOwner  ? strlen(pszOwner)  + 1 : 0;
     1104    size_t const cbGroup  = pszGroup  ? strlen(pszGroup)  + 1 : 0;
     1105    size_t const cbTarget = pszTarget ? strlen(pszTarget) + 1 : 0;
     1106    size_t const cbEntry  = RT_OFFSETOF(RTCMDLSENTRY, szName[cchEntry + 1 + cbOwner + cbGroup + cbTarget]);
     1107    PRTCMDLSENTRY pEntry = (PRTCMDLSENTRY)RTMemAlloc(cbEntry);
    10491108    if (pEntry)
    10501109    {
    10511110        pEntry->Info      = *pInfo;
    10521111        pEntry->pszTarget = NULL; /** @todo symbolic links. */
     1112        pEntry->pszOwner  = NULL;
     1113        pEntry->pszGroup  = NULL;
    10531114        pEntry->cchName   = cchEntry;
    10541115        memcpy(pEntry->szName, pszEntry, cchEntry);
    10551116        pEntry->szName[cchEntry] = '\0';
     1117
     1118        char *psz = &pEntry->szName[cchEntry + 1];
     1119        if (pszTarget)
     1120        {
     1121            pEntry->pszTarget = psz;
     1122            memcpy(psz, pszTarget, cbTarget);
     1123            psz += cbTarget;
     1124        }
     1125        if (pszOwner)
     1126        {
     1127            pEntry->pszOwner = psz;
     1128            memcpy(psz, pszOwner, cbOwner);
     1129            psz += cbOwner;
     1130        }
     1131        if (pszGroup)
     1132        {
     1133            pEntry->pszGroup = psz;
     1134            memcpy(psz, pszGroup, cbGroup);
     1135        }
    10561136
    10571137        pCollection->papEntries[pCollection->cEntries++] = pEntry;
     
    11531233        if (rtCmdLsIsFilteredOut(pOpts, pDirEntry->szName, &pDirEntry->Info))
    11541234            continue;
    1155         RTEXITCODE rcExit2 = rtCmdLsAddOne(pCollection, pDirEntry->szName, &pDirEntry->Info);
     1235
     1236
     1237        const char *pszOwner = NULL;
     1238        RTFSOBJINFO OwnerInfo;
     1239        if (pDirEntry->Info.Attr.u.Unix.uid != NIL_RTUID && pOpts->fShowOwner)
     1240        {
     1241            rc = RTVfsDirQueryPathInfo(hVfsDir, pDirEntry->szName, &OwnerInfo, RTFSOBJATTRADD_UNIX_OWNER, RTPATH_F_ON_LINK);
     1242            if (RT_SUCCESS(rc) && OwnerInfo.Attr.u.UnixOwner.szName[0])
     1243                pszOwner = &OwnerInfo.Attr.u.UnixOwner.szName[0];
     1244        }
     1245
     1246        const char *pszGroup = NULL;
     1247        RTFSOBJINFO GroupInfo;
     1248        if (pDirEntry->Info.Attr.u.Unix.gid != NIL_RTGID && pOpts->fShowGroup)
     1249        {
     1250            rc = RTVfsDirQueryPathInfo(hVfsDir, pDirEntry->szName, &GroupInfo, RTFSOBJATTRADD_UNIX_GROUP, RTPATH_F_ON_LINK);
     1251            if (RT_SUCCESS(rc) && GroupInfo.Attr.u.UnixGroup.szName[0])
     1252                pszGroup = &GroupInfo.Attr.u.UnixGroup.szName[0];
     1253        }
     1254
     1255        RTEXITCODE rcExit2 = rtCmdLsAddOne(pCollection, pDirEntry->szName, &pDirEntry->Info, pszOwner, pszGroup, NULL);
    11561256        if (rcExit2 != RTEXITCODE_SUCCESS)
    11571257            rcExit = rcExit2;
     
    12501350        if (   pOpts->cCollections > 0
    12511351            || rtCmdLsNewCollection(pOpts, "") != NULL)
    1252             return rtCmdLsAddOne(pOpts->papCollections[0], pszArg, &Info);
     1352        {
     1353            RTFSOBJINFO OwnerInfo;
     1354            if (Info.Attr.u.Unix.uid != NIL_RTUID && pOpts->fShowOwner)
     1355                rc = RTVfsChainQueryInfo(pszArg, &OwnerInfo, RTFSOBJATTRADD_UNIX_OWNER, fPath, NULL, NULL);
     1356            else
     1357                rc = VERR_NOT_SUPPORTED;
     1358            const char *pszOwner = RT_SUCCESS(rc) && OwnerInfo.Attr.u.UnixOwner.szName[0]
     1359                                 ? &OwnerInfo.Attr.u.UnixOwner.szName[0] : NULL;
     1360
     1361            RTFSOBJINFO GroupInfo;
     1362            if (Info.Attr.u.Unix.gid != NIL_RTGID && pOpts->fShowGroup)
     1363                rc = RTVfsChainQueryInfo(pszArg, &GroupInfo, RTFSOBJATTRADD_UNIX_GROUP, fPath, NULL, NULL);
     1364            else
     1365                rc = VERR_NOT_SUPPORTED;
     1366            const char *pszGroup = RT_SUCCESS(rc) && GroupInfo.Attr.u.UnixGroup.szName[0]
     1367                                 ? &GroupInfo.Attr.u.UnixGroup.szName[0] : NULL;
     1368
     1369            return rtCmdLsAddOne(pOpts->papCollections[0], pszArg, &Info, pszOwner, pszGroup, NULL);
     1370        }
    12531371        return RTEXITCODE_FAILURE;
    12541372    }
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