From 354bb40e75d94466e91fe6960523612c9d17ccfb Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Thu, 2 Nov 2017 23:11:29 +0300 Subject: Add implementation --- mysql/mysys/my_chmod.c | 102 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 mysql/mysys/my_chmod.c (limited to 'mysql/mysys/my_chmod.c') diff --git a/mysql/mysys/my_chmod.c b/mysql/mysys/my_chmod.c new file mode 100644 index 0000000..389960d --- /dev/null +++ b/mysql/mysys/my_chmod.c @@ -0,0 +1,102 @@ +/* Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA */ + + +#include "mysys_priv.h" +#include "my_sys.h" +#include "mysys_err.h" +#include +#include "my_thread_local.h" + +/* + Generate MY_MODE representation from perm_flags. + + @param perm_flags Permission information + + @return Permission in MY_STAT format +*/ + +MY_MODE get_file_perm(ulong perm_flags) +{ + MY_MODE file_perm= 0; + if (perm_flags <= 0) + return file_perm; + +#if defined _WIN32 + if (perm_flags & (USER_READ | GROUP_READ | OTHERS_READ)) + file_perm|= _S_IREAD; + if (perm_flags & (USER_WRITE | GROUP_WRITE | OTHERS_WRITE)) + file_perm|= _S_IWRITE; +#else + if (perm_flags & USER_READ) + file_perm|= S_IRUSR; + if (perm_flags & USER_WRITE) + file_perm|= S_IWUSR; + if (perm_flags & USER_EXECUTE) + file_perm|= S_IXUSR; + if (perm_flags & GROUP_READ) + file_perm|= S_IRGRP; + if (perm_flags & GROUP_WRITE) + file_perm|= S_IWGRP; + if (perm_flags & GROUP_EXECUTE) + file_perm|= S_IXGRP; + if (perm_flags & OTHERS_READ) + file_perm|= S_IROTH; + if (perm_flags & OTHERS_WRITE) + file_perm|= S_IWOTH; + if (perm_flags & OTHERS_EXECUTE) + file_perm|= S_IXOTH; +#endif + + return file_perm; +} + +/* + my_chmod : Change permission on a file + + @param filename : Name of the file + @param perm_flags : Permission information + @param my_flags : Error handling + + @return + @retval TRUE : Error changing file permission + @retval FALSE : File permission changed successfully +*/ + +my_bool my_chmod(const char *filename, ulong perm_flags, myf my_flags) +{ + int ret_val; + MY_MODE file_perm; + DBUG_ENTER("my_chmod"); + DBUG_ASSERT(filename && filename[0]); + + file_perm= get_file_perm(perm_flags); +#ifdef _WIN32 + ret_val= _chmod(filename, file_perm); +#else + ret_val= chmod(filename, file_perm); +#endif + + if (ret_val && (my_flags & (MY_FAE+MY_WME))) + { + char errbuf[MYSYS_STRERROR_SIZE]; + set_my_errno(errno); + my_error(EE_CHANGE_PERMISSIONS, MYF(0), filename, + errno, my_strerror(errbuf, sizeof(errbuf), errno)); + } + + DBUG_RETURN(ret_val ? TRUE : FALSE); +} -- cgit v1.1