aboutsummaryrefslogtreecommitdiff
path: root/mysql/mysys/my_chmod.c
diff options
context:
space:
mode:
Diffstat (limited to 'mysql/mysys/my_chmod.c')
-rw-r--r--mysql/mysys/my_chmod.c102
1 files changed, 102 insertions, 0 deletions
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 <my_dir.h>
+#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);
+}