tio fixes

This commit is contained in:
TuxSH 2019-04-27 23:23:36 +02:00
parent 54eeb97b24
commit 9b3cc5391b
4 changed files with 71 additions and 32 deletions

View File

@ -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);

View File

@ -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] = '$';

View File

@ -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);

View File

@ -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);