VirtualBox

Ignore:
Timestamp:
May 31, 2017 11:55:01 AM (8 years ago)
Author:
vboxsync
Message:

RTZipTarCmd: Added --use-push-file to test the RTVfsFsStrmPushFile API.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/zip/tarcmd.cpp

    r67134 r67167  
    6262#define RTZIPTARCMD_OPT_FORMAT              1009
    6363#define RTZIPTARCMD_OPT_READ_AHEAD          1010
     64#define RTZIPTARCMD_OPT_USE_PUSH_FILE       1011
    6465
    6566/** File format. */
     
    107108    /** Whether to add a read ahead thread. */
    108109    bool            fReadAhead;
     110    /** Use RTVfsFsStrmPushFile instead of RTVfsFsStrmAdd for files. */
     111    bool            fUsePushFile;
    109112    /** The compressor/decompressor method to employ (0, z or j). */
    110113    char            chZipper;
     
    190193 * @param   hVfsFss         The TAR filesystem stream handle.
    191194 * @param   pszSrc          The file path or VFS spec.
     195 * @param   paObjInfo[3]    Array of three FS object info structures.  The first
     196 *                          one is always filled with RTFSOBJATTRADD_UNIX info.
     197 *                          The next two may contain owner and group names if
     198 *                          available.  Buffers can be modified.
    192199 * @param   pszDst          The name to archive the file under.
    193200 * @param   pErrInfo        Error info buffer (saves stack space).
    194201 */
    195 static RTEXITCODE rtZipTarCmdArchiveFile(PRTZIPTARCMDOPS pOpts, RTVFSFSSTREAM hVfsFss,
    196                                          const char *pszSrc, const char *pszDst, PRTERRINFOSTATIC pErrInfo)
     202static RTEXITCODE rtZipTarCmdArchiveFile(PRTZIPTARCMDOPS pOpts, RTVFSFSSTREAM hVfsFss, const char *pszSrc,
     203                                         RTFSOBJINFO paObjInfo[3], const char *pszDst, PRTERRINFOSTATIC pErrInfo)
    197204{
    198205    if (pOpts->fVerbose)
     
    201208    /* Open the file. */
    202209    uint32_t        offError;
    203     RTVFSIOSTREAM   hVfsIos;
     210    RTVFSIOSTREAM   hVfsIosSrc;
    204211    int rc = RTVfsChainOpenIoStream(pszSrc, RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_NONE,
    205                                     &hVfsIos, &offError, RTErrInfoInitStatic(pErrInfo));
     212                                    &hVfsIosSrc, &offError, RTErrInfoInitStatic(pErrInfo));
    206213    if (RT_FAILURE(rc))
    207214        return RTVfsChainMsgErrorExitFailure("RTVfsChainOpenIoStream", pszSrc, rc, offError, &pErrInfo->Core);
    208215
    209216    /* I/O stream to base object. */
    210     RTVFSOBJ hVfsObj = RTVfsObjFromIoStream(hVfsIos);
    211     RTVfsIoStrmRelease(hVfsIos);
    212     if (hVfsObj == NIL_RTVFSOBJ)
    213         return RTMsgErrorExitFailure("RTVfsObjFromIoStream failed unexpectedly!");
    214 
    215     /* Add it to the stream. */
    216     rc = RTVfsFsStrmAdd(hVfsFss, pszDst, hVfsObj, 0 /*fFlags*/);
    217     RTVfsObjRelease(hVfsObj);
    218 
    219     if (RT_SUCCESS(rc))
    220     {
    221         if (rc != VINF_SUCCESS)
    222             RTMsgWarning("%Rrc adding '%s'", rc, pszDst);
    223         return RTEXITCODE_SUCCESS;
    224     }
    225     return RTMsgErrorExitFailure("%Rrc adding '%s'", rc, pszDst);
     217    RTVFSOBJ hVfsObjSrc = RTVfsObjFromIoStream(hVfsIosSrc);
     218    if (hVfsObjSrc != NIL_RTVFSOBJ)
     219    {
     220        /*
     221         * Add it to the stream.  Got to variants here so we can test the
     222         * RTVfsFsStrmPushFile API too.
     223         */
     224        if (!pOpts->fUsePushFile)
     225            rc = RTVfsFsStrmAdd(hVfsFss, pszDst, hVfsObjSrc, 0 /*fFlags*/);
     226        else
     227        {
     228            uint32_t cObjInfo = 1 + (paObjInfo[1].Attr.enmAdditional == RTFSOBJATTRADD_UNIX_OWNER)
     229                                  + (paObjInfo[2].Attr.enmAdditional == RTFSOBJATTRADD_UNIX_GROUP);
     230            RTVFSIOSTREAM hVfsIosDst;
     231            rc = RTVfsFsStrmPushFile(hVfsFss, pszDst, paObjInfo[0].cbObject, paObjInfo, cObjInfo, 0 /*fFlags*/, &hVfsIosDst);
     232            if (RT_SUCCESS(rc))
     233            {
     234                rc = RTVfsUtilPumpIoStreams(hVfsIosSrc, hVfsIosDst, 0);
     235                RTVfsIoStrmRelease(hVfsIosDst);
     236            }
     237        }
     238        RTVfsIoStrmRelease(hVfsIosSrc);
     239        RTVfsObjRelease(hVfsObjSrc);
     240
     241        if (RT_SUCCESS(rc))
     242        {
     243            if (rc != VINF_SUCCESS)
     244                RTMsgWarning("%Rrc adding '%s'", rc, pszDst);
     245            return RTEXITCODE_SUCCESS;
     246        }
     247        return RTMsgErrorExitFailure("%Rrc adding '%s'", rc, pszDst);
     248    }
     249    RTVfsIoStrmRelease(hVfsIosSrc);
     250    return RTMsgErrorExitFailure("RTVfsObjFromIoStream failed unexpectedly!");
    226251}
    227252
     
    236261 *                          buffer as we decend.
    237262 * @param   cchSrc          The length of the input.
     263 * @param   paObjInfo[3]    Array of three FS object info structures.  The first
     264 *                          one is always filled with RTFSOBJATTRADD_UNIX info.
     265 *                          The next two may contain owner and group names if
     266 *                          available.  The three buffers can be reused.
    238267 * @param   pszDst          The name to archive it the under.  We append to the
    239268 *                          buffer as we decend.
     
    242271 */
    243272static RTEXITCODE rtZipTarCmdArchiveDir(PRTZIPTARCMDOPS pOpts, RTVFSFSSTREAM hVfsFss, char pszSrc[RTPATH_MAX], size_t cchSrc,
    244                                         char pszDst[RTPATH_MAX], size_t cchDst, PRTERRINFOSTATIC pErrInfo)
     273                                        RTFSOBJINFO paObjInfo[3], char pszDst[RTPATH_MAX], size_t cchDst,
     274                                        PRTERRINFOSTATIC pErrInfo)
    245275{
    246     RT_NOREF(pOpts, hVfsFss, pszSrc, cchSrc, pszDst, cchDst, pErrInfo);
     276    RT_NOREF(pOpts, hVfsFss, pszSrc, cchSrc, paObjInfo, pszDst, cchDst, pErrInfo);
    247277    return RTMsgErrorExitFailure("Adding directories has not yet been implemented! Sorry.");
    248278}
     
    418448                {
    419449                    /*
    420                      * What kind of object is this?
     450                     * What kind of object is this and what affiliations does it have?
    421451                     */
    422452                    RTERRINFOSTATIC ErrInfo;
    423453                    uint32_t        offError;
    424                     RTFSOBJINFO     ObjInfo;
    425                     rc = RTVfsChainQueryInfo(szSrc, &ObjInfo, RTFSOBJATTRADD_UNIX, RTPATH_F_ON_LINK,
     454                    RTFSOBJINFO     aObjInfo[3];
     455                    rc = RTVfsChainQueryInfo(szSrc, &aObjInfo[0], RTFSOBJATTRADD_UNIX, RTPATH_F_ON_LINK,
    426456                                             &offError, RTErrInfoInitStatic(&ErrInfo));
    427457                    if (RT_SUCCESS(rc))
    428458                    {
     459
     460                        rc = RTVfsChainQueryInfo(szSrc, &aObjInfo[1], RTFSOBJATTRADD_UNIX_OWNER, RTPATH_F_ON_LINK,
     461                                                 &offError, RTErrInfoInitStatic(&ErrInfo));
     462                        if (RT_SUCCESS(rc))
     463                        {
     464                            rc = RTVfsChainQueryInfo(szSrc, &aObjInfo[2], RTFSOBJATTRADD_UNIX_GROUP, RTPATH_F_ON_LINK,
     465                                                     &offError, RTErrInfoInitStatic(&ErrInfo));
     466                            if (RT_FAILURE(rc))
     467                                RT_ZERO(aObjInfo[2]);
     468                        }
     469                        else
     470                        {
     471                            RT_ZERO(aObjInfo[1]);
     472                            RT_ZERO(aObjInfo[2]);
     473                        }
     474
     475                        /*
     476                         * Process on an object type basis.
     477                         */
    429478                        RTEXITCODE rcExit2;
    430                         if (RTFS_IS_DIRECTORY(ObjInfo.Attr.fMode))
    431                             rcExit2 = rtZipTarCmdArchiveDir(pOpts, hVfsFss, szSrc, strlen(szSrc), szDst, strlen(szDst), &ErrInfo);
     479                        if (RTFS_IS_DIRECTORY(aObjInfo[0].Attr.fMode))
     480                            rcExit2 = rtZipTarCmdArchiveDir(pOpts, hVfsFss, szSrc, strlen(szSrc), aObjInfo,
     481                                                            szDst, strlen(szDst), &ErrInfo);
     482                        else if (RTFS_IS_FILE(aObjInfo[0].Attr.fMode))
     483                            rcExit2 = rtZipTarCmdArchiveFile(pOpts, hVfsFss, szSrc, aObjInfo, szDst, &ErrInfo);
     484                        else if (RTFS_IS_SYMLINK(aObjInfo[0].Attr.fMode))
     485                            rcExit2 = RTMsgErrorExitFailure("Symlink archiving is not implemented");
     486                        else if (RTFS_IS_FIFO(aObjInfo[0].Attr.fMode))
     487                            rcExit2 = RTMsgErrorExitFailure("FIFO archiving is not implemented");
     488                        else if (RTFS_IS_SOCKET(aObjInfo[0].Attr.fMode))
     489                            rcExit2 = RTMsgErrorExitFailure("Socket archiving is not implemented");
     490                        else if (RTFS_IS_DEV_CHAR(aObjInfo[0].Attr.fMode) || RTFS_IS_DEV_BLOCK(aObjInfo[0].Attr.fMode))
     491                            rcExit2 = RTMsgErrorExitFailure("Device archiving is not implemented");
     492                        else if (RTFS_IS_WHITEOUT(aObjInfo[0].Attr.fMode))
     493                            rcExit2 = RTEXITCODE_SUCCESS;
    432494                        else
    433                             rcExit2 = rtZipTarCmdArchiveFile(pOpts, hVfsFss, szSrc, szDst, &ErrInfo);
     495                            rcExit2 = RTMsgErrorExitFailure("Unknown file type: %#x\n", aObjInfo[0].Attr.fMode);
     496                        if (rcExit2 != RTEXITCODE_SUCCESS)
     497                            rcExit = rcExit2;
    434498                    }
    435499                    else
     
    12381302             "    --read-ahead                          (-x)\n"
    12391303             "        Enabled read ahead thread when extracting files.\n"
     1304             "    --push-file                           (-A, -c, -u)\n"
     1305             "        Use RTVfsFsStrmPushFile instead of RTVfsFsStrmAdd.\n"
    12401306             "\n");
    12411307    RTPrintf("Standard Options:\n"
     
    12951361        { "--dir-mode-or-mask",     RTZIPTARCMD_OPT_DIR_MODE_OR_MASK,   RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_OCT },
    12961362        { "--read-ahead",           RTZIPTARCMD_OPT_READ_AHEAD,         RTGETOPT_REQ_NOTHING },
     1363        { "--use-push-file",        RTZIPTARCMD_OPT_USE_PUSH_FILE,      RTGETOPT_REQ_NOTHING },
    12971364    };
    12981365
     
    13201387#endif
    13211388    Opts.enmTarFormat = RTZIPTARFORMAT_DEFAULT;
    1322     Opts.fTarCreate   = 0;
    13231389
    13241390    RTGETOPTUNION   ValueUnion;
     
    14761542                break;
    14771543
     1544            case RTZIPTARCMD_OPT_USE_PUSH_FILE:
     1545                Opts.fUsePushFile = true;
     1546                break;
     1547
    14781548            /* Standard bits. */
    14791549            case 'h':
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