1
/* $Id: filesystem.cpp $ */
3
* IPRT Filesystem API (Filesystem) - generic code.
7
* Copyright (C) 2012 Oracle Corporation
9
* This file is part of VirtualBox Open Source Edition (OSE), as
10
* available from http://www.virtualbox.org. This file is free software;
11
* you can redistribute it and/or modify it under the terms of the GNU
12
* General Public License (GPL) as published by the Free Software
13
* Foundation, in version 2 as it comes in the "COPYING" file of the
14
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17
* The contents of this file may alternatively be used under the terms
18
* of the Common Development and Distribution License Version 1.0
19
* (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20
* VirtualBox OSE distribution, in which case the provisions of the
21
* CDDL are applicable instead of those of the GPL.
23
* You may elect to license modified versions of this file under the
24
* terms and conditions of either the GPL or the CDDL or both.
28
/*******************************************************************************
30
*******************************************************************************/
31
#define LOG_GROUP LOG_GROUP_DEFAULT
32
#include <iprt/types.h>
33
#include <iprt/assert.h>
35
#include <iprt/filesystem.h>
38
#include <iprt/string.h>
39
#include <iprt/list.h>
40
#include "internal/filesystem.h"
42
/*******************************************************************************
44
*******************************************************************************/
47
* Supported volume formats.
49
static PCRTFILESYSTEMDESC g_aFsFmts[] =
54
static int rtFsGetFormat(RTVFSFILE hVfsFile, PCRTFILESYSTEMDESC *ppFsDesc)
56
int rc = VINF_SUCCESS;
57
uint32_t uScoreMax = RTFILESYSTEM_MATCH_SCORE_UNSUPPORTED;
58
PCRTFILESYSTEMDESC pFsFmtMatch = NULL;
60
for (unsigned i = 0; i < RT_ELEMENTS(g_aFsFmts); i++)
63
PCRTFILESYSTEMDESC pFsFmt = g_aFsFmts[i];
65
rc = pFsFmt->pfnProbe(hVfsFile, &uScore);
67
&& uScore > uScoreMax)
72
else if (RT_FAILURE(rc))
78
if (uScoreMax > RTFILESYSTEM_MATCH_SCORE_UNSUPPORTED)
80
AssertPtr(pFsFmtMatch);
81
*ppFsDesc = pFsFmtMatch;
84
rc = VERR_NOT_SUPPORTED;
90
RTDECL(int) RTFilesystemVfsFromFile(RTVFSFILE hVfsFile, PRTVFS phVfs)
92
int rc = VINF_SUCCESS;
93
PCRTFILESYSTEMDESC pFsDesc = NULL;
94
RTVFS hVfs = NIL_RTVFS;
97
AssertPtrReturn(hVfsFile, VERR_INVALID_HANDLE);
98
AssertPtrReturn(phVfs, VERR_INVALID_POINTER);
100
rc = rtFsGetFormat(hVfsFile, &pFsDesc);
103
rc = RTVfsNew(&pFsDesc->VfsOps, pFsDesc->cbFs, NIL_RTVFS, NIL_RTVFSLOCK,
107
rc = pFsDesc->pfnInit(pvThis, hVfsFile);