Bring FS up to date.
This commit is contained in:
parent
c49480f5d5
commit
324fcff1dc
@ -49,6 +49,7 @@ extern "C" {
|
|||||||
#include <3ds/services/mvd.h>
|
#include <3ds/services/mvd.h>
|
||||||
#include <3ds/services/news.h>
|
#include <3ds/services/news.h>
|
||||||
#include <3ds/services/qtm.h>
|
#include <3ds/services/qtm.h>
|
||||||
|
#include <3ds/services/srvpm.h>
|
||||||
#include <3ds/services/y2r.h>
|
#include <3ds/services/y2r.h>
|
||||||
#include <3ds/services/hb.h>
|
#include <3ds/services/hb.h>
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -11,14 +11,6 @@
|
|||||||
/// The maximum value of a u64.
|
/// The maximum value of a u64.
|
||||||
#define U64_MAX UINT64_MAX
|
#define U64_MAX UINT64_MAX
|
||||||
|
|
||||||
/// Possible media types.
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
mediatype_NAND, ///< NAND
|
|
||||||
mediatype_SDMC, ///< SDMC
|
|
||||||
mediatype_GAMECARD, ///< Game card
|
|
||||||
} mediatypes_enum;
|
|
||||||
|
|
||||||
typedef uint8_t u8; ///< 8-bit unsigned integer
|
typedef uint8_t u8; ///< 8-bit unsigned integer
|
||||||
typedef uint16_t u16; ///< 16-bit unsigned integer
|
typedef uint16_t u16; ///< 16-bit unsigned integer
|
||||||
typedef uint32_t u32; ///< 32-bit unsigned integer
|
typedef uint32_t u32; ///< 32-bit unsigned integer
|
||||||
|
@ -400,10 +400,10 @@ static bool ndspFindAndLoadComponent(void)
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
static const char dsp_filename[] = "/3ds/dspfirm.cdc";
|
static const char dsp_filename[] = "/3ds/dspfirm.cdc";
|
||||||
FS_archive arch = { ARCH_SDMC, { PATH_EMPTY, 1, (u8*)"" }, 0, 0 };
|
FS_Archive arch = { ARCHIVE_SDMC, { PATH_EMPTY, 1, (u8*)"" }, 0 };
|
||||||
FS_path path = { PATH_CHAR, sizeof(dsp_filename), (u8*)dsp_filename };
|
FS_Path path = { PATH_ASCII, sizeof(dsp_filename), (u8*)dsp_filename };
|
||||||
|
|
||||||
rc = FSUSER_OpenFileDirectly(&rsrc, arch, path, FS_OPEN_READ, FS_ATTRIBUTE_NONE);
|
rc = FSUSER_OpenFileDirectly(&rsrc, arch, path, FS_OPEN_READ, 0);
|
||||||
if (R_FAILED(rc)) break;
|
if (R_FAILED(rc)) break;
|
||||||
|
|
||||||
u64 size = 0;
|
u64 size = 0;
|
||||||
|
@ -137,10 +137,10 @@ Result romfsInit(void)
|
|||||||
if (units == (size_t)-1) return 3;
|
if (units == (size_t)-1) return 3;
|
||||||
__utf16path[units] = 0;
|
__utf16path[units] = 0;
|
||||||
|
|
||||||
FS_archive arch = { ARCH_SDMC, { PATH_EMPTY, 1, (u8*)"" }, 0, 0 };
|
FS_Archive arch = { ARCHIVE_SDMC, { PATH_EMPTY, 1, (u8*)"" }, 0 };
|
||||||
FS_path path = { PATH_WCHAR, (units+1)*2, (u8*)__utf16path };
|
FS_Path path = { PATH_UTF16, (units+1)*2, (u8*)__utf16path };
|
||||||
|
|
||||||
Result rc = FSUSER_OpenFileDirectly(&romFS_file, arch, path, FS_OPEN_READ, FS_ATTRIBUTE_NONE);
|
Result rc = FSUSER_OpenFileDirectly(&romFS_file, arch, path, FS_OPEN_READ, 0);
|
||||||
if (R_FAILED(rc)) return rc;
|
if (R_FAILED(rc)) return rc;
|
||||||
|
|
||||||
_3DSX_Header hdr;
|
_3DSX_Header hdr;
|
||||||
@ -155,10 +155,10 @@ Result romfsInit(void)
|
|||||||
u8 zeros[0xC];
|
u8 zeros[0xC];
|
||||||
memset(zeros, 0, sizeof(zeros));
|
memset(zeros, 0, sizeof(zeros));
|
||||||
|
|
||||||
FS_archive arch = { ARCH_ROMFS, { PATH_EMPTY, 1, (u8*)"" }, 0, 0 };
|
FS_Archive arch = { ARCHIVE_ROMFS, { PATH_EMPTY, 1, (u8*)"" }, 0 };
|
||||||
FS_path path = { PATH_BINARY, sizeof(zeros), zeros };
|
FS_Path path = { PATH_BINARY, sizeof(zeros), zeros };
|
||||||
|
|
||||||
Result rc = FSUSER_OpenFileDirectly(&romFS_file, arch, path, FS_OPEN_READ, FS_ATTRIBUTE_NONE);
|
Result rc = FSUSER_OpenFileDirectly(&romFS_file, arch, path, FS_OPEN_READ, 0);
|
||||||
if (R_FAILED(rc)) return rc;
|
if (R_FAILED(rc)) return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,8 +60,8 @@ typedef struct
|
|||||||
/*! Open directory struct */
|
/*! Open directory struct */
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
Handle fd; /*! CTRU handle */
|
Handle fd; /*! CTRU handle */
|
||||||
FS_dirent entry_data; /*! Temporary storage for reading entries */
|
FS_DirectoryEntry entry_data; /*! Temporary storage for reading entries */
|
||||||
} sdmc_dir_t;
|
} sdmc_dir_t;
|
||||||
|
|
||||||
/*! SDMC devoptab */
|
/*! SDMC devoptab */
|
||||||
@ -97,9 +97,9 @@ sdmc_devoptab =
|
|||||||
};
|
};
|
||||||
|
|
||||||
/*! SDMC archive handle */
|
/*! SDMC archive handle */
|
||||||
static FS_archive sdmcArchive =
|
static FS_Archive sdmcArchive =
|
||||||
{
|
{
|
||||||
.id = ARCH_SDMC,
|
.id = ARCHIVE_SDMC,
|
||||||
.lowPath =
|
.lowPath =
|
||||||
{
|
{
|
||||||
.type = PATH_EMPTY,
|
.type = PATH_EMPTY,
|
||||||
@ -178,12 +178,12 @@ sdmc_fixpath(struct _reent *r,
|
|||||||
return __fixedpath;
|
return __fixedpath;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const FS_path
|
static const FS_Path
|
||||||
sdmc_utf16path(struct _reent *r,
|
sdmc_utf16path(struct _reent *r,
|
||||||
const char *path)
|
const char *path)
|
||||||
{
|
{
|
||||||
size_t units;
|
size_t units;
|
||||||
FS_path fspath;
|
FS_Path fspath;
|
||||||
|
|
||||||
fspath.data = NULL;
|
fspath.data = NULL;
|
||||||
|
|
||||||
@ -205,7 +205,7 @@ sdmc_utf16path(struct _reent *r,
|
|||||||
|
|
||||||
__utf16path[units] = 0;
|
__utf16path[units] = 0;
|
||||||
|
|
||||||
fspath.type = PATH_WCHAR;
|
fspath.type = PATH_UTF16;
|
||||||
fspath.size = (units+1)*sizeof(uint16_t);
|
fspath.size = (units+1)*sizeof(uint16_t);
|
||||||
fspath.data = (const u8*)__utf16path;
|
fspath.data = (const u8*)__utf16path;
|
||||||
|
|
||||||
@ -316,11 +316,11 @@ sdmc_open(struct _reent *r,
|
|||||||
int flags,
|
int flags,
|
||||||
int mode)
|
int mode)
|
||||||
{
|
{
|
||||||
Handle fd;
|
Handle fd;
|
||||||
Result rc;
|
Result rc;
|
||||||
u32 sdmc_flags = 0;
|
u32 sdmc_flags = 0;
|
||||||
u32 attributes = FS_ATTRIBUTE_NONE;
|
u32 attributes = 0;
|
||||||
FS_path fs_path;
|
FS_Path fs_path;
|
||||||
|
|
||||||
fs_path = sdmc_utf16path(r, path);
|
fs_path = sdmc_utf16path(r, path);
|
||||||
if(fs_path.data == NULL)
|
if(fs_path.data == NULL)
|
||||||
@ -365,7 +365,7 @@ sdmc_open(struct _reent *r,
|
|||||||
/* Test O_EXCL. */
|
/* Test O_EXCL. */
|
||||||
if((flags & O_CREAT) && (flags & O_EXCL))
|
if((flags & O_CREAT) && (flags & O_EXCL))
|
||||||
{
|
{
|
||||||
rc = FSUSER_CreateFile(sdmcArchive, fs_path, 0);
|
rc = FSUSER_CreateFile(sdmcArchive, fs_path, attributes, 0);
|
||||||
if(R_FAILED(rc))
|
if(R_FAILED(rc))
|
||||||
{
|
{
|
||||||
r->_errno = sdmc_translate_error(rc);
|
r->_errno = sdmc_translate_error(rc);
|
||||||
@ -662,14 +662,13 @@ sdmc_stat(struct _reent *r,
|
|||||||
{
|
{
|
||||||
Handle fd;
|
Handle fd;
|
||||||
Result rc;
|
Result rc;
|
||||||
FS_path fs_path;
|
FS_Path fs_path;
|
||||||
|
|
||||||
fs_path = sdmc_utf16path(r, file);
|
fs_path = sdmc_utf16path(r, file);
|
||||||
if(fs_path.data == NULL)
|
if(fs_path.data == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if(R_SUCCEEDED(rc = FSUSER_OpenFile(&fd, sdmcArchive, fs_path,
|
if(R_SUCCEEDED(rc = FSUSER_OpenFile(&fd, sdmcArchive, fs_path, FS_OPEN_READ, 0)))
|
||||||
FS_OPEN_READ, FS_ATTRIBUTE_NONE)))
|
|
||||||
{
|
{
|
||||||
sdmc_file_t tmpfd = { .fd = fd };
|
sdmc_file_t tmpfd = { .fd = fd };
|
||||||
rc = sdmc_fstat(r, (int)&tmpfd, st);
|
rc = sdmc_fstat(r, (int)&tmpfd, st);
|
||||||
@ -721,7 +720,7 @@ sdmc_unlink(struct _reent *r,
|
|||||||
const char *name)
|
const char *name)
|
||||||
{
|
{
|
||||||
Result rc;
|
Result rc;
|
||||||
FS_path fs_path;
|
FS_Path fs_path;
|
||||||
|
|
||||||
fs_path = sdmc_utf16path(r, name);
|
fs_path = sdmc_utf16path(r, name);
|
||||||
if(fs_path.data == NULL)
|
if(fs_path.data == NULL)
|
||||||
@ -749,7 +748,7 @@ sdmc_chdir(struct _reent *r,
|
|||||||
{
|
{
|
||||||
Handle fd;
|
Handle fd;
|
||||||
Result rc;
|
Result rc;
|
||||||
FS_path fs_path;
|
FS_Path fs_path;
|
||||||
|
|
||||||
fs_path = sdmc_utf16path(r, name);
|
fs_path = sdmc_utf16path(r, name);
|
||||||
if(fs_path.data == NULL)
|
if(fs_path.data == NULL)
|
||||||
@ -782,7 +781,7 @@ sdmc_rename(struct _reent *r,
|
|||||||
const char *newName)
|
const char *newName)
|
||||||
{
|
{
|
||||||
Result rc;
|
Result rc;
|
||||||
FS_path fs_path_old, fs_path_new;
|
FS_Path fs_path_old, fs_path_new;
|
||||||
static uint16_t __utf16path_old[PATH_MAX+1];
|
static uint16_t __utf16path_old[PATH_MAX+1];
|
||||||
|
|
||||||
fs_path_old = sdmc_utf16path(r, oldName);
|
fs_path_old = sdmc_utf16path(r, oldName);
|
||||||
@ -823,7 +822,7 @@ sdmc_mkdir(struct _reent *r,
|
|||||||
int mode)
|
int mode)
|
||||||
{
|
{
|
||||||
Result rc;
|
Result rc;
|
||||||
FS_path fs_path;
|
FS_Path fs_path;
|
||||||
|
|
||||||
fs_path = sdmc_utf16path(r, path);
|
fs_path = sdmc_utf16path(r, path);
|
||||||
if(fs_path.data == NULL)
|
if(fs_path.data == NULL)
|
||||||
@ -831,7 +830,7 @@ sdmc_mkdir(struct _reent *r,
|
|||||||
|
|
||||||
/* TODO: Use mode to set directory attributes. */
|
/* TODO: Use mode to set directory attributes. */
|
||||||
|
|
||||||
rc = FSUSER_CreateDirectory(sdmcArchive, fs_path);
|
rc = FSUSER_CreateDirectory(sdmcArchive, fs_path, 0);
|
||||||
if(R_SUCCEEDED(rc))
|
if(R_SUCCEEDED(rc))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -855,7 +854,7 @@ sdmc_diropen(struct _reent *r,
|
|||||||
{
|
{
|
||||||
Handle fd;
|
Handle fd;
|
||||||
Result rc;
|
Result rc;
|
||||||
FS_path fs_path;
|
FS_Path fs_path;
|
||||||
|
|
||||||
fs_path = sdmc_utf16path(r, path);
|
fs_path = sdmc_utf16path(r, path);
|
||||||
|
|
||||||
@ -931,7 +930,7 @@ sdmc_dirnext(struct _reent *r,
|
|||||||
|
|
||||||
/* fill in the stat info */
|
/* fill in the stat info */
|
||||||
filestat->st_ino = 0;
|
filestat->st_ino = 0;
|
||||||
if(dir->entry_data.isDirectory)
|
if(dir->entry_data.attributes & FS_ATTRIBUTE_DIRECTORY)
|
||||||
filestat->st_mode = S_IFDIR;
|
filestat->st_mode = S_IFDIR;
|
||||||
else
|
else
|
||||||
filestat->st_mode = S_IFREG;
|
filestat->st_mode = S_IFREG;
|
||||||
@ -999,24 +998,21 @@ sdmc_statvfs(struct _reent *r,
|
|||||||
struct statvfs *buf)
|
struct statvfs *buf)
|
||||||
{
|
{
|
||||||
Result rc;
|
Result rc;
|
||||||
u32 clusterSize, numClusters, freeClusters;
|
FS_ArchiveResource resource;
|
||||||
u8 writable = 0;
|
bool writable = false;
|
||||||
|
|
||||||
rc = FSUSER_GetSdmcArchiveResource(NULL,
|
rc = FSUSER_GetSdmcArchiveResource(&resource);
|
||||||
&clusterSize,
|
|
||||||
&numClusters,
|
|
||||||
&freeClusters);
|
|
||||||
|
|
||||||
if(R_SUCCEEDED(rc))
|
if(R_SUCCEEDED(rc))
|
||||||
{
|
{
|
||||||
buf->f_bsize = clusterSize;
|
buf->f_bsize = resource.clusterSize;
|
||||||
buf->f_frsize = clusterSize;
|
buf->f_frsize = resource.clusterSize;
|
||||||
buf->f_blocks = numClusters;
|
buf->f_blocks = resource.totalClusters;
|
||||||
buf->f_bfree = freeClusters;
|
buf->f_bfree = resource.freeClusters;
|
||||||
buf->f_bavail = freeClusters;
|
buf->f_bavail = resource.freeClusters;
|
||||||
buf->f_files = 0; //??? how to get
|
buf->f_files = 0; //??? how to get
|
||||||
buf->f_ffree = freeClusters;
|
buf->f_ffree = resource.freeClusters;
|
||||||
buf->f_favail = freeClusters;
|
buf->f_favail = resource.freeClusters;
|
||||||
buf->f_fsid = 0; //??? how to get
|
buf->f_fsid = 0; //??? how to get
|
||||||
buf->f_flag = ST_NOSUID;
|
buf->f_flag = ST_NOSUID;
|
||||||
buf->f_namemax = 0; //??? how to get
|
buf->f_namemax = 0; //??? how to get
|
||||||
@ -1141,7 +1137,7 @@ sdmc_rmdir(struct _reent *r,
|
|||||||
const char *name)
|
const char *name)
|
||||||
{
|
{
|
||||||
Result rc;
|
Result rc;
|
||||||
FS_path fs_path;
|
FS_Path fs_path;
|
||||||
|
|
||||||
fs_path = sdmc_utf16path(r, name);
|
fs_path = sdmc_utf16path(r, name);
|
||||||
if(fs_path.data == NULL)
|
if(fs_path.data == NULL)
|
||||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user