vfs.h revision 667506dc4c739586cde5d4f245677ef5aac62ac2
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** @file
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * IPRT - Virtual Filesystem.
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/*
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * Copyright (C) 2010 Oracle Corporation
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync *
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * available from http://www.virtualbox.org. This file is free software;
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * General Public License (GPL) as published by the Free Software
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync *
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * The contents of this file may alternatively be used under the terms
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * of the Common Development and Distribution License Version 1.0
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * VirtualBox OSE distribution, in which case the provisions of the
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * CDDL are applicable instead of those of the GPL.
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync *
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * You may elect to license modified versions of this file under the
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * terms and conditions of either the GPL or the CDDL or both.
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#ifndef ___iprt_vfs_h
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#define ___iprt_vfs_h
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#include <iprt/cdefs.h>
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#include <iprt/types.h>
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#include <iprt/dir.h>
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#include <iprt/fs.h>
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#include <iprt/symlink.h>
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#include <iprt/sg.h>
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#include <iprt/time.h>
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRT_C_DECLS_BEGIN
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** @defgroup grp_rt_fs RTVfs - Virtual Filesystem
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * @ingroup grp_rt
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync *
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * The virtual filesystem APIs are intended to make it possible to work on
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * container files, file system sub-trees, file system overlays and other custom
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * filesystem configurations. It also makes it possible to create filters, like
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * automatically gunzipping a tar.gz file before feeding it to the RTTar API for
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * unpacking - or wise versa.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync *
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * The virtual filesystem APIs are intended to mirror the RTDir, RTFile, RTPath
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * and RTFs APIs pretty closely so that rewriting a piece of code to work with
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * it should be easy. However there are some differences to the way the APIs
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * works and the user should heed the documentation. The differences are
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * usually motivated by simplification and in some case to make the VFS more
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * flexible.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync *
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * @{
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** Virtual Filesystem handle. */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsynctypedef struct RTVFSINTERNAL *RTVFS;
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** Pointer to a VFS handle. */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsynctypedef RTVFS *PRTVFS;
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** A NIL VFS directory handle. */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#define NIL_RTVFS ((RTVFS)~(uintptr_t)0)
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** Virtual Filesystem directory handle. */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsynctypedef struct RTVFSDIRINTERNAL *RTVFSDIR;
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** Pointer to a VFS directory handle. */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsynctypedef RTVFSDIR *PRTVFSDIR;
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** A NIL VFS directory handle. */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#define NIL_RTVFSDIR ((RTVFSDIR)~(uintptr_t)0)
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** Virtual Filesystem I/O stream handle. */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsynctypedef struct RTVFSIOSTREAMINTERNAL *RTVFSIOSTREAM;
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** Pointer to a VFS I/O stream handle. */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsynctypedef RTVFSIOSTREAM *PRTVFSIOSTREAM;
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** A NIL VFS I/O stream handle. */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#define NIL_RTVFSIOSTREAM ((RTVFSIOSTREAM)~(uintptr_t)0)
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** Virtual Filesystem file handle. */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsynctypedef struct RTVFSFILEINTERNAL *RTVFSFILE;
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** Pointer to a VFS file handle. */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsynctypedef RTVFSFILE *PRTVFSFILE;
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** A NIL VFS file handle. */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#define NIL_RTVFSFILE ((RTVFSFILE)~(uintptr_t)0)
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** Virtual Filesystem symbolic link handle. */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsynctypedef struct RTVFSSYMLINKINTERNAL *RTVFSSYMLINK;
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** Pointer to a VFS symbolic link handle. */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsynctypedef RTVFSSYMLINK *PRTVFSSYMLINK;
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** A NIL VFS symbolic link handle. */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#define NIL_RTVFSSYMLINK ((RTVFSSYMLINK)~(uintptr_t)0)
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** @name RTVfsCreate flags
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * @{ */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** Whether the file system is read-only. */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#define RTVFS_C_READONLY RT_BIT(0)
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** Whether we the VFS should be thread safe (i.e. automaticaly employ
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * locks). */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#define RTVFS_C_THREAD_SAFE RT_BIT(1)
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** @} */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/**
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * Creates an empty virtual filesystem.
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync *
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * @returns IPRT status code.
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * @param pszName Name, for logging and such.
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * @param fFlags Flags, MBZ.
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * @param phVfs Where to return the VFS handle. Release the returned
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * reference by calling RTVfsRelease.
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(int) RTVfsCreate(const char *pszName, uint32_t fFlags, PRTVFS phVfs);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(uint32_t) RTVfsRetain(RTVFS phVfs);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(uint32_t) RTVfsRelease(RTVFS phVfs);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(int) RTVfsAttach(RTVFS hVfs, const char *pszMountPoint, uint32_t fFlags, RTVFS hVfsAttach);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(int) RTVfsDetach(RTVFS hVfs, const char *pszMountPoint, RTVFS hVfsToDetach, PRTVFS *phVfsDetached);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(uint32_t) RTVfsGetAttachmentCount(RTVFS hVfs);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(int) RTVfsGetAttachment(RTVFS hVfs, uint32_t iOrdinal, PRTVFS *phVfsAttached, uint32_t *pfFlags,
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync char *pszMountPoint, size_t cbMountPoint);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** @defgroup grp_vfs_dir VFS Directory API
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * @{
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync */
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync/**
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync * Retains a reference to the VFS directory handle.
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync *
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync * @returns New reference count on success, UINT32_MAX on failure.
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync * @param hVfsDir The VFS directory handle.
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync */
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsyncRTDECL(uint32_t) RTVfsDirRetain(RTVFSDIR hVfsDir);
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync/**
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync * Releases a reference to the VFS directory handle.
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync *
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync * @returns New reference count on success (0 if closed), UINT32_MAX on failure.
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync * @param hVfsIos The VFS directory handle.
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync */
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsyncRTDECL(uint32_t) RTVfsDirRelease(RTVFSDIR hVfsDir);
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync/** @} */
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync/** @defgroup grp_vfs_iostream VFS Symbolic Link API
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync * @{
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync */
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync/**
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync * Read the symbolic link target.
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync *
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync * @returns IPRT status code.
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync * @param hVfsSym The VFS symbolic link handle.
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync * @param pszTarget The target buffer.
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync * @param cbTarget The size of the target buffer.
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync * @sa RTSymlinkRead
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync */
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsyncRTDECL(int) RTVfsSymlinkRead(RTVFSSYMLINK hVfsSym, char *pszTarget, size_t cbTarget);
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** @} */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync/** @defgroup grp_vfs_iostream VFS I/O Stream API
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * @{
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync */
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync/**
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * Retains a reference to the VFS I/O stream handle.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync *
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @returns New reference count on success, UINT32_MAX on failure.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @param hVfsIos The VFS I/O stream handle.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(uint32_t) RTVfsIoStrmRetain(RTVFSIOSTREAM hVfsIos);
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync/**
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * Releases a reference to the VFS I/O stream handle.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync *
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @returns New reference count on success (0 if closed), UINT32_MAX on failure.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @param hVfsIos The VFS I/O stream handle.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(uint32_t) RTVfsIoStrmRelease(RTVFSIOSTREAM hVfsIos);
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync/**
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * Convert the VFS I/O stream handle to a VFS file handle.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync *
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @returns The VFS file handle on success, this must be released.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * NIL_RTVFSFILE if the I/O stream handle is invalid.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @param hVfsIos The VFS I/O stream handle.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @sa RTVfsFileToIoStream
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(RTVFSFILE) RTVfsIoStrmToFile(RTVFSIOSTREAM hVfsIos);
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync/**
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * Query information about the I/O stream.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync *
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @returns IPRT status code.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @param hVfsIos The VFS I/O stream handle.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @param pObjInfo Where to return the info.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @param enmAddAttr Which additional attributes should be retrieved.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @sa RTFileQueryInfo
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(int) RTVfsIoStrmQueryInfo(RTVFSIOSTREAM hVfsIos, PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAddAttr);
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync/**
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * Read bytes from the I/O stream.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync *
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @returns IPRT status code.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @param hVfsIos The VFS I/O stream handle.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @param pvBuf Where to store the read bytes.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @param cbToRead The number of bytes to read.
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * @param pcbRead Where to always store the number of bytes actually
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * read. If this is NULL, the call will block until
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * @a cbToRead bytes are available. If this is
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * non-NULL, the call will not block and return what
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * is currently avaiable.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @sa RTFileRead, RTPipeRead, RTPipeReadBlocking, RTSocketRead
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(int) RTVfsIoStrmRead(RTVFSIOSTREAM hVfsIos, void *pvBuf, size_t cbToRead, size_t *pcbRead);
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync/**
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * Write bytes to the I/O stream.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync *
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @returns IPRT status code.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @param hVfsIos The VFS I/O stream handle.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @param pvBuf The bytes to write.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @param cbToWrite The number of bytes to write.
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * @param pcbWritten Where to always store the number of bytes actually
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * written. If this is NULL, the call will block
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * until
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * @a cbToWrite bytes are available. If this is
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * non-NULL, the call will not block and return after
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * writing what is possible.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @sa RTFileWrite, RTPipeWrite, RTPipeWriteBlocking, RTSocketWrite
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(int) RTVfsIoStrmWrite(RTVFSIOSTREAM hVfsIos, const void *pvBuf, size_t cbToWrite, size_t *pcbWritten);
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync/**
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * Reads bytes from the I/O stream into a scatter buffer.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync *
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @returns IPRT status code.
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * @retval VINF_SUCCESS and the number of bytes read written to @a pcbRead.
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * @retval VINF_TRY_AGAIN if @a fBlocking is @c false, @a pcbRead is not NULL,
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * and no data was available. @a *pcbRead will be set to 0.
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * @retval VINF_EOF when trying to read __beyond__ the end of the stream and
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * @a pcbRead is not NULL (it will be set to the number of bytes read,
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * or 0 if the end of the stream was reached before this call).
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * When the last byte of the read request is the last byte in the
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * stream, this status code will not be used. However, VINF_EOF is
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * returned when attempting to read 0 bytes while standing at the end
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * of the stream.
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * @retval VERR_EOF when trying to read __beyond__ the end of the stream and
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * @a pcbRead is NULL.
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync *
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @param hVfsIos The VFS I/O stream handle.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @param pSgBuf Pointer to a scatter buffer descriptor. The number
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * of bytes described by the segments is what will be
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * attemted read.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @param fBlocking Whether the call is blocking (@c true) or not. If
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * not, the @a pcbRead parameter must not be NULL.
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * @param pcbRead Where to always store the number of bytes actually
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * read. This can be NULL if @a fBlocking is true.
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * @sa RTFileSgRead, RTSocketSgRead, RTPipeRead, RTPipeReadBlocking
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync */
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsyncRTDECL(int) RTVfsIoStrmSgRead(RTVFSIOSTREAM hVfsIos, PCRTSGBUF pSgBuf, bool fBlocking, size_t *pcbRead);
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync/**
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * Write bytes to the I/O stream from a gather buffer.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync *
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @returns IPRT status code.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @param hVfsIos The VFS I/O stream handle.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @param pSgBuf Pointer to a gather buffer descriptor. The number
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * of bytes described by the segments is what will be
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * attemted written.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @param fBlocking Whether the call is blocking (@c true) or not. If
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * not, the @a pcbWritten parameter must not be NULL.
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * @param pcbRead Where to always store the number of bytes actually
667506dc4c739586cde5d4f245677ef5aac62ac2vboxsync * written. This can be NULL if @a fBlocking is true.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @sa RTFileSgWrite, RTSocketSgWrite
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync */
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsyncRTDECL(int) RTVfsIoStrmSgWrite(RTVFSIOSTREAM hVfsIos, PCRTSGBUF pSgBuf, bool fBlocking, size_t *pcbWritten);
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync/**
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * Flush any buffered data to the I/O stream.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync *
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @returns IPRT status code.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @param hVfsIos The VFS I/O stream handle.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @sa RTFileFlush, RTPipeFlush
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(int) RTVfsIoStrmFlush(RTVFSIOSTREAM hVfsIos);
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync/**
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * Poll for events.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync *
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @returns IPRT status code.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @param hVfsIos The VFS I/O stream handle.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @param fEvents The events to poll for (RTPOLL_EVT_XXX).
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @param cMillies How long to wait for event to eventuate.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @param fIntr Whether the wait is interruptible and can return
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * VERR_INTERRUPTED (@c true) or if this condition
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * should be hidden from the caller (@c false).
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @param pfRetEvents Where to return the event mask.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @sa RTPollSetAdd, RTPoll, RTPollNoResume.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(RTFOFF) RTVfsIoStrmPoll(RTVFSIOSTREAM hVfsIos, uint32_t fEvents, RTMSINTERVAL cMillies, bool fIntr,
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync uint32_t *pfRetEvents);
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync/**
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * Tells the current I/O stream position.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync *
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @returns Zero or higher - where to return the I/O stream offset. Values
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * below zero are IPRT status codes (VERR_XXX).
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @param hVfsIos The VFS I/O stream handle.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @sa RTFileTell
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(RTFOFF) RTVfsIoStrmTell(RTVFSIOSTREAM hVfsIos);
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync/**
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync * Skips @a cb ahead in the stream.
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync *
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync * @returns IPRT status code.
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync * @param hVfsIos The VFS I/O stream handle.
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync * @param cb The number bytes to skip.
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync */
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsyncRTDECL(int) RTVfsIoStrmSkip(RTVFSIOSTREAM hVfsIos, RTFOFF cb);
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync/**
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync * Fills the stream with @a cb zeros.
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync *
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync * @returns IPRT status code.
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync * @param hVfsIos The VFS I/O stream handle.
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync * @param cb The number of zero bytes to insert.
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsync */
d6c4b5eecea7735227dc41255d4e742543ddc86fvboxsyncRTDECL(int) RTVfsIoStrmZeroFill(RTVFSIOSTREAM hVfsIos, RTFOFF cb);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** @} */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** @defgroup grp_vfs_file VFS File API
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * @{
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(int) RTVfsFileOpen(RTVFS hVfs, const char *pszFilename, uint32_t fOpen, PRTVFSFILE phVfsFile);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/**
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * Create a VFS file handle from a standard IPRT file handle (RTFILE).
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync *
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * @returns IPRT status code.
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * @param hFile The standard IPRT file handle.
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * @param fOpen The flags the handle was opened with. Pass 0 to
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * have these detected.
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * @param fLeaveOpen Whether to leave the handle open when the VFS file
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * is released, or to close it (@c false).
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * @param phVfsFile Where to return the VFS file handle.
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(int) RTVfsFileFromRTFile(RTFILE hFile, uint32_t fOpen, bool fLeaveOpen, PRTVFSFILE phVfsFile);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(RTHCUINTPTR) RTVfsFileToNative(RTFILE hVfsFile);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/**
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * Convert the VFS file handle to a VFS I/O stream handle.
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync *
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * @returns The VFS I/O stream handle on success, this must be released.
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * NIL_RTVFSIOSTREAM if the file handle is invalid.
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * @param hVfsFile The VFS file handle.
404df8b2baf3f931a57bffd773b093d0fe40cd50vboxsync * @sa RTVfsIoStrmToFile
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(RTVFSIOSTREAM) RTVfsFileToIoStream(RTVFSFILE hVfsFile);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/**
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * Retains a reference to the VFS file handle.
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync *
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * @returns New reference count on success, UINT32_MAX on failure.
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * @param hVfsFile The VFS file handle.
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(uint32_t) RTVfsFileRetain(RTVFSFILE hVfsFile);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/**
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * Releases a reference to the VFS file handle.
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync *
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * @returns New reference count on success (0 if closed), UINT32_MAX on failure.
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync * @param hVfsFile The VFS file handle.
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(uint32_t) RTVfsFileRelease(RTVFSFILE hVfsFile);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(int) RTVfsFileQueryInfo(RTVFSFILE hVfsFile, PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAddAttr);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(int) RTVfsFileRead(RTVFSFILE hVfsFile, void *pvBuf, size_t cbToRead, size_t *pcbRead);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(int) RTVfsFileReadAt(RTVFSFILE hVfsFile, RTFOFF off, void *pvBuf, size_t cbToRead, size_t *pcbRead);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(int) RTVfsFileWrite(RTVFSFILE hVfsFile, const void *pvBuf, size_t cbToWrite, size_t *pcbWritten);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(int) RTVfsFileWriteAt(RTVFSFILE hVfsFile, RTFOFF off, const void *pvBuf, size_t cbToWrite, size_t *pcbWritten);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(int) RTVfsFileFlush(RTVFSFILE hVfsFile);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(RTFOFF) RTVfsFilePoll(RTVFSFILE hVfsFile, uint32_t fEvents, RTMSINTERVAL cMillies, bool fIntr,
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync uint32_t *pfRetEvents);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(RTFOFF) RTVfsFileTell(RTVFSFILE hVfsFile);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(int) RTVfsFileSeek(RTVFSFILE hVfsFile, RTFOFF offSeek, uint32_t uMethod, uint64_t *poffActual);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(int) RTVfsFileSetSize(RTVFSFILE hVfsFile, uint64_t cbSize);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(int) RTVfsFileGetSize(RTVFSFILE hVfsFile, uint64_t *pcbSize);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(RTFOFF) RTVfsFileGetMaxSize(RTVFSFILE hVfsFile);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRTDECL(int) RTVfsFileGetMaxSizeEx(RTVFSFILE hVfsFile, PRTFOFF pcbMax);
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** @} */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync/** @} */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsyncRT_C_DECLS_END
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync#endif /* !___iprt_vfs_h */
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync
4e38f78b4916ef128a3902ed2a8d7e8d7f947d8dvboxsync