VirtualBox

Changeset 34002 in vbox for trunk/src/VBox/Runtime


Ignore:
Timestamp:
Nov 11, 2010 5:16:37 PM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
67667
Message:

iprt: Working on tar vfs.

Location:
trunk/src/VBox/Runtime
Files:
2 added
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/Makefile.kmk

    r33982 r34002  
    372372        common/vfs/vfsstdfile.cpp \
    373373        common/zip/tar.cpp \
     374        common/zip/tarvfs.cpp \
    374375        common/zip/zip.cpp \
    375376        common/zip/zipgzip.cpp \
  • trunk/src/VBox/Runtime/common/vfs/vfsbase.cpp

    r33979 r34002  
    6868/** The max number of symbolic links to resolve in a path. */
    6969#define RTVFS_MAX_LINKS             20U
     70
     71
     72/** Asserts that the VFS base object vtable is valid. */
     73#define RTVFSOBJ_ASSERT_OPS(pObj, enmTypeArg) \
     74    do \
     75    { \
     76        Assert((pObj)->uVersion == RTVFSOBJOPS_VERSION); \
     77        Assert((pObj)->enmType == (enmTypeArg) || (enmTypeArg) == RTVFSOBJTYPE_INVALID); \
     78        AssertPtr((pObj)->pszName); \
     79        Assert(*(pObj)->pszName); \
     80        AssertPtr((pObj)->pfnClose); \
     81        AssertPtr((pObj)->pfnQueryInfo); \
     82        Assert((pObj)->uEndMarker == RTVFSOBJOPS_VERSION); \
     83    } while (0)
     84
     85/** Asserts that the VFS I/O stream vtable is valid. */
     86#define RTVFSIOSTREAM_ASSERT_OPS(pIoStreamOps, enmTypeArg) \
     87    do { \
     88        RTVFSOBJ_ASSERT_OPS(&(pIoStreamOps)->Obj, enmTypeArg); \
     89        Assert((pIoStreamOps)->uVersion == RTVFSIOSTREAMOPS_VERSION); \
     90        Assert(!(pIoStreamOps)->fReserved); \
     91        AssertPtr((pIoStreamOps)->pfnRead); \
     92        AssertPtr((pIoStreamOps)->pfnWrite); \
     93        AssertPtr((pIoStreamOps)->pfnFlush); \
     94        AssertPtr((pIoStreamOps)->pfnPollOne); \
     95        AssertPtr((pIoStreamOps)->pfnTell); \
     96        AssertPtrNull((pIoStreamOps)->pfnSkip); \
     97        AssertPtrNull((pIoStreamOps)->pfnZeroFill); \
     98        Assert((pIoStreamOps)->uEndMarker == RTVFSIOSTREAMOPS_VERSION); \
     99    } while (0)
    70100
    71101
     
    10951125                             PRTVFSFSSTREAM phVfsFss, void **ppvInstance)
    10961126{
    1097     return VERR_NOT_IMPLEMENTED;
     1127    /*
     1128     * Validate the input, be extra strict in strict builds.
     1129     */
     1130    AssertPtr(pFsStreamOps);
     1131    AssertReturn(pFsStreamOps->uVersion   == RTVFSFSSTREAMOPS_VERSION, VERR_VERSION_MISMATCH);
     1132    AssertReturn(pFsStreamOps->uEndMarker == RTVFSFSSTREAMOPS_VERSION, VERR_VERSION_MISMATCH);
     1133    Assert(!pFsStreamOps->fReserved);
     1134    RTVFSOBJ_ASSERT_OPS(&pFsStreamOps->Obj, RTVFSOBJTYPE_FS_STREAM);
     1135    AssertPtr(pFsStreamOps->pfnNext);
     1136    Assert(cbInstance > 0);
     1137    AssertPtr(ppvInstance);
     1138    AssertPtr(phVfsFss);
     1139
     1140    RTVFSINTERNAL *pVfs = NULL;
     1141    if (hVfs != NIL_RTVFS)
     1142    {
     1143        pVfs = hVfs;
     1144        AssertPtrReturn(pVfs, VERR_INVALID_HANDLE);
     1145        AssertReturn(pVfs->uMagic == RTVFS_MAGIC, VERR_INVALID_HANDLE);
     1146    }
     1147
     1148    /*
     1149     * Allocate the handle + instance data.
     1150     */
     1151    size_t const cbThis = RT_ALIGN_Z(sizeof(RTVFSFSSTREAMINTERNAL), RTVFS_INST_ALIGNMENT)
     1152                        + RT_ALIGN_Z(cbInstance, RTVFS_INST_ALIGNMENT);
     1153    RTVFSFSSTREAMINTERNAL *pThis = (RTVFSFSSTREAMINTERNAL *)RTMemAllocZ(cbThis);
     1154    if (!pThis)
     1155        return VERR_NO_MEMORY;
     1156
     1157    pThis->uMagic       = RTVFSFSSTREAM_MAGIC;
     1158    pThis->fFlags       = RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_NONE;
     1159    pThis->pOps         = pFsStreamOps;
     1160    pThis->Base.uMagic  = RTVFSOBJ_MAGIC;
     1161    pThis->Base.pvThis  = (char *)pThis + RT_ALIGN_Z(sizeof(*pThis), RTVFS_INST_ALIGNMENT);
     1162    pThis->Base.pOps    = &pFsStreamOps->Obj;
     1163    pThis->Base.hSemRW  = hSemRW != NIL_RTSEMRW ? hSemRW : pVfs ? pVfs->Base.hSemRW : NIL_RTSEMRW;
     1164    pThis->Base.hVfs    = hVfs;
     1165    pThis->Base.cRefs   = 1;
     1166    if (hVfs != NIL_RTVFS)
     1167        rtVfsObjRetainVoid(&pVfs->Base);
     1168
     1169    *phVfsFss    = pThis;
     1170    *ppvInstance = pThis->Base.pvThis;
     1171    return VINF_SUCCESS;
    10981172}
    10991173
     
    12331307    AssertReturn(pIoStreamOps->uEndMarker == RTVFSIOSTREAMOPS_VERSION, VERR_VERSION_MISMATCH);
    12341308    Assert(!pIoStreamOps->fReserved);
     1309    RTVFSIOSTREAM_ASSERT_OPS(pIoStreamOps, RTVFSOBJTYPE_IO_STREAM);
    12351310    Assert(cbInstance > 0);
    12361311    Assert(fOpen & RTFILE_O_ACCESS_MASK);
     
    15391614    AssertReturn(pFileOps->uEndMarker == RTVFSFILEOPS_VERSION, VERR_VERSION_MISMATCH);
    15401615    Assert(!pFileOps->fReserved);
     1616    RTVFSIOSTREAM_ASSERT_OPS(&pFileOps->Stream, RTVFSOBJTYPE_FILE);
    15411617    Assert(cbInstance > 0);
    15421618    Assert(fOpen & RTFILE_O_ACCESS_MASK);
  • trunk/src/VBox/Runtime/common/zip/tar.cpp

    r33982 r34002  
    3030 ******************************************************************************/
    3131#include "internal/iprt.h"
    32 #include "internal/magics.h"
    3332#include <iprt/tar.h>
    3433
     
    4039#include <iprt/path.h>
    4140#include <iprt/string.h>
     41
     42#include "internal/magics.h"
    4243
    4344
  • trunk/src/VBox/Runtime/common/zip/zipgzip.cpp

    r33973 r34002  
    341341    int              rc;
    342342
    343     NOREF(fBlocking);
    344343    if (!pThis->fDecompress)
    345344        return VERR_ACCESS_DENIED;
  • trunk/src/VBox/Runtime/include/internal/fs.h

    r28800 r34002  
    4343#ifndef RT_OS_WINDOWS
    4444void    rtFsConvertStatToObjInfo(PRTFSOBJINFO pObjInfo, const struct stat *pStat, const char *pszName, unsigned cbName);
     45void    rtFsObjInfoAttrSetUnixOwner(PRTFSOBJINFO pObjInfo, RTUID uid);
     46void    rtFsObjInfoAttrSetUnixGroup(PRTFSOBJINFO pObjInfo, RTUID gid);
    4547#endif
    4648
  • trunk/src/VBox/Runtime/r3/fs.cpp

    r33540 r34002  
    3737#  define DEV_BSIZE S_BLKSIZE /** @todo bird: add DEV_BSIZE to sys/param.h on OS/2. */
    3838# endif
     39# include <grp.h>
     40# include <pwd.h>
    3941#endif
    4042
     
    192194}
    193195
    194 
    195196#ifndef RT_OS_WINDOWS
     197
    196198/**
    197199 * Internal worker function which setups RTFSOBJINFO based on a UNIX stat struct.
     
    300302    pObjInfo->Attr.u.Unix.Device          = pStat->st_rdev;
    301303}
     304
     305
     306/**
     307 * Set user-owner additional attributes.
     308 *
     309 * @param   pObjInfo            The object info to fill add attrs for.
     310 * @param   uid                 The user id.
     311 */
     312void    rtFsObjInfoAttrSetUnixOwner(PRTFSOBJINFO pObjInfo, RTUID uid)
     313{
     314    pObjInfo->Attr.enmAdditional   = RTFSOBJATTRADD_UNIX_OWNER;
     315    pObjInfo->Attr.u.UnixOwner.uid = uid;
     316    pObjInfo->Attr.u.UnixOwner.szName[0] = '\0';
     317
     318    char            achBuf[_4K];
     319    struct passwd   Pwd;
     320    struct passwd  *pPwd;
     321    int rc = getpwuid_r(uid, &Pwd, achBuf, sizeof(achBuf), &pPwd);
     322    if (!rc && pPwd)
     323        RTStrCopy(pObjInfo->Attr.u.UnixOwner.szName, sizeof(pObjInfo->Attr.u.UnixOwner.szName), pPwd->pw_name);
     324}
     325
     326
     327/**
     328 * Set user-group additional attributes.
     329 *
     330 * @param   pObjInfo            The object info to fill add attrs for.
     331 * @param   gid                 The group id.
     332 */
     333void rtFsObjInfoAttrSetUnixGroup(PRTFSOBJINFO pObjInfo, RTUID gid)
     334{
     335    pObjInfo->Attr.enmAdditional   = RTFSOBJATTRADD_UNIX_GROUP;
     336    pObjInfo->Attr.u.UnixGroup.gid = gid;
     337    pObjInfo->Attr.u.UnixGroup.szName[0] = '\0';
     338
     339    char            achBuf[_4K];
     340    struct group    Grp;
     341    struct group   *pGrp;
     342
     343    int rc = getgrgid_r(gid, &Grp, achBuf, sizeof(achBuf), &pGrp);
     344    if (!rc && pGrp)
     345        RTStrCopy(pObjInfo->Attr.u.UnixGroup.szName, sizeof(pObjInfo->Attr.u.UnixGroup.szName), pGrp->gr_name);
     346}
     347
    302348#endif /* !RT_OS_WINDOWS */
    303349
  • trunk/src/VBox/Runtime/r3/posix/fileio-posix.cpp

    r33103 r34002  
    658658    switch (enmAdditionalAttribs)
    659659    {
     660        case RTFSOBJATTRADD_NOTHING:
     661        case RTFSOBJATTRADD_UNIX:
     662            /* done */
     663            break;
     664
     665        case RTFSOBJATTRADD_UNIX_OWNER:
     666            rtFsObjInfoAttrSetUnixOwner(pObjInfo, Stat.st_uid);
     667            break;
     668
     669        case RTFSOBJATTRADD_UNIX_GROUP:
     670            rtFsObjInfoAttrSetUnixGroup(pObjInfo, Stat.st_gid);
     671            break;
     672
    660673        case RTFSOBJATTRADD_EASIZE:
    661674            pObjInfo->Attr.enmAdditional          = RTFSOBJATTRADD_EASIZE;
    662675            pObjInfo->Attr.u.EASize.cb            = 0;
    663             break;
    664 
    665         case RTFSOBJATTRADD_NOTHING:
    666         case RTFSOBJATTRADD_UNIX:
    667             /* done */
    668676            break;
    669677
  • trunk/src/VBox/Runtime/r3/posix/path-posix.cpp

    r33602 r34002  
    3939#include <sys/types.h>
    4040#include <pwd.h>
     41#include <grp.h>
    4142
    4243#include <iprt/path.h>
     
    340341            switch (enmAdditionalAttribs)
    341342            {
     343                case RTFSOBJATTRADD_NOTHING:
     344                case RTFSOBJATTRADD_UNIX:
     345                    Assert(pObjInfo->Attr.enmAdditional == RTFSOBJATTRADD_UNIX);
     346                    break;
     347
     348                case RTFSOBJATTRADD_UNIX_OWNER:
     349                    rtFsObjInfoAttrSetUnixOwner(pObjInfo, Stat.st_uid);
     350                    break;
     351
     352                case RTFSOBJATTRADD_UNIX_GROUP:
     353                    rtFsObjInfoAttrSetUnixGroup(pObjInfo, Stat.st_gid);
     354                    break;
     355
    342356                case RTFSOBJATTRADD_EASIZE:
    343357                    /** @todo Use SGI extended attribute interface to query EA info. */
    344358                    pObjInfo->Attr.enmAdditional          = RTFSOBJATTRADD_EASIZE;
    345359                    pObjInfo->Attr.u.EASize.cb            = 0;
    346                     break;
    347 
    348                 case RTFSOBJATTRADD_NOTHING:
    349                 case RTFSOBJATTRADD_UNIX:
    350                     Assert(pObjInfo->Attr.enmAdditional == RTFSOBJATTRADD_UNIX);
    351360                    break;
    352361
  • trunk/src/VBox/Runtime/r3/win/dir-win.cpp

    r28918 r34002  
    437437            break;
    438438
     439        case RTFSOBJATTRADD_UNIX_OWNER:
     440            pDirEntry->Info.Attr.enmAdditional          = RTFSOBJATTRADD_UNIX_OWNER;
     441            pDirEntry->Info.Attr.u.UnixOwner.uid        = ~0U;
     442            pDirEntry->Info.Attr.u.UnixOwner.szName[0]  = '\0'; /** @todo return something sensible here. */
     443            break;
     444
     445        case RTFSOBJATTRADD_UNIX_GROUP:
     446            pDirEntry->Info.Attr.enmAdditional          = RTFSOBJATTRADD_UNIX_GROUP;
     447            pDirEntry->Info.Attr.u.UnixGroup.gid        = ~0U;
     448            pDirEntry->Info.Attr.u.UnixGroup.szName[0]  = '\0';
     449            break;
     450
    439451        default:
    440452            AssertMsgFailed(("Impossible!\n"));
  • trunk/src/VBox/Runtime/r3/win/fileio-win.cpp

    r33540 r34002  
    680680    switch (enmAdditionalAttribs)
    681681    {
    682         case RTFSOBJATTRADD_EASIZE:
    683             pObjInfo->Attr.enmAdditional          = RTFSOBJATTRADD_EASIZE;
    684             pObjInfo->Attr.u.EASize.cb            = 0;
     682        case RTFSOBJATTRADD_NOTHING:
     683            pObjInfo->Attr.enmAdditional          = RTFSOBJATTRADD_NOTHING;
    685684            break;
    686685
     
    697696            break;
    698697
    699         case RTFSOBJATTRADD_NOTHING:
    700             pObjInfo->Attr.enmAdditional          = RTFSOBJATTRADD_NOTHING;
     698        case RTFSOBJATTRADD_UNIX_OWNER:
     699            pObjInfo->Info.Attr.enmAdditional     = RTFSOBJATTRADD_UNIX_OWNER;
     700            pObjInfo->Info.Attr.u.UnixOwner.uid   = ~0U;
     701            pObjInfo->Info.Attr.u.UnixOwner.szName[0] = '\0'; /** @todo return something sensible here. */
     702            break;
     703
     704        case RTFSOBJATTRADD_UNIX_GROUP:
     705            pObjInfo->Info.Attr.enmAdditional     = RTFSOBJATTRADD_UNIX_GROUP;
     706            pObjInfo->Info.Attr.u.UnixGroup.gid   = ~0U;
     707            pObjInfo->Info.Attr.u.UnixGroup.szName[0] = '\0';
     708            break;
     709
     710        case RTFSOBJATTRADD_EASIZE:
     711            pObjInfo->Attr.enmAdditional          = RTFSOBJATTRADD_EASIZE;
     712            pObjInfo->Attr.u.EASize.cb            = 0;
    701713            break;
    702714
  • trunk/src/VBox/Runtime/r3/win/path-win.cpp

    r33439 r34002  
    300300    switch (enmAdditionalAttribs)
    301301    {
    302         case RTFSOBJATTRADD_EASIZE:
    303             pObjInfo->Attr.enmAdditional          = RTFSOBJATTRADD_EASIZE;
    304             pObjInfo->Attr.u.EASize.cb            = 0;
     302        case RTFSOBJATTRADD_NOTHING:
     303            pObjInfo->Attr.enmAdditional          = RTFSOBJATTRADD_NOTHING;
    305304            break;
    306305
     
    317316            break;
    318317
    319         case RTFSOBJATTRADD_NOTHING:
    320             pObjInfo->Attr.enmAdditional          = RTFSOBJATTRADD_NOTHING;
     318        case RTFSOBJATTRADD_UNIX_OWNER:
     319            pObjInfo->Info.Attr.enmAdditional     = RTFSOBJATTRADD_UNIX_OWNER;
     320            pObjInfo->Info.Attr.u.UnixOwner.uid   = ~0U;
     321            pObjInfo->Info.Attr.u.UnixOwner.szName[0] = '\0'; /** @todo return something sensible here. */
     322            break;
     323
     324        case RTFSOBJATTRADD_UNIX_GROUP:
     325            pObjInfo->Info.Attr.enmAdditional     = RTFSOBJATTRADD_UNIX_GROUP;
     326            pObjInfo->Info.Attr.u.UnixGroup.gid   = ~0U;
     327            pObjInfo->Info.Attr.u.UnixGroup.szName[0] = '\0';
     328            break;
     329
     330        case RTFSOBJATTRADD_EASIZE:
     331            pObjInfo->Attr.enmAdditional          = RTFSOBJATTRADD_EASIZE;
     332            pObjInfo->Attr.u.EASize.cb            = 0;
    321333            break;
    322334
Note: See TracChangeset for help on using the changeset viewer.

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