From 4f444b412e0be96ca39555c0950c729745b5210a Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Tue, 16 Apr 2019 15:16:54 -0700 Subject: [PATCH] dll: fuse: create_file_mask, create_dir_mask options --- src/dll/fuse/fuse.c | 8 ++++++++ src/dll/fuse/fuse_intf.c | 18 ++++++++++++++++-- src/dll/fuse/library.h | 4 ++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/dll/fuse/fuse.c b/src/dll/fuse/fuse.c index 36d048c1..3075515a 100644 --- a/src/dll/fuse/fuse.c +++ b/src/dll/fuse/fuse.c @@ -54,6 +54,10 @@ static struct fuse_opt fsp_fuse_core_opts[] = FSP_FUSE_CORE_OPT("umask=%o", umask, 0), FSP_FUSE_CORE_OPT("create_umask=", set_create_umask, 1), FSP_FUSE_CORE_OPT("create_umask=%o", create_umask, 0), + FSP_FUSE_CORE_OPT("create_file_umask=", set_create_file_umask, 1), + FSP_FUSE_CORE_OPT("create_file_umask=%o", create_file_umask, 0), + FSP_FUSE_CORE_OPT("create_dir_umask=", set_create_dir_umask, 1), + FSP_FUSE_CORE_OPT("create_dir_umask=%o", create_dir_umask, 0), FSP_FUSE_CORE_OPT("uid=", set_uid, 1), FSP_FUSE_CORE_OPT("uid=%d", uid, 0), FSP_FUSE_CORE_OPT("gid=", set_gid, 1), @@ -244,6 +248,8 @@ static int fsp_fuse_core_opt_proc(void *opt_data0, const char *arg, int key, FSP_FUSE_LIBRARY_NAME " options:\n" " -o umask=MASK set file permissions (octal)\n" " -o create_umask=MASK set newly created file permissions (octal)\n" + " -o create_file_umask=MASK for files only\n" + " -o create_dir_umask=MASK for directories only\n" " -o uid=N set file owner (-1 for mounting user id)\n" " -o gid=N set file group (-1 for mounting user group)\n" " -o rellinks interpret absolute symlinks as volume relative\n" @@ -426,6 +432,8 @@ FSP_FUSE_API struct fuse *fsp_fuse_new(struct fsp_fuse_env *env, f->env = env; f->set_umask = opt_data.set_umask; f->umask = opt_data.umask; f->set_create_umask = opt_data.set_create_umask; f->create_umask = opt_data.create_umask; + f->set_create_file_umask = opt_data.set_create_file_umask; f->create_file_umask = opt_data.create_file_umask; + f->set_create_dir_umask = opt_data.set_create_dir_umask; f->create_dir_umask = opt_data.create_dir_umask; f->set_uid = opt_data.set_uid; f->uid = opt_data.uid; f->set_gid = opt_data.set_gid; f->gid = opt_data.gid; f->rellinks = opt_data.rellinks; diff --git a/src/dll/fuse/fuse_intf.c b/src/dll/fuse/fuse_intf.c index ee3d9b63..d9a50424 100644 --- a/src/dll/fuse/fuse_intf.c +++ b/src/dll/fuse/fuse_intf.c @@ -794,8 +794,22 @@ static NTSTATUS fsp_fuse_intf_Create(FSP_FILE_SYSTEM *FileSystem, goto exit; } Mode &= ~context->umask; - if (f->set_create_umask) - Mode = 0777 & ~f->create_umask; + if (CreateOptions & FILE_DIRECTORY_FILE) + { + if (f->set_create_dir_umask) + Mode = 0777 & ~f->create_dir_umask; + else + if (f->set_create_umask) + Mode = 0777 & ~f->create_umask; + } + else + { + if (f->set_create_file_umask) + Mode = 0777 & ~f->create_file_umask; + else + if (f->set_create_umask) + Mode = 0777 & ~f->create_umask; + } memset(&fi, 0, sizeof fi); if ('C' == f->env->environment) /* Cygwin */ diff --git a/src/dll/fuse/library.h b/src/dll/fuse/library.h index 261d4f8f..1cbf4c12 100644 --- a/src/dll/fuse/library.h +++ b/src/dll/fuse/library.h @@ -50,6 +50,8 @@ struct fuse struct fsp_fuse_env *env; int set_umask, umask; int set_create_umask, create_umask; + int set_create_file_umask, create_file_umask; + int set_create_dir_umask, create_dir_umask; int set_uid, uid; int set_gid, gid; int rellinks; @@ -138,6 +140,8 @@ struct fsp_fuse_core_opt_data HANDLE DebugLogHandle; int set_umask, umask, set_create_umask, create_umask, + set_create_file_umask, create_file_umask, + set_create_dir_umask, create_dir_umask, set_uid, uid, set_gid, gid, set_attr_timeout, attr_timeout,