diff options
Diffstat (limited to 'examples/copy-acl.c')
-rw-r--r-- | examples/copy-acl.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/examples/copy-acl.c b/examples/copy-acl.c new file mode 100644 index 0000000..d9a7cc4 --- /dev/null +++ b/examples/copy-acl.c @@ -0,0 +1,53 @@ +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <libgen.h> +#include <sys/acl.h> + +const char *progname; + +int main(int argc, char *argv[]) +{ + acl_t acl, default_acl; + int n, ret = 0; + + progname = basename(argv[0]); + + if (argc < 3) { + printf("%s -- copy access control lists between files \n" + "Usage: %s file1 file2 ...\n", + progname, progname); + return 1; + } + + acl = acl_get_file(argv[1], ACL_TYPE_ACCESS); + if (acl == NULL) { + fprintf(stderr, "%s: getting acl of %s: %s\n", + progname, argv[1], strerror(errno)); + return 1; + } + default_acl = acl_get_file(argv[1], ACL_TYPE_DEFAULT); + if (default_acl == NULL) { + fprintf(stderr, "%s: getting default acl of %s: %s\n", + progname, argv[1], strerror(errno)); + return 1; + } + + for (n = 2; n < argc; n++) { + if (acl_set_file(argv[n], ACL_TYPE_ACCESS, acl) != 0) { + fprintf(stderr, "%s: setting acl for %s: %s\n", + progname, argv[n], strerror(errno)); + ret = 1; + } else if (acl_set_file(argv[n], ACL_TYPE_DEFAULT, + default_acl) != 0) { + fprintf(stderr, "%s: setting default acl for %s: %s\n", + progname, argv[n], strerror(errno)); + ret = 1; + } + } + + acl_free(acl); + acl_free(default_acl); + + return ret; +} |