From ffa5514b43ef7d7e2e30110017433e028220929f Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Thu, 18 Jan 2018 10:27:46 +0000 Subject: [PATCH] added QSE_FS_MKDIR_IGNORE_UMASK --- qse/include/qse/si/fs.h | 7 ++++++- qse/lib/si/fs-make.c | 15 ++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/qse/include/qse/si/fs.h b/qse/include/qse/si/fs.h index 6782ffb0..2bdd4ff3 100644 --- a/qse/include/qse/si/fs.h +++ b/qse/include/qse/si/fs.h @@ -282,8 +282,13 @@ typedef enum qse_fs_cpfile_flag_t qse_fs_cpfile_flag_t; enum qse_fs_mkdir_flag_t { QSE_FS_MKDIR_PARENT = (1 << 0), + QSE_FS_MKDIR_IGNORE_UMASK = (1 << 1), + QSE_FS_MKDIRMBS_PARENT = QSE_FS_MKDIR_PARENT, - QSE_FS_MKDIRWCS_PARENT = QSE_FS_MKDIR_PARENT + QSE_FS_MKDIRWCS_PARENT = QSE_FS_MKDIR_PARENT, + + QSE_FS_MKDIRMBS_IGNORE_UMASK = QSE_FS_MKDIR_IGNORE_UMASK, + QSE_FS_MKDIRWCS_IGNORE_UMASK = QSE_FS_MKDIR_IGNORE_UMASK }; typedef enum qse_fs_mkdir_flag_t qse_fs_mkdir_flag_t; diff --git a/qse/lib/si/fs-make.c b/qse/lib/si/fs-make.c index e17682c7..85734fb6 100644 --- a/qse/lib/si/fs-make.c +++ b/qse/lib/si/fs-make.c @@ -28,7 +28,6 @@ int qse_fs_mkdirsys (qse_fs_t* fs, const qse_fs_char_t* fspath, qse_fs_mode_t mode) { - #if defined(_WIN32) if (CreateDirectory (fspath, QSE_NULL) == FALSE) @@ -139,6 +138,7 @@ done: int qse_fs_mkdirmbs (qse_fs_t* fs, const qse_mchar_t* path, qse_fs_mode_t mode, int flags) { qse_fs_char_t* fspath; + qse_fs_mode_t oldmask; int ret; if (*path == QSE_MT('\0')) @@ -154,14 +154,20 @@ int qse_fs_mkdirmbs (qse_fs_t* fs, const qse_mchar_t* path, qse_fs_mode_t mode, fspath = qse_fs_dupfspathformbs (fs, path); if (!fspath) return -1; + /* [NOTE] the umask value is global. so changing it here affects other threads */ + if (flags & QSE_FS_MKDIRMBS_IGNORE_UMASK) oldmask = QSE_UMASK(0); ret = make_directory_chain (fs, fspath, mode); + if (flags & QSE_FS_MKDIRWCS_IGNORE_UMASK) QSE_UMASK(oldmask); } else { fspath = (qse_fs_char_t*)qse_fs_makefspathformbs (fs, path); if (!fspath) return -1; + /* [NOTE] the umask value is global. so changing it here affects other threads */ + if (flags & QSE_FS_MKDIRMBS_IGNORE_UMASK) oldmask = QSE_UMASK(0); ret = qse_fs_mkdirsys (fs, fspath, mode); + if (flags & QSE_FS_MKDIRWCS_IGNORE_UMASK) QSE_UMASK(oldmask); } qse_fs_freefspathformbs (fs, path, fspath); @@ -172,6 +178,7 @@ int qse_fs_mkdirmbs (qse_fs_t* fs, const qse_mchar_t* path, qse_fs_mode_t mode, int qse_fs_mkdirwcs (qse_fs_t* fs, const qse_wchar_t* path, qse_fs_mode_t mode, int flags) { qse_fs_char_t* fspath; + qse_fs_mode_t oldmask; int ret; if (*path == QSE_WT('\0')) @@ -187,14 +194,20 @@ int qse_fs_mkdirwcs (qse_fs_t* fs, const qse_wchar_t* path, qse_fs_mode_t mode, fspath = qse_fs_dupfspathforwcs (fs, path); if (!fspath) return -1; + /* [NOTE] the umask value is global. so changing it here affects other threads */ + if (flags & QSE_FS_MKDIRWCS_IGNORE_UMASK) oldmask = QSE_UMASK(0); ret = make_directory_chain (fs, fspath, mode); + if (flags & QSE_FS_MKDIRWCS_IGNORE_UMASK) QSE_UMASK(oldmask); } else { fspath = (qse_fs_char_t*)qse_fs_makefspathforwcs (fs, path); if (!fspath) return -1; + /* [NOTE] the umask value is global. so changing it here affects other threads */ + if (flags & QSE_FS_MKDIRWCS_IGNORE_UMASK) oldmask = QSE_UMASK(0); ret = qse_fs_mkdirsys (fs, fspath, mode); + if (flags & QSE_FS_MKDIRWCS_IGNORE_UMASK) QSE_UMASK(oldmask); } qse_fs_freefspathforwcs (fs, path, fspath);