tio fixes
This commit is contained in:
parent
54eeb97b24
commit
9b3cc5391b
@ -38,6 +38,7 @@ typedef struct
|
|||||||
} IFile;
|
} IFile;
|
||||||
|
|
||||||
Result IFile_Open(IFile *file, FS_ArchiveID archiveId, FS_Path archivePath, FS_Path filePath, u32 flags);
|
Result IFile_Open(IFile *file, FS_ArchiveID archiveId, FS_Path archivePath, FS_Path filePath, u32 flags);
|
||||||
|
Result IFile_OpenFromArchive(IFile *file, FS_Archive archive, FS_Path filePath, u32 flags);
|
||||||
Result IFile_Close(IFile *file);
|
Result IFile_Close(IFile *file);
|
||||||
Result IFile_GetSize(IFile *file, u64 *size);
|
Result IFile_GetSize(IFile *file, u64 *size);
|
||||||
Result IFile_Read(IFile *file, u64 *total, void *buffer, u32 len);
|
Result IFile_Read(IFile *file, u64 *total, void *buffer, u32 len);
|
||||||
|
@ -349,8 +349,8 @@ int GDB_SendStreamData(GDBContext *ctx, const char *streamData, u32 offset, u32
|
|||||||
|
|
||||||
int GDB_SendDebugString(GDBContext *ctx, const char *fmt, ...) // unsecure
|
int GDB_SendDebugString(GDBContext *ctx, const char *fmt, ...) // unsecure
|
||||||
{
|
{
|
||||||
if(ctx->state == GDB_STATE_DETACHING || !(ctx->flags & GDB_FLAG_PROCESS_CONTINUING))
|
/*if(ctx->state == GDB_STATE_DETACHING || !(ctx->flags & GDB_FLAG_PROCESS_CONTINUING))
|
||||||
return 0;
|
return 0;*/
|
||||||
|
|
||||||
char formatted[(GDB_BUF_LEN - 1) / 2 + 1];
|
char formatted[(GDB_BUF_LEN - 1) / 2 + 1];
|
||||||
ctx->buffer[0] = '$';
|
ctx->buffer[0] = '$';
|
||||||
|
@ -181,12 +181,19 @@ static int GDB_TioRegisterFile(GDBContext *ctx, Handle h, int gdbOpenFlags)
|
|||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int GDB_MakeUtf16Path(FS_Path *outPath, const char *path)
|
static int GDB_MakeUtf16Path(FS_Path *outPath, const char *pathData)
|
||||||
{
|
{
|
||||||
|
size_t pathDataLen = strlen(pathData);
|
||||||
|
if (pathDataLen % 2 == 1) return GDBHIO_EINVAL;
|
||||||
|
|
||||||
|
char path[PATH_MAX + 1];
|
||||||
|
u32 count = GDB_DecodeHex(path, pathData, pathDataLen / 2);
|
||||||
|
path[count] = 0;
|
||||||
|
|
||||||
u16 *p16 = (u16 *)outPath->data;
|
u16 *p16 = (u16 *)outPath->data;
|
||||||
outPath->type = PATH_UTF16;
|
outPath->type = PATH_UTF16;
|
||||||
|
|
||||||
ssize_t units = utf8_to_utf16(p16, (const u8 *) path, PATH_MAX);
|
ssize_t units = utf8_to_utf16(p16, (const u8 *) path, count);
|
||||||
if (units < 0) return GDBHIO_EINVAL;
|
if (units < 0) return GDBHIO_EINVAL;
|
||||||
else if (units >= PATH_MAX) return GDBHIO_ENAMETOOLONG;
|
else if (units >= PATH_MAX) return GDBHIO_ENAMETOOLONG;
|
||||||
|
|
||||||
@ -200,12 +207,22 @@ static inline int GDB_TioReplyErrno(GDBContext *ctx, int err)
|
|||||||
return GDB_SendFormattedPacket(ctx, "F-1,%lx", (u32)err);
|
return GDB_SendFormattedPacket(ctx, "F-1,%lx", (u32)err);
|
||||||
}
|
}
|
||||||
|
|
||||||
GDB_DECLARE_TIO_HANDLER(Open)
|
static inline FS_ArchiveID GDB_TioGetArchiveId(void)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
s64 out = 1;
|
s64 out = 1;
|
||||||
svcGetSystemInfo(&out, 0x10000, 0x203);
|
svcGetSystemInfo(&out, 0x10000, 0x203);
|
||||||
bool isSdMode = (bool)out;
|
bool isSdMode = (bool)out;
|
||||||
FS_ArchiveID archiveId = isSdMode ? ARCHIVE_SDMC : ARCHIVE_NAND_RW;
|
FS_ArchiveID archiveId = isSdMode ? ARCHIVE_SDMC : ARCHIVE_NAND_RW;
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Actually, only support SD card for security reasons.
|
||||||
|
return ARCHIVE_SDMC;
|
||||||
|
}
|
||||||
|
|
||||||
|
GDB_DECLARE_TIO_HANDLER(Open)
|
||||||
|
{
|
||||||
|
FS_ArchiveID archiveId = GDB_TioGetArchiveId();
|
||||||
u16 fsNameBuf[PATH_MAX + 1];
|
u16 fsNameBuf[PATH_MAX + 1];
|
||||||
FS_Path fsPath;
|
FS_Path fsPath;
|
||||||
fsPath.data = fsNameBuf;
|
fsPath.data = fsNameBuf;
|
||||||
@ -215,7 +232,7 @@ GDB_DECLARE_TIO_HANDLER(Open)
|
|||||||
return GDB_ReplyErrno(ctx, EILSEQ);
|
return GDB_ReplyErrno(ctx, EILSEQ);
|
||||||
|
|
||||||
*comma = 0;
|
*comma = 0;
|
||||||
char *fileName = ctx->commandData;
|
char *fileNameData = ctx->commandData;
|
||||||
|
|
||||||
u32 args[2] = {0};
|
u32 args[2] = {0};
|
||||||
if (GDB_ParseHexIntegerList(args, comma + 1, 2, 0) == NULL)
|
if (GDB_ParseHexIntegerList(args, comma + 1, 2, 0) == NULL)
|
||||||
@ -227,7 +244,7 @@ GDB_DECLARE_TIO_HANDLER(Open)
|
|||||||
if (ctx->numOpenTioFiles >= MAX_TIO_OPEN_FILE)
|
if (ctx->numOpenTioFiles >= MAX_TIO_OPEN_FILE)
|
||||||
return GDB_TioReplyErrno(ctx, GDBHIO_EMFILE);
|
return GDB_TioReplyErrno(ctx, GDBHIO_EMFILE);
|
||||||
|
|
||||||
int err = GDB_MakeUtf16Path(&fsPath, fileName);
|
int err = GDB_MakeUtf16Path(&fsPath, fileNameData);
|
||||||
if (err != 0)
|
if (err != 0)
|
||||||
return GDB_TioReplyErrno(ctx, err);
|
return GDB_TioReplyErrno(ctx, err);
|
||||||
|
|
||||||
@ -254,16 +271,25 @@ GDB_DECLARE_TIO_HANDLER(Open)
|
|||||||
if (err != 0)
|
if (err != 0)
|
||||||
return GDB_TioReplyErrno(ctx, err);
|
return GDB_TioReplyErrno(ctx, err);
|
||||||
|
|
||||||
if ((flags & O_CREAT) && (flags & O_EXCL))
|
FS_Archive ar;
|
||||||
{
|
err = GDB_TioConvertResult(FSUSER_OpenArchive(&ar, archiveId, fsMakePath(PATH_EMPTY, "")));
|
||||||
err = GDB_TioConvertResult(FSUSER_CreateFile(archiveId, fsPath, 0, 0));
|
|
||||||
if (err != 0)
|
if (err != 0)
|
||||||
return GDB_TioReplyErrno(ctx, err);
|
return GDB_TioReplyErrno(ctx, err);
|
||||||
|
|
||||||
|
if ((flags & GDBHIO_O_CREAT) && (flags & GDBHIO_O_EXCL))
|
||||||
|
{
|
||||||
|
err = GDB_TioConvertResult(FSUSER_CreateFile(ar, fsPath, 0, 0));
|
||||||
|
if (err != 0)
|
||||||
|
{
|
||||||
|
FSUSER_CloseArchive(ar);
|
||||||
|
return GDB_TioReplyErrno(ctx, err);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err = GDB_TioConvertResult(IFile_Open(&f, archiveId, fsPath, fsMakePath(PATH_EMPTY, ""), fsFlags));
|
err = GDB_TioConvertResult(IFile_OpenFromArchive(&f, ar, fsPath, fsFlags));
|
||||||
if (err != 0)
|
if (err != 0)
|
||||||
return GDB_TioReplyErrno(ctx, err);
|
__builtin_trap();//return GDB_TioReplyErrno(ctx, err);
|
||||||
|
FSUSER_CloseArchive(ar);
|
||||||
|
|
||||||
if((flags & GDBHIO_O_ACCMODE) != GDBHIO_O_RDONLY && (flags & GDBHIO_O_TRUNC))
|
if((flags & GDBHIO_O_ACCMODE) != GDBHIO_O_RDONLY && (flags & GDBHIO_O_TRUNC))
|
||||||
{
|
{
|
||||||
@ -365,19 +391,17 @@ GDB_DECLARE_TIO_HANDLER(Write)
|
|||||||
|
|
||||||
GDB_DECLARE_TIO_HANDLER(Stat)
|
GDB_DECLARE_TIO_HANDLER(Stat)
|
||||||
{
|
{
|
||||||
char *fileName = ctx->commandData;
|
char *fileNameData = ctx->commandData;
|
||||||
if (*fileName == 0)
|
if (*fileNameData == 0)
|
||||||
return GDB_ReplyErrno(ctx, EILSEQ);
|
return GDB_ReplyErrno(ctx, EILSEQ);
|
||||||
|
|
||||||
s64 out = 1;
|
FS_ArchiveID archiveId = GDB_TioGetArchiveId();
|
||||||
svcGetSystemInfo(&out, 0x10000, 0x203);
|
|
||||||
bool isSdMode = (bool)out;
|
|
||||||
FS_ArchiveID archiveId = isSdMode ? ARCHIVE_SDMC : ARCHIVE_NAND_RW;
|
|
||||||
u16 fsNameBuf[PATH_MAX + 1];
|
u16 fsNameBuf[PATH_MAX + 1];
|
||||||
FS_Path fsPath;
|
FS_Path fsPath;
|
||||||
fsPath.data = fsNameBuf;
|
fsPath.data = fsNameBuf;
|
||||||
|
|
||||||
int err = GDB_MakeUtf16Path(&fsPath, fileName);
|
int err = GDB_MakeUtf16Path(&fsPath, fileNameData);
|
||||||
if (err != 0)
|
if (err != 0)
|
||||||
return GDB_TioReplyErrno(ctx, err);
|
return GDB_TioReplyErrno(ctx, err);
|
||||||
|
|
||||||
@ -430,23 +454,27 @@ GDB_DECLARE_TIO_HANDLER(Stat)
|
|||||||
|
|
||||||
GDB_DECLARE_TIO_HANDLER(Unlink)
|
GDB_DECLARE_TIO_HANDLER(Unlink)
|
||||||
{
|
{
|
||||||
char *fileName = ctx->commandData;
|
char *fileNameData = ctx->commandData;
|
||||||
if (*fileName == 0)
|
if (*fileNameData == 0)
|
||||||
return GDB_ReplyErrno(ctx, EILSEQ);
|
return GDB_ReplyErrno(ctx, EILSEQ);
|
||||||
|
|
||||||
s64 out = 1;
|
FS_ArchiveID archiveId = GDB_TioGetArchiveId();
|
||||||
svcGetSystemInfo(&out, 0x10000, 0x203);
|
|
||||||
bool isSdMode = (bool)out;
|
|
||||||
FS_ArchiveID archiveId = isSdMode ? ARCHIVE_SDMC : ARCHIVE_NAND_RW;
|
|
||||||
u16 fsNameBuf[PATH_MAX + 1];
|
u16 fsNameBuf[PATH_MAX + 1];
|
||||||
FS_Path fsPath;
|
FS_Path fsPath;
|
||||||
fsPath.data = fsNameBuf;
|
fsPath.data = fsNameBuf;
|
||||||
|
|
||||||
int err = GDB_MakeUtf16Path(&fsPath, fileName);
|
int err = GDB_MakeUtf16Path(&fsPath, fileNameData);
|
||||||
if (err != 0)
|
if (err != 0)
|
||||||
return GDB_TioReplyErrno(ctx, err);
|
return GDB_TioReplyErrno(ctx, err);
|
||||||
|
|
||||||
err = GDB_TioConvertResult(FSUSER_DeleteFile(archiveId, fsPath));
|
FS_Archive ar;
|
||||||
|
err = GDB_TioConvertResult(FSUSER_OpenArchive(&ar, archiveId, fsMakePath(PATH_EMPTY, "")));
|
||||||
|
if (err != 0)
|
||||||
|
return GDB_TioReplyErrno(ctx, err);
|
||||||
|
|
||||||
|
err = GDB_TioConvertResult(FSUSER_DeleteFile(ar, fsPath));
|
||||||
|
FSUSER_CloseArchive(ar);
|
||||||
if (err != 0)
|
if (err != 0)
|
||||||
return GDB_TioReplyErrno(ctx, err);
|
return GDB_TioReplyErrno(ctx, err);
|
||||||
|
|
||||||
@ -456,8 +484,8 @@ GDB_DECLARE_TIO_HANDLER(Unlink)
|
|||||||
GDB_DECLARE_TIO_HANDLER(Readlink)
|
GDB_DECLARE_TIO_HANDLER(Readlink)
|
||||||
{
|
{
|
||||||
// Not really supported
|
// Not really supported
|
||||||
char *fileName = ctx->commandData;
|
char *fileNameData = ctx->commandData;
|
||||||
if (*fileName == 0)
|
if (*fileNameData == 0)
|
||||||
return GDB_ReplyErrno(ctx, EILSEQ);
|
return GDB_ReplyErrno(ctx, EILSEQ);
|
||||||
|
|
||||||
return GDB_SendPacket(ctx, "F0;", 3);
|
return GDB_SendPacket(ctx, "F0;", 3);
|
||||||
|
@ -37,6 +37,16 @@ Result IFile_Open(IFile *file, FS_ArchiveID archiveId, FS_Path archivePath, FS_P
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Result IFile_OpenFromArchive(IFile *file, FS_Archive archive, FS_Path filePath, u32 flags)
|
||||||
|
{
|
||||||
|
Result res;
|
||||||
|
|
||||||
|
res = FSUSER_OpenFile(&file->handle, archive, filePath, flags, 0);
|
||||||
|
file->pos = 0;
|
||||||
|
file->size = 0;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
Result IFile_Close(IFile *file)
|
Result IFile_Close(IFile *file)
|
||||||
{
|
{
|
||||||
return FSFILE_Close(file->handle);
|
return FSFILE_Close(file->handle);
|
||||||
|
Reference in New Issue
Block a user