mirror of
https://github.com/wiiu-env/wut.git
synced 2025-01-08 13:40:40 +01:00
Allocate FSCmdBlock per-operation to avoid sharing conflicts between threads
This commit is contained in:
parent
e254ea3ce2
commit
bdac0fc52b
122
crt/fs_dev.c
122
crt/fs_dev.c
@ -109,9 +109,6 @@ fs_devoptab =
|
|||||||
FSClient *
|
FSClient *
|
||||||
fsClient = NULL;
|
fsClient = NULL;
|
||||||
|
|
||||||
FSCmdBlock *
|
|
||||||
fsCmd = NULL;
|
|
||||||
|
|
||||||
static bool fsInitialised = false;
|
static bool fsInitialised = false;
|
||||||
|
|
||||||
/* Initialize device */
|
/* Initialize device */
|
||||||
@ -125,7 +122,7 @@ fsDevInit()
|
|||||||
}
|
}
|
||||||
|
|
||||||
fsClient = memalign(0x20, sizeof(FSClient));
|
fsClient = memalign(0x20, sizeof(FSClient));
|
||||||
fsCmd = memalign(0x20, sizeof(FSCmdBlock));
|
FSCmdBlock* fsCmd = memalign(0x20, sizeof(FSCmdBlock));
|
||||||
FSMountSource mountSource;
|
FSMountSource mountSource;
|
||||||
char mountPath[0x80];
|
char mountPath[0x80];
|
||||||
char workDir[0x83];
|
char workDir[0x83];
|
||||||
@ -171,6 +168,8 @@ fsDevInit()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(fsCmd);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -188,7 +187,7 @@ fs_fixpath(struct _reent *r,
|
|||||||
r->_errno = ENAMETOOLONG;
|
r->_errno = ENAMETOOLONG;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *__fixedpath = memalign(0x40, PATH_MAX+1);
|
char *__fixedpath = memalign(0x40, PATH_MAX+1);
|
||||||
|
|
||||||
if (__fixedpath == NULL) {
|
if (__fixedpath == NULL) {
|
||||||
@ -222,7 +221,6 @@ fsDevExit()
|
|||||||
|
|
||||||
FSDelClient(fsClient, -1);
|
FSDelClient(fsClient, -1);
|
||||||
free(fsClient);
|
free(fsClient);
|
||||||
free(fsCmd);
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -276,6 +274,10 @@ fs_open(struct _reent *r,
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// Set up command block
|
||||||
|
FSCmdBlock* fsCmd = memalign(0x20, sizeof(FSCmdBlock));
|
||||||
|
FSInitCmdBlock(fsCmd);
|
||||||
|
|
||||||
// Open the file
|
// Open the file
|
||||||
rc = FSOpenFile(fsClient, fsCmd, path_fixed, fs_mode, &fd, -1);
|
rc = FSOpenFile(fsClient, fsCmd, path_fixed, fs_mode, &fd, -1);
|
||||||
|
|
||||||
@ -284,9 +286,11 @@ fs_open(struct _reent *r,
|
|||||||
file->flags = (flags & (O_ACCMODE|O_APPEND|O_SYNC));
|
file->flags = (flags & (O_ACCMODE|O_APPEND|O_SYNC));
|
||||||
FSGetPosFile(fsClient, fsCmd, fd, &file->offset, -1);
|
FSGetPosFile(fsClient, fsCmd, fd, &file->offset, -1);
|
||||||
free(path_fixed);
|
free(path_fixed);
|
||||||
|
free(fsCmd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(fsCmd);
|
||||||
free(path_fixed);
|
free(path_fixed);
|
||||||
r->_errno = fs_translate_error(rc);
|
r->_errno = fs_translate_error(rc);
|
||||||
return -1;
|
return -1;
|
||||||
@ -299,7 +303,12 @@ fs_close(struct _reent *r,
|
|||||||
FSStatus rc;
|
FSStatus rc;
|
||||||
fs_file_t *file = (fs_file_t*)fd;
|
fs_file_t *file = (fs_file_t*)fd;
|
||||||
|
|
||||||
|
// Set up command block
|
||||||
|
FSCmdBlock* fsCmd = memalign(0x20, sizeof(FSCmdBlock));
|
||||||
|
FSInitCmdBlock(fsCmd);
|
||||||
|
|
||||||
rc = FSCloseFile(fsClient, fsCmd, file->fd, -1);
|
rc = FSCloseFile(fsClient, fsCmd, file->fd, -1);
|
||||||
|
free(fsCmd);
|
||||||
|
|
||||||
if (rc >= 0) {
|
if (rc >= 0) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -338,8 +347,13 @@ fs_write(struct _reent *r,
|
|||||||
// Copy to internal buffer
|
// Copy to internal buffer
|
||||||
memcpy(tmp_buffer, ptr, toWrite);
|
memcpy(tmp_buffer, ptr, toWrite);
|
||||||
|
|
||||||
|
// Set up command block
|
||||||
|
FSCmdBlock* fsCmd = memalign(0x20, sizeof(FSCmdBlock));
|
||||||
|
FSInitCmdBlock(fsCmd);
|
||||||
|
|
||||||
// Write the data
|
// Write the data
|
||||||
rc = FSWriteFile(fsClient, fsCmd, tmp_buffer, 1, toWrite, file->fd, 0, -1);
|
rc = FSWriteFile(fsClient, fsCmd, tmp_buffer, 1, toWrite, file->fd, 0, -1);
|
||||||
|
free(fsCmd);
|
||||||
|
|
||||||
if(rc < 0) {
|
if(rc < 0) {
|
||||||
free(tmp_buffer);
|
free(tmp_buffer);
|
||||||
@ -394,8 +408,13 @@ fs_write_safe(struct _reent *r,
|
|||||||
// Copy to internal buffer
|
// Copy to internal buffer
|
||||||
memcpy(tmp_buffer, ptr, toWrite);
|
memcpy(tmp_buffer, ptr, toWrite);
|
||||||
|
|
||||||
|
// Set up command block
|
||||||
|
FSCmdBlock* fsCmd = memalign(0x20, sizeof(FSCmdBlock));
|
||||||
|
FSInitCmdBlock(fsCmd);
|
||||||
|
|
||||||
// Write the data
|
// Write the data
|
||||||
rc = FSWriteFile(fsClient, fsCmd, tmp_buffer, 1, toWrite, file->fd, 0, -1);
|
rc = FSWriteFile(fsClient, fsCmd, tmp_buffer, 1, toWrite, file->fd, 0, -1);
|
||||||
|
free(fsCmd);
|
||||||
|
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
free(tmp_buffer);
|
free(tmp_buffer);
|
||||||
@ -437,11 +456,16 @@ fs_read(struct _reent *r,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set up command block
|
||||||
|
FSCmdBlock* fsCmd = memalign(0x20, sizeof(FSCmdBlock));
|
||||||
|
FSInitCmdBlock(fsCmd);
|
||||||
|
|
||||||
FSStat fsstat;
|
FSStat fsstat;
|
||||||
rc = FSGetStatFile(fsClient, fsCmd, file->fd, &fsstat, -1);
|
rc = FSGetStatFile(fsClient, fsCmd, file->fd, &fsstat, -1);
|
||||||
|
|
||||||
if(rc < 0) {
|
if(rc < 0) {
|
||||||
r->_errno = fs_translate_error(rc);
|
r->_errno = fs_translate_error(rc);
|
||||||
|
free(fsCmd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -461,6 +485,7 @@ fs_read(struct _reent *r,
|
|||||||
if(rc <= 0)
|
if(rc <= 0)
|
||||||
{
|
{
|
||||||
free(tmp_buffer);
|
free(tmp_buffer);
|
||||||
|
free(fsCmd);
|
||||||
|
|
||||||
// Return partial transfer
|
// Return partial transfer
|
||||||
if (bytesRead > 0) {
|
if (bytesRead > 0) {
|
||||||
@ -482,6 +507,7 @@ fs_read(struct _reent *r,
|
|||||||
len -= bytes;
|
len -= bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(fsCmd);
|
||||||
free(tmp_buffer);
|
free(tmp_buffer);
|
||||||
return bytesRead;
|
return bytesRead;
|
||||||
}
|
}
|
||||||
@ -496,11 +522,16 @@ fs_seek(struct _reent *r,
|
|||||||
u64 offset;
|
u64 offset;
|
||||||
fs_file_t *file = (fs_file_t*)fd;
|
fs_file_t *file = (fs_file_t*)fd;
|
||||||
|
|
||||||
|
// Set up command block
|
||||||
|
FSCmdBlock* fsCmd = memalign(0x20, sizeof(FSCmdBlock));
|
||||||
|
FSInitCmdBlock(fsCmd);
|
||||||
|
|
||||||
FSStat fsstat;
|
FSStat fsstat;
|
||||||
rc = FSGetStatFile(fsClient, fsCmd, file->fd, &fsstat, -1);
|
rc = FSGetStatFile(fsClient, fsCmd, file->fd, &fsstat, -1);
|
||||||
|
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
r->_errno = fs_translate_error(rc);
|
r->_errno = fs_translate_error(rc);
|
||||||
|
free(fsCmd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -524,6 +555,7 @@ fs_seek(struct _reent *r,
|
|||||||
// An invalid option was provided
|
// An invalid option was provided
|
||||||
default:
|
default:
|
||||||
r->_errno = EINVAL;
|
r->_errno = EINVAL;
|
||||||
|
free(fsCmd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -531,12 +563,14 @@ fs_seek(struct _reent *r,
|
|||||||
if(pos < 0 && offset < -pos) {
|
if(pos < 0 && offset < -pos) {
|
||||||
// Don't allow seek to before the beginning of the file
|
// Don't allow seek to before the beginning of the file
|
||||||
r->_errno = EINVAL;
|
r->_errno = EINVAL;
|
||||||
|
free(fsCmd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the current offset
|
// Update the current offset
|
||||||
file->offset = offset + pos;
|
file->offset = offset + pos;
|
||||||
FSStatus result = FSSetPosFile(fsClient, fsCmd, file->fd, file->offset, -1);
|
FSStatus result = FSSetPosFile(fsClient, fsCmd, file->fd, file->offset, -1);
|
||||||
|
free(fsCmd);
|
||||||
|
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
return result;
|
return result;
|
||||||
@ -554,7 +588,12 @@ fs_fstat(struct _reent *r,
|
|||||||
FSStat fsstat;
|
FSStat fsstat;
|
||||||
fs_file_t *file = (fs_file_t*)fd;
|
fs_file_t *file = (fs_file_t*)fd;
|
||||||
|
|
||||||
|
// Set up command block
|
||||||
|
FSCmdBlock* fsCmd = memalign(0x20, sizeof(FSCmdBlock));
|
||||||
|
FSInitCmdBlock(fsCmd);
|
||||||
|
|
||||||
rc = FSGetStatFile(fsClient, fsCmd, file->fd, &fsstat, -1);
|
rc = FSGetStatFile(fsClient, fsCmd, file->fd, &fsstat, -1);
|
||||||
|
free(fsCmd);
|
||||||
|
|
||||||
if (rc >= 0) {
|
if (rc >= 0) {
|
||||||
memset(st, 0, sizeof(struct stat));
|
memset(st, 0, sizeof(struct stat));
|
||||||
@ -582,6 +621,10 @@ fs_stat(struct _reent *r,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set up command block
|
||||||
|
FSCmdBlock* fsCmd = memalign(0x20, sizeof(FSCmdBlock));
|
||||||
|
FSInitCmdBlock(fsCmd);
|
||||||
|
|
||||||
// First try open as file
|
// First try open as file
|
||||||
rc = FSOpenFile(fsClient, fsCmd, file, "r", (FSFileHandle*)&fd, -1);
|
rc = FSOpenFile(fsClient, fsCmd, file, "r", (FSFileHandle*)&fd, -1);
|
||||||
|
|
||||||
@ -589,6 +632,7 @@ fs_stat(struct _reent *r,
|
|||||||
fs_file_t tmpfd = { .fd = fd };
|
fs_file_t tmpfd = { .fd = fd };
|
||||||
rc = fs_fstat(r, (int)&tmpfd, st);
|
rc = fs_fstat(r, (int)&tmpfd, st);
|
||||||
FSCloseFile(fsClient, fsCmd, fd, -1);
|
FSCloseFile(fsClient, fsCmd, fd, -1);
|
||||||
|
free(fsCmd);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -600,9 +644,12 @@ fs_stat(struct _reent *r,
|
|||||||
st->st_nlink = 1;
|
st->st_nlink = 1;
|
||||||
st->st_mode = S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO;
|
st->st_mode = S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO;
|
||||||
FSCloseDir(fsClient, fsCmd, fd, -1);
|
FSCloseDir(fsClient, fsCmd, fd, -1);
|
||||||
|
free(fsCmd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(fsCmd);
|
||||||
|
|
||||||
r->_errno = fs_translate_error(rc);
|
r->_errno = fs_translate_error(rc);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -633,8 +680,13 @@ fs_unlink(struct _reent *r,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set up command block
|
||||||
|
FSCmdBlock* fsCmd = memalign(0x20, sizeof(FSCmdBlock));
|
||||||
|
FSInitCmdBlock(fsCmd);
|
||||||
|
|
||||||
rc = FSRemove(fsClient, fsCmd, path_fix, -1);
|
rc = FSRemove(fsClient, fsCmd, path_fix, -1);
|
||||||
free(path_fix);
|
free(path_fix);
|
||||||
|
free(fsCmd);
|
||||||
|
|
||||||
if (rc >= 0) {
|
if (rc >= 0) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -661,8 +713,13 @@ fs_chdir(struct _reent *r,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set up command block
|
||||||
|
FSCmdBlock* fsCmd = memalign(0x20, sizeof(FSCmdBlock));
|
||||||
|
FSInitCmdBlock(fsCmd);
|
||||||
|
|
||||||
rc = FSChangeDir(fsClient, fsCmd, path, -1);
|
rc = FSChangeDir(fsClient, fsCmd, path, -1);
|
||||||
free(path);
|
free(path);
|
||||||
|
free(fsCmd);
|
||||||
|
|
||||||
if (rc >= 0) {
|
if (rc >= 0) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -701,9 +758,14 @@ fs_rename(struct _reent *r,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set up command block
|
||||||
|
FSCmdBlock* fsCmd = memalign(0x20, sizeof(FSCmdBlock));
|
||||||
|
FSInitCmdBlock(fsCmd);
|
||||||
|
|
||||||
rc = FSRename(fsClient, fsCmd, path_old, path_new, -1);
|
rc = FSRename(fsClient, fsCmd, path_old, path_new, -1);
|
||||||
free(path_old);
|
free(path_old);
|
||||||
free(path_new);
|
free(path_new);
|
||||||
|
free(fsCmd);
|
||||||
|
|
||||||
if (rc >= 0) {
|
if (rc >= 0) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -731,9 +793,14 @@ fs_mkdir(struct _reent *r,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set up command block
|
||||||
|
FSCmdBlock* fsCmd = memalign(0x20, sizeof(FSCmdBlock));
|
||||||
|
FSInitCmdBlock(fsCmd);
|
||||||
|
|
||||||
// TODO: Use mode to set directory attributes.
|
// TODO: Use mode to set directory attributes.
|
||||||
rc = FSMakeDir(fsClient, fsCmd, path_fix, -1);
|
rc = FSMakeDir(fsClient, fsCmd, path_fix, -1);
|
||||||
free(path_fix);
|
free(path_fix);
|
||||||
|
free(fsCmd);
|
||||||
|
|
||||||
if (rc == FS_ERROR_ALREADY_EXISTS) {
|
if (rc == FS_ERROR_ALREADY_EXISTS) {
|
||||||
r->_errno = EEXIST;
|
r->_errno = EEXIST;
|
||||||
@ -765,8 +832,13 @@ fs_diropen(struct _reent *r,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set up command block
|
||||||
|
FSCmdBlock* fsCmd = memalign(0x20, sizeof(FSCmdBlock));
|
||||||
|
FSInitCmdBlock(fsCmd);
|
||||||
|
|
||||||
fs_dir_t *dir = (fs_dir_t*)(dirState->dirStruct);
|
fs_dir_t *dir = (fs_dir_t*)(dirState->dirStruct);
|
||||||
rc = FSOpenDir(fsClient, fsCmd, path_fixed, &fd, -1);
|
rc = FSOpenDir(fsClient, fsCmd, path_fixed, &fd, -1);
|
||||||
|
free(fsCmd);
|
||||||
|
|
||||||
if (rc >= 0) {
|
if (rc >= 0) {
|
||||||
dir->magic = FS_DIRITER_MAGIC;
|
dir->magic = FS_DIRITER_MAGIC;
|
||||||
@ -786,8 +858,14 @@ fs_dirreset(struct _reent *r,
|
|||||||
DIR_ITER *dirState)
|
DIR_ITER *dirState)
|
||||||
{
|
{
|
||||||
FSStatus rc;
|
FSStatus rc;
|
||||||
|
|
||||||
|
// Set up command block
|
||||||
|
FSCmdBlock* fsCmd = memalign(0x20, sizeof(FSCmdBlock));
|
||||||
|
FSInitCmdBlock(fsCmd);
|
||||||
|
|
||||||
fs_dir_t *dir = (fs_dir_t*)(dirState->dirStruct);
|
fs_dir_t *dir = (fs_dir_t*)(dirState->dirStruct);
|
||||||
rc = FSRewindDir(fsClient, fsCmd, dir->fd, -1);
|
rc = FSRewindDir(fsClient, fsCmd, dir->fd, -1);
|
||||||
|
free(fsCmd);
|
||||||
|
|
||||||
if (rc >= 0) {
|
if (rc >= 0) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -806,9 +884,14 @@ fs_dirnext(struct _reent *r,
|
|||||||
FSStatus rc;
|
FSStatus rc;
|
||||||
fs_dir_t *dir = (fs_dir_t*)(dirState->dirStruct);
|
fs_dir_t *dir = (fs_dir_t*)(dirState->dirStruct);
|
||||||
|
|
||||||
|
// Set up command block
|
||||||
|
FSCmdBlock* fsCmd = memalign(0x20, sizeof(FSCmdBlock));
|
||||||
|
FSInitCmdBlock(fsCmd);
|
||||||
|
|
||||||
// Fetch the next dir
|
// Fetch the next dir
|
||||||
memset(&dir->entry_data, 0, sizeof(dir->entry_data));
|
memset(&dir->entry_data, 0, sizeof(dir->entry_data));
|
||||||
rc = FSReadDir(fsClient, fsCmd, dir->fd, &dir->entry_data, -1);
|
rc = FSReadDir(fsClient, fsCmd, dir->fd, &dir->entry_data, -1);
|
||||||
|
free(fsCmd);
|
||||||
|
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
// There are no more entries; ENOENT signals end-of-directory
|
// There are no more entries; ENOENT signals end-of-directory
|
||||||
@ -846,8 +929,14 @@ fs_dirclose(struct _reent *r,
|
|||||||
DIR_ITER *dirState)
|
DIR_ITER *dirState)
|
||||||
{
|
{
|
||||||
FSStatus rc;
|
FSStatus rc;
|
||||||
|
|
||||||
|
// Set up command block
|
||||||
|
FSCmdBlock* fsCmd = memalign(0x20, sizeof(FSCmdBlock));
|
||||||
|
FSInitCmdBlock(fsCmd);
|
||||||
|
|
||||||
fs_dir_t *dir = (fs_dir_t*)(dirState->dirStruct);
|
fs_dir_t *dir = (fs_dir_t*)(dirState->dirStruct);
|
||||||
rc = FSCloseDir(fsClient, fsCmd, dir->fd, -1);
|
rc = FSCloseDir(fsClient, fsCmd, dir->fd, -1);
|
||||||
|
free(fsCmd);
|
||||||
|
|
||||||
if (rc >= 0) {
|
if (rc >= 0) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -892,14 +981,20 @@ fs_ftruncate(struct _reent *r,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set up command block
|
||||||
|
FSCmdBlock* fsCmd = memalign(0x20, sizeof(FSCmdBlock));
|
||||||
|
FSInitCmdBlock(fsCmd);
|
||||||
|
|
||||||
// Set the new file size
|
// Set the new file size
|
||||||
rc = FSSetPosFile(fsClient, fsCmd, file->fd, len, -1);
|
rc = FSSetPosFile(fsClient, fsCmd, file->fd, len, -1);
|
||||||
|
|
||||||
if (rc >= 0) {
|
if (rc >= 0) {
|
||||||
|
free(fsCmd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = FSTruncateFile(fsClient, fsCmd, file->fd, -1);
|
rc = FSTruncateFile(fsClient, fsCmd, file->fd, -1);
|
||||||
|
free(fsCmd);
|
||||||
|
|
||||||
if (rc >= 0) {
|
if (rc >= 0) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -916,7 +1011,12 @@ fs_fsync(struct _reent *r,
|
|||||||
FSStatus rc;
|
FSStatus rc;
|
||||||
fs_file_t *file = (fs_file_t*)fd;
|
fs_file_t *file = (fs_file_t*)fd;
|
||||||
|
|
||||||
|
// Set up command block
|
||||||
|
FSCmdBlock* fsCmd = memalign(0x20, sizeof(FSCmdBlock));
|
||||||
|
FSInitCmdBlock(fsCmd);
|
||||||
|
|
||||||
rc = FSFlushFile(fsClient, fsCmd, file->fd, -1);
|
rc = FSFlushFile(fsClient, fsCmd, file->fd, -1);
|
||||||
|
free(fsCmd);
|
||||||
|
|
||||||
if (rc >= 0) {
|
if (rc >= 0) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -939,8 +1039,13 @@ fs_chmod(struct _reent *r,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set up command block
|
||||||
|
FSCmdBlock* fsCmd = memalign(0x20, sizeof(FSCmdBlock));
|
||||||
|
FSInitCmdBlock(fsCmd);
|
||||||
|
|
||||||
rc = FSChangeMode(fsClient, fsCmd, path_fix, (FSMode)mode, -1);
|
rc = FSChangeMode(fsClient, fsCmd, path_fix, (FSMode)mode, -1);
|
||||||
free(path_fix);
|
free(path_fix);
|
||||||
|
free(fsCmd);
|
||||||
|
|
||||||
if (rc >= 0) {
|
if (rc >= 0) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -978,8 +1083,13 @@ fs_rmdir(struct _reent *r,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set up command block
|
||||||
|
FSCmdBlock* fsCmd = memalign(0x20, sizeof(FSCmdBlock));
|
||||||
|
FSInitCmdBlock(fsCmd);
|
||||||
|
|
||||||
rc = FSRemove(fsClient, fsCmd, path_fix, -1);
|
rc = FSRemove(fsClient, fsCmd, path_fix, -1);
|
||||||
free(path_fix);
|
free(path_fix);
|
||||||
|
free(fsCmd);
|
||||||
|
|
||||||
if (rc >= 0) {
|
if (rc >= 0) {
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user