Deleted Added
full compact
28c28
< __FBSDID("$FreeBSD: head/bin/setfacl/setfacl.c 182813 2008-09-06 13:17:35Z trasz $");
---
> __FBSDID("$FreeBSD: head/bin/setfacl/setfacl.c 196936 2009-09-07 16:19:32Z trasz $");
36a37
> #include <errno.h>
44,46c45,46
< static void add_filename(const char *filename);
< static acl_t *get_file_acls(const char *filename);
< static void usage(void);
---
> static void add_filename(const char *filename);
> static void usage(void);
62,94d61
< static acl_t *
< get_file_acls(const char *filename)
< {
< acl_t *acl;
< struct stat sb;
<
< if (stat(filename, &sb) == -1) {
< warn("stat() of %s failed", filename);
< return (NULL);
< }
<
< acl = zmalloc(sizeof(acl_t) * 2);
< if (h_flag)
< acl[ACCESS_ACL] = acl_get_link_np(filename, ACL_TYPE_ACCESS);
< else
< acl[ACCESS_ACL] = acl_get_file(filename, ACL_TYPE_ACCESS);
< if (acl[ACCESS_ACL] == NULL)
< err(1, "acl_get_file() failed");
< if (S_ISDIR(sb.st_mode)) {
< if (h_flag)
< acl[DEFAULT_ACL] = acl_get_link_np(filename,
< ACL_TYPE_DEFAULT);
< else
< acl[DEFAULT_ACL] = acl_get_file(filename,
< ACL_TYPE_DEFAULT);
< if (acl[DEFAULT_ACL] == NULL)
< err(1, "acl_get_file() failed");
< } else
< acl[DEFAULT_ACL] = NULL;
<
< return (acl);
< }
<
99,100c66,67
< fprintf(stderr, "usage: setfacl [-bdhkn] [-m entries] [-M file] "
< "[-x entries] [-X file] [file ...]\n");
---
> fprintf(stderr, "usage: setfacl [-bdhkn] [-a position entries] "
> "[-m entries] [-M file] [-x entries] [-X file] [file ...]\n");
107c74,75
< acl_t *acl, final_acl;
---
> acl_t acl;
> acl_type_t acl_type;
109c77,78
< int local_error, carried_error, ch, i;
---
> int local_error, carried_error, ch, i, entry_number, ret;
> int h_flag;
112a82,83
> char *end;
> struct stat sb;
121c92
< while ((ch = getopt(argc, argv, "M:X:bdhkm:nx:")) != -1)
---
> while ((ch = getopt(argc, argv, "M:X:a:bdhkm:nx:")) != -1)
127c98
< err(1, "get_acl_from_file() failed");
---
> err(1, "%s: get_acl_from_file() failed", optarg);
136a108,126
> case 'a':
> entry = zmalloc(sizeof(struct sf_entry));
>
> entry_number = strtol(optarg, &end, 10);
> if (end - optarg != (int)strlen(optarg))
> errx(1, "%s: invalid entry number", optarg);
> if (entry_number < 0)
> errx(1, "%s: entry number cannot be less than zero", optarg);
> entry->entry_number = entry_number;
>
> if (argv[optind] == NULL)
> errx(1, "missing ACL");
> entry->acl = acl_from_text(argv[optind]);
> if (entry->acl == NULL)
> err(1, "%s", argv[optind]);
> optind++;
> entry->op = OP_ADD_ACL;
> TAILQ_INSERT_TAIL(&entrylist, entry, next);
> break;
166,169c156,167
< entry->acl = acl_from_text(optarg);
< if (entry->acl == NULL)
< err(1, "%s", optarg);
< entry->op = OP_REMOVE_ACL;
---
> entry_number = strtol(optarg, &end, 10);
> if (end - optarg == (int)strlen(optarg)) {
> if (entry_number < 0)
> errx(1, "%s: entry number cannot be less than zero", optarg);
> entry->entry_number = entry_number;
> entry->op = OP_REMOVE_BY_NUMBER;
> } else {
> entry->acl = acl_from_text(optarg);
> if (entry->acl == NULL)
> err(1, "%s", optarg);
> entry->op = OP_REMOVE_ACL;
> }
202,204c200,203
< /* get our initial access and default ACL's */
< acl = get_file_acls(file->filename);
< if (acl == NULL)
---
> local_error = 0;
>
> if (stat(file->filename, &sb) == -1) {
> warn("%s: stat() failed", file->filename);
206,207c205,209
< if ((acl_type == ACL_TYPE_DEFAULT) && !acl[1]) {
< warnx("Default ACL not valid for %s", file->filename);
---
> }
>
> if (acl_type == ACL_TYPE_DEFAULT && S_ISDIR(sb.st_mode) == 0) {
> warnx("%s: default ACL may only be set on a directory",
> file->filename);
211c213,230
< local_error = 0;
---
> if (h_flag)
> ret = lpathconf(file->filename, _PC_ACL_NFS4);
> else
> ret = pathconf(file->filename, _PC_ACL_NFS4);
> if (ret > 0) {
> if (acl_type == ACL_TYPE_DEFAULT) {
> warnx("%s: there are no default entries "
> "in NFSv4 ACLs", file->filename);
> continue;
> }
> acl_type = ACL_TYPE_NFS4;
> } else if (ret == 0) {
> if (acl_type == ACL_TYPE_NFS4)
> acl_type = ACL_TYPE_ACCESS;
> } else if (ret < 0 && errno != EINVAL) {
> warn("%s: pathconf(..., _PC_ACL_NFS4) failed",
> file->filename);
> }
212a232,245
> if (h_flag)
> acl = acl_get_link_np(file->filename, acl_type);
> else
> acl = acl_get_file(file->filename, acl_type);
> if (acl == NULL) {
> if (h_flag)
> warn("%s: acl_get_link_np() failed",
> file->filename);
> else
> warn("%s: acl_get_file() failed",
> file->filename);
> continue;
> }
>
218a252,255
> case OP_ADD_ACL:
> local_error += add_acl(entry->acl,
> entry->entry_number, &acl, file->filename);
> break;
220c257,258
< local_error += merge_acl(entry->acl, acl);
---
> local_error += merge_acl(entry->acl, &acl,
> file->filename);
224c262
< remove_ext(acl);
---
> remove_ext(&acl, file->filename);
227a266,271
> if (acl_type == ACL_TYPE_NFS4) {
> warnx("%s: there are no default entries in NFSv4 ACLs; "
> "cannot remove", file->filename);
> local_error++;
> break;
> }
229c273,274
< warn("acl_delete_def_file() failed");
---
> warn("%s: acl_delete_def_file() failed",
> file->filename);
232c277,279
< local_error += remove_default(acl);
---
> if (acl_type == ACL_TYPE_DEFAULT)
> local_error += remove_default(&acl,
> file->filename);
236c283,284
< local_error += remove_acl(entry->acl, acl);
---
> local_error += remove_acl(entry->acl, &acl,
> file->filename);
238a287,291
> case OP_REMOVE_BY_NUMBER:
> local_error += remove_by_number(entry->entry_number,
> &acl, file->filename);
> need_mask = 1;
> break;
248,257c301,303
< if (acl_type == ACL_TYPE_ACCESS) {
< final_acl = acl[ACCESS_ACL];
< acl_free(acl[DEFAULT_ACL]);
< } else {
< final_acl = acl[DEFAULT_ACL];
< acl_free(acl[ACCESS_ACL]);
< }
<
< if (need_mask && (set_acl_mask(&final_acl) == -1)) {
< warnx("failed to set ACL mask on %s", file->filename);
---
> if (acl_type != ACL_TYPE_NFS4 && need_mask &&
> set_acl_mask(&acl, file->filename) == -1) {
> warnx("%s: failed to set ACL mask", file->filename);
261c307
< final_acl) == -1) {
---
> acl) == -1) {
263c309
< warn("acl_set_link_np() failed for %s",
---
> warn("%s: acl_set_link_np() failed",
268c314
< final_acl) == -1) {
---
> acl) == -1) {
270c316
< warn("acl_set_file() failed for %s",
---
> warn("%s: acl_set_file() failed",
275,276c321
< acl_free(final_acl);
< free(acl);
---
> acl_free(acl);