From 11d3cf94f73aef8589e69c74f58e0990bd66412b Mon Sep 17 00:00:00 2001 From: Benoist <14257866+Kenzzer@users.noreply.github.com> Date: Sat, 8 Jun 2024 16:17:50 +0200 Subject: [PATCH] Add GetFilePermissions (#2177) Co-authored-by: Kenzzer --- core/logic/smn_filesystem.cpp | 34 ++++++++++++++++++++++++++++++++++ plugins/include/files.inc | 9 +++++++++ 2 files changed, 43 insertions(+) diff --git a/core/logic/smn_filesystem.cpp b/core/logic/smn_filesystem.cpp index 205a150c53..4ca57e62ce 100644 --- a/core/logic/smn_filesystem.cpp +++ b/core/logic/smn_filesystem.cpp @@ -755,6 +755,39 @@ static cell_t sm_SetFilePermissions(IPluginContext *pContext, const cell_t *para #endif } +static cell_t sm_GetFilePermissions(IPluginContext *pContext, const cell_t *params) +{ + char *name; + char realpath[PLATFORM_MAX_PATH]; + + pContext->LocalToString(params[1], &name); + g_pSM->BuildPath(Path_Game, realpath, sizeof(realpath), "%s", name); + + cell_t *mask; + pContext->LocalToPhysAddr(params[2], &mask); + +#if defined PLATFORM_WINDOWS + struct _stat buffer; + cell_t valid = _stat(realpath, &buffer) == 0; + + if ((buffer.st_mode & _S_IREAD) != 0) { + *mask |= (FPERM_U_READ|FPERM_G_READ|FPERM_O_READ)|(FPERM_U_EXEC|FPERM_G_EXEC|FPERM_O_EXEC); + } + + if ((buffer.st_mode & _S_IWRITE) != 0) { + *mask |= (FPERM_U_WRITE|FPERM_G_WRITE|FPERM_O_WRITE); + } + + return valid; +#else + struct stat buffer; + cell_t valid = stat(realpath, &buffer) == 0; + + *mask = buffer.st_mode; + return valid; +#endif +} + static cell_t sm_CreateDirectory(IPluginContext *pContext, const cell_t *params) { char *name; @@ -1228,6 +1261,7 @@ REGISTER_NATIVES(filesystem) {"RemoveGameLogHook", sm_RemoveGameLogHook}, {"CreateDirectory", sm_CreateDirectory}, {"SetFilePermissions", sm_SetFilePermissions}, + {"GetFilePermissions", sm_GetFilePermissions}, {"File.ReadLine", sm_ReadFileLine}, {"File.Read", sm_ReadFile}, diff --git a/plugins/include/files.inc b/plugins/include/files.inc index 78efd65cc2..a54f199643 100644 --- a/plugins/include/files.inc +++ b/plugins/include/files.inc @@ -601,6 +601,15 @@ native bool CreateDirectory(const char[] path, int mode=FPERM_O_READ|FPERM_O_EXE */ native bool SetFilePermissions(const char[] path, int mode); +/** + * Retrieves a file or directories permissions. + * + * @param path Path to the file. + * @param mode Variable to store the permissions in. + * @return True on success, false otherwise. + */ +native bool GetFilePermissions(const char[] path, int &mode); + /** * Returns a file timestamp as a unix timestamp. *