diff options
author | ahrens <none@none> | 2007-08-02 21:23:46 -0700 |
---|---|---|
committer | ahrens <none@none> | 2007-08-02 21:23:46 -0700 |
commit | 91ebeef555ce7f899b6270a3c2df47b51f7ad59a (patch) | |
tree | 7c2ea33b8ecbb85fdd82366244cb0850dbba3287 /usr/src/common/zfs/zfs_deleg.c | |
parent | 03509b53a806cb39ca94c9a1c00f1c6405321554 (diff) | |
download | illumos-joyent-91ebeef555ce7f899b6270a3c2df47b51f7ad59a.tar.gz |
6393351 unique_* could be improved
6553348 assertion failed: ab->b_flags & (1 << 3) at line 2572 of arc.c
6582408 ::arc should accept -k/-m/-g to print in kilo/mega/giga-bytes
6582438 should have generic reader-priority rwlock for spa_config locks
6582441 zfs_cmd_t should only be used to pass arguments to/from userland
6582456 property code is overdue for some spring cleaning
6588564 zpl unmount lock should use regular rwlock
Diffstat (limited to 'usr/src/common/zfs/zfs_deleg.c')
-rw-r--r-- | usr/src/common/zfs/zfs_deleg.c | 121 |
1 files changed, 50 insertions, 71 deletions
diff --git a/usr/src/common/zfs/zfs_deleg.c b/usr/src/common/zfs/zfs_deleg.c index d7c3046572..31ea16b29c 100644 --- a/usr/src/common/zfs/zfs_deleg.c +++ b/usr/src/common/zfs/zfs_deleg.c @@ -37,7 +37,9 @@ #include <libnvpair.h> #include <ctype.h> #endif +/* XXX includes zfs_context.h, so why bother with the above? */ #include <sys/dsl_deleg.h> +#include "zfs_prop.h" #include "zfs_deleg.h" #include "zfs_namecheck.h" @@ -57,108 +59,84 @@ char *zfs_deleg_perm_tab[] = { ZFS_DELEG_PERM_SHARE, ZFS_DELEG_PERM_SEND, ZFS_DELEG_PERM_RECEIVE, - ZFS_DELEG_PERM_QUOTA, - ZFS_DELEG_PERM_RESERVATION, - ZFS_DELEG_PERM_VOLSIZE, - ZFS_DELEG_PERM_RECORDSIZE, - ZFS_DELEG_PERM_MOUNTPOINT, - ZFS_DELEG_PERM_SHARENFS, - ZFS_DELEG_PERM_CHECKSUM, - ZFS_DELEG_PERM_COMPRESSION, - ZFS_DELEG_PERM_ATIME, - ZFS_DELEG_PERM_DEVICES, - ZFS_DELEG_PERM_EXEC, - ZFS_DELEG_PERM_SETUID, - ZFS_DELEG_PERM_READONLY, - ZFS_DELEG_PERM_ZONED, - ZFS_DELEG_PERM_SNAPDIR, - ZFS_DELEG_PERM_ACLMODE, - ZFS_DELEG_PERM_ACLINHERIT, ZFS_DELEG_PERM_ALLOW, - ZFS_DELEG_PERM_CANMOUNT, ZFS_DELEG_PERM_USERPROP, - ZFS_DELEG_PERM_SHAREISCSI, - ZFS_DELEG_PERM_XATTR, - ZFS_DELEG_PERM_COPIES, - ZFS_DELEG_PERM_VERSION, NULL }; -int -zfs_deleg_type(char *name) +static int +zfs_valid_permission_name(const char *perm) { - return (name[0]); + if (zfs_deleg_canonicalize_perm(perm)) + return (0); + + return (permset_namecheck(perm, NULL, NULL)); } -static int -zfs_valid_permission_name(char *perm) +const char * +zfs_deleg_canonicalize_perm(const char *perm) { int i; + zfs_prop_t prop; + for (i = 0; zfs_deleg_perm_tab[i] != NULL; i++) { if (strcmp(perm, zfs_deleg_perm_tab[i]) == 0) - return (0); + return (perm); } - return (permset_namecheck(perm, NULL, NULL)); + prop = zfs_name_to_prop(perm); + if (prop != ZFS_PROP_INVAL && zfs_prop_delegatable(prop)) + return (zfs_prop_to_name(prop)); + return (NULL); + } static int zfs_validate_who(char *who) { - int error = 0; char *p; - switch (zfs_deleg_type(who)) { + if (who[2] != ZFS_DELEG_FIELD_SEP_CHR) + return (-1); + + switch (who[0]) { case ZFS_DELEG_USER: case ZFS_DELEG_GROUP: case ZFS_DELEG_USER_SETS: case ZFS_DELEG_GROUP_SETS: - if ((who[1] != 'l' || who[1] != 'd') && - (who[2] != ZFS_DELEG_FIELD_SEP_CHR)) { - error = -1; - break; - } - - for (p = &who[3]; p && *p; p++) - if (!isdigit(*p)) { - error = -1; - } + if (who[1] != ZFS_DELEG_LOCAL && who[1] != ZFS_DELEG_DESCENDENT) + return (-1); + for (p = &who[3]; *p; p++) + if (!isdigit(*p)) + return (-1); break; + case ZFS_DELEG_NAMED_SET: case ZFS_DELEG_NAMED_SET_SETS: - error = permset_namecheck(&who[3], NULL, NULL); - break; + if (who[1] != ZFS_DELEG_NA) + return (-1); + return (permset_namecheck(&who[3], NULL, NULL)); case ZFS_DELEG_CREATE: case ZFS_DELEG_CREATE_SETS: - case ZFS_DELEG_EVERYONE: - case ZFS_DELEG_EVERYONE_SETS: + if (who[1] != ZFS_DELEG_NA) + return (-1); if (who[3] != '\0') - error = -1; + return (-1); break; - default: - error = -1; - } - return (error); -} - -static int -zfs_validate_iflags(char *who) -{ - switch (zfs_deleg_type(who)) { - case ZFS_DELEG_NAMED_SET: - case ZFS_DELEG_NAMED_SET_SETS: - case ZFS_DELEG_CREATE: - case ZFS_DELEG_CREATE_SETS: - if (who[1] != '-') + case ZFS_DELEG_EVERYONE: + case ZFS_DELEG_EVERYONE_SETS: + if (who[1] != ZFS_DELEG_LOCAL && who[1] != ZFS_DELEG_DESCENDENT) return (-1); - break; - default: - if (who[1] != 'l' && who[1] != 'd') + if (who[3] != '\0') return (-1); break; + + default: + return (-1); } + return (0); } @@ -180,9 +158,6 @@ zfs_deleg_verify_nvlist(nvlist_t *nvp) if (zfs_validate_who(nvpair_name(who))) return (-1); - if (zfs_validate_iflags(nvpair_name(who))) - return (-1); - error = nvlist_lookup_nvlist(nvp, nvpair_name(who), &perms); if (error && error != ENOENT) @@ -197,9 +172,8 @@ zfs_deleg_verify_nvlist(nvlist_t *nvp) do { error = zfs_valid_permission_name( nvpair_name(perm_name)); - if (error) { + if (error) return (-1); - } } while (perm_name = nvlist_next_nvpair(perms, perm_name)); } while (who = nvlist_next_nvpair(nvp, who)); return (0); @@ -220,7 +194,8 @@ zfs_deleg_verify_nvlist(nvlist_t *nvp) * data - is either a permission set name or a 64 bit uid/gid. */ void -zfs_deleg_whokey(char *attr, char type, char inheritchr, void *data) +zfs_deleg_whokey(char *attr, zfs_deleg_who_type_t type, + char inheritchr, void *data) { int len = ZFS_MAX_DELEG_NAME; uint64_t *id = data; @@ -243,8 +218,12 @@ zfs_deleg_whokey(char *attr, char type, char inheritchr, void *data) (void) snprintf(attr, len, "%c-%c", type, ZFS_DELEG_FIELD_SEP_CHR); break; - default: + case ZFS_DELEG_EVERYONE: + case ZFS_DELEG_EVERYONE_SETS: (void) snprintf(attr, len, "%c%c%c", type, inheritchr, ZFS_DELEG_FIELD_SEP_CHR); + break; + default: + ASSERT(!"bad zfs_deleg_who_type_t"); } } |