VFS: Add SetFilePermissions native

This commit is contained in:
Arkshine 2015-03-09 00:10:26 +01:00
parent 0eeb5942a1
commit a580c8c5e5
2 changed files with 51 additions and 3 deletions

View File

@ -1101,6 +1101,42 @@ static cell AMX_NATIVE_CALL GetFileTime(AMX *amx, cell *params)
return static_cast<cell>(time_val); return static_cast<cell>(time_val);
} }
#define FPERM_U_READ 0x0100 /* User can read. */
#define FPERM_U_WRITE 0x0080 /* User can write. */
#define FPERM_U_EXEC 0x0040 /* User can exec. */
#define FPERM_G_READ 0x0020 /* Group can read. */
#define FPERM_G_WRITE 0x0010 /* Group can write. */
#define FPERM_G_EXEC 0x0008 /* Group can exec. */
#define FPERM_O_READ 0x0004 /* Anyone can read. */
#define FPERM_O_WRITE 0x0002 /* Anyone can write. */
#define FPERM_O_EXEC 0x0001 /* Anyone can exec. */
// native bool:SetFilePermissions(const path[], int mode);
static cell SetFilePermissions(AMX *amx, cell *params)
{
int length;
const char* realpath = build_pathname(get_amxstring(amx, params[1], 0, length));
#if defined PLATFORM_WINDOWS
int mask = 0;
if (params[2] & (FPERM_U_WRITE | FPERM_G_WRITE | FPERM_O_WRITE))
{
mask |= _S_IWRITE;
}
if (params[2] & (FPERM_U_READ | FPERM_G_READ | FPERM_O_READ | FPERM_U_EXEC | FPERM_G_EXEC | FPERM_O_EXEC))
{
mask |= _S_IREAD;
}
return _chmod(realpath, mask) == 0;
#elif
return chmod(realpath, params[2]) == 0;
#endif
}
AMX_NATIVE_INFO file_Natives[] = AMX_NATIVE_INFO file_Natives[] =
{ {
{"read_dir", read_dir}, {"read_dir", read_dir},
@ -1147,6 +1183,8 @@ AMX_NATIVE_INFO file_Natives[] =
{"LoadFileForMe", LoadFileForMe}, {"LoadFileForMe", LoadFileForMe},
{"GetFileTime", GetFileTime}, {"GetFileTime", GetFileTime},
{"SetFilePermissions", SetFilePermissions},
{NULL, NULL} {NULL, NULL}
}; };

View File

@ -59,7 +59,7 @@ enum FileTimeType
#define BLOCK_BYTE 1 #define BLOCK_BYTE 1
/** /**
* File permissions flags for use with mkdir(). * File permissions flags for use with mkdir() and SetFilePermissions().
*/ */
#define FPERM_U_READ 0x0100 /* User can read. */ #define FPERM_U_READ 0x0100 /* User can read. */
#define FPERM_U_WRITE 0x0080 /* User can write. */ #define FPERM_U_WRITE 0x0080 /* User can write. */
@ -227,14 +227,14 @@ native file_size(const file[], flag = FSOPT_BYTES_COUNT, bool:use_valve_fs = fal
* *
* @note Registered paths ID are (in priority order) : * @note Registered paths ID are (in priority order) :
* GAME All paths related to current mod, including fallback * GAME All paths related to current mod, including fallback
* Depending settings, it includes: <gamedir>_lv/_addon/_<language>/_hd * Depending settings, it includes: <gamedir>_lv/_addon/_<language>/_hd
* and <gamedir> itself * and <gamedir> itself
* GAMECONFIG The default writable directory (<gamedir>) * GAMECONFIG The default writable directory (<gamedir>)
* GAMEDOWNLOAD The download directory (<gamedir>_download) * GAMEDOWNLOAD The download directory (<gamedir>_download)
* GAME_FALLBACK All paths related to fallback game, same as GAME * GAME_FALLBACK All paths related to fallback game, same as GAME
* DEFAULTGAME All paths related to the default game which is "valve", same as GAME * DEFAULTGAME All paths related to the default game which is "valve", same as GAME
* BASE The base path where server is installed * BASE The base path where server is installed
* *
* Note that some paths are non-writable. It includes all <gamedir>_* (expect _download) * Note that some paths are non-writable. It includes all <gamedir>_* (expect _download)
* and DEFAULTGAME. Any file inside a non-writable path will be ignored if you try to open * and DEFAULTGAME. Any file inside a non-writable path will be ignored if you try to open
* it in writing mode. * it in writing mode.
@ -556,3 +556,13 @@ native LoadFileForMe(const file[], buffer[], maxlength, &length = 0);
* @return Returns a file timestamp as a unix timestamp * @return Returns a file timestamp as a unix timestamp
*/ */
native GetFileTime(const file[], FileTimeType:tmode); native GetFileTime(const file[], FileTimeType:tmode);
/**
* Changes a file or directories permissions.
*
* @param path Path to the file
* @param mode Permissions to set, see FPERM_* constants
*
* @return True on success, false otherwise
*/
native bool:SetFilePermissions(const path[], mode);