diff --git a/include/coreinit/filesystem.h b/include/coreinit/filesystem.h index 4f303021..ba2491b0 100644 --- a/include/coreinit/filesystem.h +++ b/include/coreinit/filesystem.h @@ -472,6 +472,7 @@ FSChangeMode(FSClient *client, FSCmdBlock *block, char *path, FSMode mode, + FSMode modeMask, FSErrorFlag errorMask); FSStatus @@ -479,6 +480,7 @@ FSChangeModeAsync(FSClient *client, FSCmdBlock *block, char *path, FSMode mode, + FSMode modeMask, FSErrorFlag errorMask, FSAsyncData *asyncData); diff --git a/libraries/wutdevoptab/devoptab_fs_chmod.c b/libraries/wutdevoptab/devoptab_fs_chmod.c index 43a26920..bc4de68a 100644 --- a/libraries/wutdevoptab/devoptab_fs_chmod.c +++ b/libraries/wutdevoptab/devoptab_fs_chmod.c @@ -1,5 +1,13 @@ +#include #include "devoptab_fs.h" +static inline FSMode +__wut_fs_convert_mode(mode_t mode) +{ + // Convert normal Unix octal permission bits into CafeOS hexadecimal permission bits + return (FSMode) (((mode & S_IRWXU) << 2) | ((mode & S_IRWXG) << 1) | (mode & S_IRWXO)); +} + int __wut_fs_chmod(struct _reent *r, const char *path, @@ -18,9 +26,11 @@ __wut_fs_chmod(struct _reent *r, return -1; } + FSMode translatedMode = __wut_fs_convert_mode(mode); + FSInitCmdBlock(&cmd); status = FSChangeMode(__wut_devoptab_fs_client, &cmd, fixedPath, - (FSMode)mode, FS_ERROR_FLAG_ALL); + translatedMode, 0x777, FS_ERROR_FLAG_ALL); free(fixedPath); if (status < 0) { r->_errno = __wut_fs_translate_error(status);