diff options
author | Martin Pärtel <martin.partel@gmail.com> | 2013-07-22 10:44:09 +0300 |
---|---|---|
committer | Martin Pärtel <martin.partel@gmail.com> | 2013-07-22 10:44:09 +0300 |
commit | f69e67112af4b562396babd290cc99d912205aa3 (patch) | |
tree | c4d18ed6b05c135629c6c07ae03a559cf33d8525 /src/bindfs.c | |
parent | a671fee206476696205256931378f275c6a975d1 (diff) | |
parent | 5c1d9492bfd5290865fad000de0b63cbab243896 (diff) | |
download | bindfs-f69e67112af4b562396babd290cc99d912205aa3.tar.gz |
Merge remote-tracking branch 'antage/master'
Diffstat (limited to 'src/bindfs.c')
-rw-r--r-- | src/bindfs.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/bindfs.c b/src/bindfs.c index fe366c8..af92997 100644 --- a/src/bindfs.c +++ b/src/bindfs.c @@ -114,6 +114,8 @@ static struct Settings { int chmod_allow_x; + struct permchain *chmod_permchain; /* the --chmod-perms option */ + enum XAttrPolicy { XATTR_UNIMPLEMENTED, XATTR_READ_ONLY, @@ -595,6 +597,7 @@ static int bindfs_chmod(const char *path, mode_t mode) switch (settings.chmod_policy) { case CHMOD_NORMAL: + mode = permchain_apply(settings.chmod_permchain, mode); if (chmod(path, mode) == -1) return -errno; return 0; @@ -965,6 +968,7 @@ static void print_usage(const char *progname) " --chmod-ignore Have all chmods fail silently.\n" " --chmod-deny Have all chmods fail with 'permission denied'.\n" " --chmod-allow-x Allow changing file execute bits in any case.\n" + " --chmod-perms Alter permissions when to chmod the original file.\n" "\n" "Extended attribute policy:\n" " --xattr-none Do not implement xattr operations.\n" @@ -1009,6 +1013,7 @@ enum OptionKey { OPTKEY_CHMOD_IGNORE, OPTKEY_CHMOD_DENY, OPTKEY_CHMOD_ALLOW_X, + OPTKEY_CHMOD_PERMS, OPTKEY_XATTR_NONE, OPTKEY_XATTR_READ_ONLY, OPTKEY_XATTR_READ_WRITE, @@ -1336,6 +1341,7 @@ int main(int argc, char *argv[]) char *create_for_user; char *create_for_group; char *create_with_perms; + char *chmod_perms; int no_allow_other; int multithreaded; } od; @@ -1384,6 +1390,7 @@ int main(int argc, char *argv[]) OPT2("--chmod-ignore", "chmod-ignore", OPTKEY_CHMOD_IGNORE), OPT2("--chmod-deny", "chmod-deny", OPTKEY_CHMOD_DENY), OPT2("--chmod-allow-x", "chmod-allow-x", OPTKEY_CHMOD_ALLOW_X), + OPT_OFFSET2("--chmod-perms=%s", "chmod-perms=%s", chmod_perms, -1), OPT2("--xattr-none", "xattr-none", OPTKEY_XATTR_NONE), OPT2("--xattr-ro", "xattr-ro", OPTKEY_XATTR_READ_ONLY), @@ -1418,6 +1425,7 @@ int main(int argc, char *argv[]) settings.chgrp_policy = CHGRP_NORMAL; settings.chmod_policy = CHMOD_NORMAL; settings.chmod_allow_x = 0; + settings.chmod_permchain = permchain_create(); settings.xattr_policy = XATTR_READ_WRITE; settings.mirrored_users_only = 0; settings.mirrored_users = NULL; @@ -1531,6 +1539,12 @@ int main(int argc, char *argv[]) return 1; } } + if (od.chmod_perms) { + if (add_chmod_rules_to_permchain(od.chmod_perms, settings.chmod_permchain) != 0) { + fprintf(stderr, "Invalid permission specification: '%s'\n", od.chmod_perms); + return 1; + } + } /* Single-threaded mode by default */ |