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