1#include <stdio.h> 2#include <string.h> 3#include <errno.h> 4#include <libgen.h> 5#include <sys/acl.h> 6 7const char *progname; 8 9int main(int argc, char *argv[]) 10{ 11 acl_t acl, default_acl; 12 int n, ret = 0; 13 14 progname = basename(argv[0]); 15 16 if (argc < 3) { 17 printf("%s -- copy access control lists between files \n" 18 "Usage: %s file1 file2 ...\n", 19 progname, progname); 20 return 1; 21 } 22 23 acl = acl_get_file(argv[1], ACL_TYPE_ACCESS); 24 if (acl == NULL) { 25 fprintf(stderr, "%s: getting acl of %s: %s\n", 26 progname, argv[1], strerror(errno)); 27 return 1; 28 } 29 default_acl = acl_get_file(argv[1], ACL_TYPE_DEFAULT); 30 if (default_acl == NULL) { 31 fprintf(stderr, "%s: getting default acl of %s: %s\n", 32 progname, argv[1], strerror(errno)); 33 return 1; 34 } 35 36 for (n = 2; n < argc; n++) { 37 if (acl_set_file(argv[n], ACL_TYPE_ACCESS, acl) != 0) { 38 fprintf(stderr, "%s: setting acl for %s: %s\n", 39 progname, argv[n], strerror(errno)); 40 ret = 1; 41 } else if (acl_set_file(argv[n], ACL_TYPE_DEFAULT, 42 default_acl) != 0) { 43 fprintf(stderr, "%s: setting default acl for %s: %s\n", 44 progname, argv[n], strerror(errno)); 45 ret = 1; 46 } 47 } 48 49 acl_free(acl); 50 acl_free(default_acl); 51 52 return ret; 53} 54