VirtualBox

Changeset 80524 in vbox for trunk/src/VBox/ImageMounter


Ignore:
Timestamp:
Sep 1, 2019 1:17:00 PM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
133031
Message:

vboximg-mount: Properly retrieve inode information from a guest filesystem and fill the stat buffer

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/ImageMounter/vboximg-mount/vboximg-mount.cpp

    r80519 r80524  
    2323#define LOG_GROUP LOG_GROUP_DEFAULT /** @todo log group */
    2424
     25#define RTTIME_INCL_TIMESPEC
    2526#define FUSE_USE_VERSION 27
    2627#if defined(RT_OS_DARWIN) || defined(RT_OS_LINUX) || defined(RT_OS_FREEBSD)
     
    3839#include <cstdarg>
    3940#include <sys/stat.h>
     41#include <sys/time.h>
    4042#endif
    4143#if defined(RT_OS_DARWIN) || defined(RT_OS_FREEBSD) || defined(RT_OS_LINUX)
     
    7678#include <iprt/vfs.h>
    7779#include <iprt/dvm.h>
     80#include <iprt/time.h>
    7881
    7982#include "vboximgCrypto.h"
     
    8790     USAGE_FLAG,
    8891};
     92
     93#if !defined(S_ISTXT) && defined(S_ISVTX)
     94# define S_ISTXT (S_ISVTX)
     95#endif
    8996
    9097#define VBOX_EXTPACK                "Oracle VM VirtualBox Extension Pack"
     
    568575        if (RT_SUCCESS(rcIprt))
    569576        {
    570             switch (RTVfsObjGetType(hVfsObj))
     577            RTFSOBJINFO ObjInfo;
     578
     579            rcIprt = RTVfsObjQueryInfo(hVfsObj, &ObjInfo, RTFSOBJATTRADD_UNIX);
     580            if (RT_SUCCESS(rcIprt))
    571581            {
    572                 case RTVFSOBJTYPE_FILE:
     582                stbuf->st_size  = ObjInfo.cbObject;
     583                stbuf->st_nlink = 1;
     584                stbuf->st_uid   = 0;
     585                stbuf->st_gid   = 0;
     586
     587                RTTimeSpecGetTimespec(&ObjInfo.AccessTime, &stbuf->st_atim);
     588                RTTimeSpecGetTimespec(&ObjInfo.ModificationTime, &stbuf->st_mtim);
     589                RTTimeSpecGetTimespec(&ObjInfo.ChangeTime, &stbuf->st_ctim);
     590                /*RTTimeSpecGetTimespec(&ObjInfo.BirthTime, &stbuf->st_birthtime);*/ /* Not existing on Linux. */
     591
     592                switch (ObjInfo.Attr.fMode & RTFS_TYPE_MASK)
    573593                {
    574                     RTVFSFILE hVfsFile = RTVfsObjToFile(hVfsObj);
    575                     uint64_t cb;
    576                     rcIprt = RTVfsFileGetSize(hVfsFile, &cb); AssertRC(rcIprt);
    577                     RTVfsFileRelease(hVfsFile);
    578 
    579                     stbuf->st_mode = S_IFREG | 0644;
    580                     stbuf->st_size = (off_t)cb;
    581                     stbuf->st_nlink = 1;
    582                     break;
     594                    case RTFS_TYPE_FIFO:
     595                    {
     596                        stbuf->st_mode = S_IFIFO;
     597                        break;
     598                    }
     599                    case RTFS_TYPE_DEV_CHAR:
     600                    {
     601                        stbuf->st_mode = S_IFCHR;
     602                        break;
     603                    }
     604                    case RTFS_TYPE_DIRECTORY:
     605                    {
     606                        stbuf->st_mode = S_IFDIR;
     607                        stbuf->st_nlink = 2;
     608                        break;
     609                    }
     610                    case RTFS_TYPE_DEV_BLOCK:
     611                    {
     612                        stbuf->st_mode = S_IFBLK;
     613                        break;
     614                    }
     615                    case RTFS_TYPE_FILE:
     616                    {
     617                        stbuf->st_mode = S_IFREG;
     618                        break;
     619                    }
     620                    case RTFS_TYPE_SYMLINK:
     621                    {
     622                        stbuf->st_mode = S_IFLNK;
     623                        break;
     624                    }
     625                    case RTFS_TYPE_SOCKET:
     626                    {
     627                        stbuf->st_mode = S_IFSOCK;
     628                        break;
     629                    }
     630#if 0 /* Not existing on Linux. */
     631                    case RTFS_TYPE_WHITEOUT:
     632                    {
     633                        stbuf->st_mode = S_IFWHT;
     634                        break;
     635                    }
     636#endif
     637                    default:
     638                        stbuf->st_mode = 0;
    583639                }
    584                 case RTVFSOBJTYPE_DIR:
     640
     641                if (ObjInfo.Attr.fMode & RTFS_UNIX_ISUID)
     642                    stbuf->st_mode |= S_ISUID;
     643                if (ObjInfo.Attr.fMode & RTFS_UNIX_ISGID)
     644                    stbuf->st_mode |= S_ISGID;
     645                if (ObjInfo.Attr.fMode & RTFS_UNIX_ISTXT)
     646                    stbuf->st_mode |= S_ISTXT;
     647
     648                /* Owner permissions. */
     649                if (ObjInfo.Attr.fMode & RTFS_UNIX_IRUSR)
     650                    stbuf->st_mode |= S_IRUSR;
     651                if (ObjInfo.Attr.fMode & RTFS_UNIX_IWUSR)
     652                    stbuf->st_mode |= S_IWUSR;
     653                if (ObjInfo.Attr.fMode & RTFS_UNIX_IXUSR)
     654                    stbuf->st_mode |= S_IXUSR;
     655
     656                /* Group permissions. */
     657                if (ObjInfo.Attr.fMode & RTFS_UNIX_IRGRP)
     658                    stbuf->st_mode |= S_IRGRP;
     659                if (ObjInfo.Attr.fMode & RTFS_UNIX_IWGRP)
     660                    stbuf->st_mode |= S_IWGRP;
     661                if (ObjInfo.Attr.fMode & RTFS_UNIX_IXGRP)
     662                    stbuf->st_mode |= S_IXGRP;
     663
     664                /* Other permissions. */
     665                if (ObjInfo.Attr.fMode & RTFS_UNIX_IROTH)
     666                    stbuf->st_mode |= S_IROTH;
     667                if (ObjInfo.Attr.fMode & RTFS_UNIX_IWOTH)
     668                    stbuf->st_mode |= S_IWOTH;
     669                if (ObjInfo.Attr.fMode & RTFS_UNIX_IXOTH)
     670                    stbuf->st_mode |= S_IXOTH;
     671
     672                if (ObjInfo.Attr.enmAdditional == RTFSOBJATTRADD_UNIX)
    585673                {
    586                     stbuf->st_mode = S_IFDIR | 0755;
    587                     stbuf->st_nlink = 2;
    588                     break;
     674                    stbuf->st_uid   = ObjInfo.Attr.u.Unix.uid;
     675                    stbuf->st_gid   = ObjInfo.Attr.u.Unix.gid;
     676                    stbuf->st_nlink = ObjInfo.Attr.u.Unix.cHardlinks;
     677                    stbuf->st_ino   = ObjInfo.Attr.u.Unix.INodeId;
     678                    stbuf->st_dev   = ObjInfo.Attr.u.Unix.INodeIdDevice;
     679                    /*stbuf->st_flags = ObjInfo.Attr.u.Unix.fFlags;*/       /* Not existing on Linux. */
     680                    /*stbuf->st_gen   = ObjInfo.Attr.u.Unix.GenerationId;*/ /* Not existing on Linux. */
     681                    stbuf->st_rdev  = ObjInfo.Attr.u.Unix.Device;
    589682                }
    590                 default:
    591                     rc = -EINVAL;
    592683            }
    593684
    594             stbuf->st_uid = 0;
    595             stbuf->st_gid = 0;
    596685            RTVfsObjRelease(hVfsObj);
    597686        }
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