VirtualBox

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


Ignore:
Timestamp:
Jun 21, 2011 10:19:16 AM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
72411
Message:

IPRT: More in kernel file I/O code for darwin.

Location:
trunk/src/VBox/Runtime/r0drv/darwin
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/r0drv/darwin/mach_kernel-r0drv-darwin.cpp

    r37568 r37569  
    4040#include "../../include/internal/iprt.h"
    4141
    42 #if 0//def IN_RING0  /* till RTFILE is changed in types.h */
     42#ifdef IN_RING0  /* till RTFILE is changed in types.h */
    4343# include <iprt/types.h>
    4444typedef struct RTFILENEWINT *RTFILENEW;
     
    174174
    175175
    176 #if 0//def IN_RING0
     176#ifdef IN_RING0
     177
     178/** Default file permissions for newly created files. */
     179#if defined(S_IRUSR) && defined(S_IWUSR)
     180# define RT_FILE_PERMISSION  (S_IRUSR | S_IWUSR)
     181#else
     182# define RT_FILE_PERMISSION  (00600)
     183#endif
     184
     185/**
     186 * Darwin kernel file handle data.
     187 */
     188typedef struct RTFILENEWINT
     189{
     190    /** Magic value (RTFILE_MAGIC). */
     191    uint32_t        u32Magic;
     192    /** The open mode flags passed to the kernel API. */
     193    int             fOpenMode;
     194    /** The open flags passed to RTFileOpen. */
     195    uint64_t        fOpen;
     196    /** The VFS context in which the file was opened. */
     197    vfs_context_t   hVfsCtx;
     198    /** The vnode returned by vnode_open. */
     199    vnode_t         hVnode;
     200} RTFILENEWINT;
     201/** Magic number for RTFILENEWINT::u32Magic (To Be Determined). */
     202#define RTFILE_MAGIC                    UINT32_C(0x01020304)
     203
    177204
    178205RTDECL(int) RTFileOpen(PRTFILE phFile, const char *pszFilename, uint32_t fOpen)
    179206{
    180     vfs_context_t   hVfsCtx  = vfs_context_current();
    181     int             fCMode   = (fOpen & RTFILE_O_CREATE_MODE_MASK)
    182                              ? (fOpen & RTFILE_O_CREATE_MODE_MASK) >> RTFILE_O_CREATE_MODE_SHIFT
    183                              : RT_FILE_PERMISSION;
    184     int             fVnFlags = 0; /* VNODE_LOOKUP_XXX */
    185 
    186     int fOpenMode = 0;
    187     if (fOpen & RTFILE_O_NON_BLOCK)
    188         fOpenMode |= O_NONBLOCK;
    189     if (fOpen & RTFILE_O_WRITE_THROUGH)
    190         fOpenMode |= O_SYNC;
    191 
    192     /* create/truncate file */
    193     switch (fOpen & RTFILE_O_ACTION_MASK)
     207    RTFILENEWINT *pThis = (RTFILENEWINT *)RTMemAllocZ(sizeof(*pThis));
     208    if (!pThis)
     209        return VERR_NO_MEMORY;
     210
     211    errno_t rc;
     212    pThis->u32Magic = RTFILE_MAGIC;
     213    pThis->fOpen    = fOpen;
     214    pThis->hVfsCtx  = vfs_context_current();
     215    if (pThis->hVfsCtx != NULL)
    194216    {
    195         case RTFILE_O_OPEN:             break;
    196         case RTFILE_O_OPEN_CREATE:      fOpenMode |= O_CREAT; break;
    197         case RTFILE_O_CREATE:           fOpenMode |= O_CREAT | O_EXCL; break;
    198         case RTFILE_O_CREATE_REPLACE:   fOpenMode |= O_CREAT | O_TRUNC; break; /** @todo replacing needs fixing, this is *not* a 1:1 mapping! */
     217        int             fCMode    = (fOpen & RTFILE_O_CREATE_MODE_MASK)
     218                                  ? (fOpen & RTFILE_O_CREATE_MODE_MASK) >> RTFILE_O_CREATE_MODE_SHIFT
     219                                  : RT_FILE_PERMISSION;
     220        int             fVnFlags  = 0; /* VNODE_LOOKUP_XXX */
     221        int             fOpenMode = 0;
     222        if (fOpen & RTFILE_O_NON_BLOCK)
     223            fOpenMode |= O_NONBLOCK;
     224        if (fOpen & RTFILE_O_WRITE_THROUGH)
     225            fOpenMode |= O_SYNC;
     226
     227        /* create/truncate file */
     228        switch (fOpen & RTFILE_O_ACTION_MASK)
     229        {
     230            case RTFILE_O_OPEN:             break;
     231            case RTFILE_O_OPEN_CREATE:      fOpenMode |= O_CREAT; break;
     232            case RTFILE_O_CREATE:           fOpenMode |= O_CREAT | O_EXCL; break;
     233            case RTFILE_O_CREATE_REPLACE:   fOpenMode |= O_CREAT | O_TRUNC; break; /** @todo replacing needs fixing, this is *not* a 1:1 mapping! */
     234        }
     235        if (fOpen & RTFILE_O_TRUNCATE)
     236            fOpenMode |= O_TRUNC;
     237
     238        switch (fOpen & RTFILE_O_ACCESS_MASK)
     239        {
     240            case RTFILE_O_READ:
     241                fOpenMode |= FREAD;
     242                break;
     243            case RTFILE_O_WRITE:
     244                fOpenMode |= fOpen & RTFILE_O_APPEND ? O_APPEND | FWRITE : FWRITE;
     245                break;
     246            case RTFILE_O_READWRITE:
     247                fOpenMode |= fOpen & RTFILE_O_APPEND ? O_APPEND | FWRITE | FREAD : FWRITE | FREAD;
     248                break;
     249            default:
     250                AssertMsgFailed(("RTFileOpen received an invalid RW value, fOpen=%#x\n", fOpen));
     251                return VERR_INVALID_PARAMETER;
     252        }
     253
     254        pThis->fOpenMode = fOpenMode;
     255        rc = vnode_open(pszFilename, fOpenMode, fCMode, fVnFlags, &pThis->hVnode, pThis->hVfsCtx);
     256        if (rc == 0)
     257        {
     258            *phFile = pThis;
     259            return VINF_SUCCESS;
     260        }
     261
     262        rc = RTErrConvertFromErrno(rc);
    199263    }
    200     if (fOpen & RTFILE_O_TRUNCATE)
    201         fOpenMode |= O_TRUNC;
    202 
    203     switch (fOpen & RTFILE_O_ACCESS_MASK)
    204     {
    205         case RTFILE_O_READ:
    206             fOpenMode |= FREAD
    207             break;
    208         case RTFILE_O_WRITE:
    209             fOpenMode |= fOpen & RTFILE_O_APPEND ? O_APPEND | FWRITE : FWRITE;
    210             break;
    211         case RTFILE_O_READWRITE:
    212             fOpenMode |= fOpen & RTFILE_O_APPEND ? O_APPEND | FWRITE | FREAD : FWRITE | FREAD;
    213             break;
    214         default:
    215             AssertMsgFailed(("RTFileOpen received an invalid RW value, fOpen=%#x\n", fOpen));
    216             return VERR_INVALID_PARAMETER;
    217     }    *phFile = (RTFILENEW)hVnode;
    218 
    219 
    220     vnode_t hVnode = NULL;
    221     errno_t rc = vnode_open(pszFilename, fOpenMode, fCMode, fVnFlags, &hVnode, hVfsCtx)
    222     if (rc != 0)
    223         return RTErrConvertFromErrno(rc);
    224 
    225     vnode_put(hVnode);
    226     *phFile = (RTFILENEW)hVnode;
    227     return VINF_SUCCESS;
     264    else
     265        rc = VERR_INTERNAL_ERROR_5;
     266    RTMemFree(pThis);
     267
     268    return rc;
    228269}
    229270
     
    233274    if (hFile == NIL_RTFILE)
    234275        return VINF_SUCCESS;
    235     vnode_t hVnode = (vnode_t)hFile;
    236     errno_t rc = vnode_close(hVnode, vfs_context_current());
     276
     277    RTFILENEWINT *pThis = hFile;
     278    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
     279    AssertReturn(pThis->u32Magic != RTFILE_MAGIC, VERR_INVALID_HANDLE);
     280    pThis->u32Magic = ~RTFILE_MAGIC;
     281
     282    errno_t rc = vnode_close(pThis->hVnode, pThis->fOpenMode & (FREAD | FWRITE), pThis->hVfsCtx);
     283
     284    RTMemFree(pThis);
    237285    return RTErrConvertFromErrno(rc);
    238286}
     
    241289RTDECL(int) RTFileReadAt(RTFILE hFile, RTFOFF off, void *pvBuf, size_t cbToRead, size_t *pcbRead)
    242290{
    243     return VERR_NOT_IMPLEMENTED;
     291    RTFILENEWINT *pThis = hFile;
     292    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
     293    AssertReturn(pThis->u32Magic != RTFILE_MAGIC, VERR_INVALID_HANDLE);
     294
     295    off_t offNative = (off_t)off;
     296    AssertReturn((RTFOFF)offNative == off, VERR_OUT_OF_RANGE);
     297
     298
     299    errno_t rc;
     300    if (!pcbRead)
     301        rc = vn_rdwr(UIO_READ, pThis->hVnode, (char *)pvBuf, cbToRead, offNative, UIO_SYSSPACE, 0 /*ioflg*/,
     302                     vfs_context_ucred(pThis->hVfsCtx), NULL, vfs_context_proc(pThis->hVfsCtx));
     303    else
     304    {
     305        int cbLeft = 0;
     306        rc = vn_rdwr(UIO_READ, pThis->hVnode, (char *)pvBuf, cbToRead, offNative, UIO_SYSSPACE, 0 /*ioflg*/,
     307                     vfs_context_ucred(pThis->hVfsCtx), &cbLeft, vfs_context_proc(pThis->hVfsCtx));
     308        *pcbRead = cbToRead - cbLeft;
     309    }
     310    return !rc ? VINF_SUCCESS : RTErrConvertFromErrno(rc);
    244311}
    245312
     
    324391
    325392/**
    326  * Check the symbol table against symbols we known symbols. 
    327  * 
    328  * This is done to detect whether the on disk image and the in 
    329  * memory images matches.  Mismatches could stem from user 
     393 * Check the symbol table against symbols we known symbols.
     394 *
     395 * This is done to detect whether the on disk image and the in
     396 * memory images matches.  Mismatches could stem from user
    330397 * replacing the default kernel image on disk.
    331  * 
     398 *
    332399 * @returns IPRT status code.
    333400 * @param   pKernel             The internal scratch data.
     
    411478#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050
    412479        KNOWN_ENTRY(kauth_cred_unref),
    413 #else 
     480#else
    414481        KNOWN_ENTRY(kauth_cred_rele),
    415482#endif
     
    539606                    if (pSym->n_sect != MACHO_NO_SECT)
    540607#else
    541                     if (pSym->n_sect > pKernel->cSections) 
     608                    if (pSym->n_sect > pKernel->cSections)
    542609#endif
    543610                        RETURN_VERR_BAD_EXE_FORMAT;
     
    901968
    902969/**
    903  * Opens symbol table of the mach_kernel. 
    904  * 
     970 * Opens symbol table of the mach_kernel.
     971 *
    905972 * @returns IPRT status code.
    906973 * @param   pszMachKernel   The path to the mach_kernel image.
    907  * @param   ppHandle        Where to return a handle on success. 
     974 * @param   ppHandle        Where to return a handle on success.
    908975 *                          Call rtR0DarwinMachKernelClose on it
    909976 *                          when done.
  • trunk/src/VBox/Runtime/r0drv/darwin/the-darwin-kernel.h

    r37041 r37569  
    6868#include <sys/malloc.h>
    6969#include <sys/proc.h>
     70#include <sys/vnode.h>
     71#include <sys/fcntl.h>
    7072#include <IOKit/IOTypes.h>
    7173#include <IOKit/IOLib.h>
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