summaryrefslogtreecommitdiff
path: root/usr/src/lib/libzfs
diff options
context:
space:
mode:
authorahrens <none@none>2007-08-02 21:23:46 -0700
committerahrens <none@none>2007-08-02 21:23:46 -0700
commit91ebeef555ce7f899b6270a3c2df47b51f7ad59a (patch)
tree7c2ea33b8ecbb85fdd82366244cb0850dbba3287 /usr/src/lib/libzfs
parent03509b53a806cb39ca94c9a1c00f1c6405321554 (diff)
downloadillumos-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/lib/libzfs')
-rw-r--r--usr/src/lib/libzfs/common/libzfs.h1
-rw-r--r--usr/src/lib/libzfs/common/libzfs_dataset.c121
-rw-r--r--usr/src/lib/libzfs/common/libzfs_util.c6
3 files changed, 39 insertions, 89 deletions
diff --git a/usr/src/lib/libzfs/common/libzfs.h b/usr/src/lib/libzfs/common/libzfs.h
index c7c2726fa6..c444062fa1 100644
--- a/usr/src/lib/libzfs/common/libzfs.h
+++ b/usr/src/lib/libzfs/common/libzfs.h
@@ -107,7 +107,6 @@ enum {
EZFS_BADWHO, /* invalid permission who */
EZFS_BADPERM, /* invalid permission */
EZFS_BADPERMSET, /* invalid permission set name */
- EZFS_PERMSET_CIRCULAR, /* circular dependency on permset */
EZFS_NODELEGATION, /* delegated administration is disabled */
EZFS_PERMRDONLY, /* pemissions are readonly */
EZFS_UNKNOWN
diff --git a/usr/src/lib/libzfs/common/libzfs_dataset.c b/usr/src/lib/libzfs/common/libzfs_dataset.c
index 383b63169e..05c074437c 100644
--- a/usr/src/lib/libzfs/common/libzfs_dataset.c
+++ b/usr/src/lib/libzfs/common/libzfs_dataset.c
@@ -839,14 +839,14 @@ zfs_validate_properties(libzfs_handle_t *hdl, zfs_type_t type, char *pool_name,
*/
strval = NULL;
switch (zfs_prop_get_type(prop)) {
- case prop_type_boolean:
+ case PROP_TYPE_BOOLEAN:
if (prop_parse_boolean(hdl, elem, &intval) != 0) {
(void) zfs_error(hdl, EZFS_BADPROP, errbuf);
goto error;
}
break;
- case prop_type_string:
+ case PROP_TYPE_STRING:
if (nvpair_type(elem) != DATA_TYPE_STRING) {
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
"'%s' must be a string"),
@@ -863,14 +863,14 @@ zfs_validate_properties(libzfs_handle_t *hdl, zfs_type_t type, char *pool_name,
}
break;
- case prop_type_number:
+ case PROP_TYPE_NUMBER:
if (prop_parse_number(hdl, elem, prop, &intval) != 0) {
(void) zfs_error(hdl, EZFS_BADPROP, errbuf);
goto error;
}
break;
- case prop_type_index:
+ case PROP_TYPE_INDEX:
if (prop_parse_index(hdl, elem, prop, &intval) != 0) {
(void) zfs_error(hdl, EZFS_BADPROP, errbuf);
goto error;
@@ -1312,21 +1312,12 @@ zfs_build_perms(zfs_handle_t *zhp, char *whostr, char *perms,
nvlist_t *perms_nvp = NULL;
nvlist_t *sets_nvp = NULL;
char errbuf[1024];
- char *who_tok;
+ char *who_tok, *perm;
int error;
*nvp = NULL;
if (perms) {
- /* Make sure permission string doesn't have an '=' sign in it */
- if (strchr(perms, '=') != NULL) {
- (void) snprintf(errbuf, sizeof (errbuf),
- dgettext(TEXT_DOMAIN,
- "permissions can't contain equal sign : '%s'"),
- perms);
- return (zfs_error(zhp->zfs_hdl, EZFS_BADPERM, errbuf));
- }
-
if ((error = nvlist_alloc(&perms_nvp,
NV_UNIQUE_NAME, 0)) != 0) {
return (1);
@@ -1351,6 +1342,12 @@ zfs_build_perms(zfs_handle_t *zhp, char *whostr, char *perms,
char what;
if ((error = permset_namecheck(whostr, &why, &what)) != 0) {
+ nvlist_free(who_nvp);
+ if (perms_nvp)
+ nvlist_free(perms_nvp);
+ if (sets_nvp)
+ nvlist_free(sets_nvp);
+
switch (why) {
case NAME_ERR_NO_AT:
zfs_error_aux(zhp->zfs_hdl,
@@ -1368,74 +1365,28 @@ zfs_build_perms(zfs_handle_t *zhp, char *whostr, char *perms,
* The first nvlist perms_nvp will have normal permissions and the
* other sets_nvp will have only permssion set names in it.
*/
-
-
- while (perms && *perms != '\0') {
- char *value;
- char *perm_name;
- nvlist_t *update_nvp;
- int perm_num;
- char canonical_name[64];
- char *canonicalp = canonical_name;
-
-
- update_nvp = perms_nvp;
-
- perm_num = getsubopt(&perms, zfs_deleg_perm_tab, &value);
- if (perm_num == -1) {
- zfs_prop_t prop;
-
- prop = zfs_name_to_prop(value);
- if (prop != ZFS_PROP_INVAL) {
- (void) snprintf(canonical_name,
- sizeof (canonical_name), "%s",
- zfs_prop_to_name(prop));
- perm_num = getsubopt(&canonicalp,
- zfs_deleg_perm_tab, &value);
- }
- }
- if (perm_num != -1) {
- perm_name = zfs_deleg_perm_tab[perm_num];
- } else { /* check and see if permission is a named set */
- if (value[0] == '@') {
-
- /*
- * make sure permssion set isn't defined
- * in terms of itself. ie.
- * @set1 = create,destroy,@set1
- */
- if (who_type == ZFS_DELEG_NAMED_SET &&
- strcmp(value, whostr) == 0) {
- nvlist_free(who_nvp);
- nvlist_free(perms_nvp);
- if (sets_nvp)
- nvlist_free(sets_nvp);
- (void) snprintf(errbuf,
- sizeof (errbuf),
- dgettext(TEXT_DOMAIN,
- "Invalid permission %s"), value);
- return (zfs_error(zhp->zfs_hdl,
- EZFS_PERMSET_CIRCULAR, errbuf));
- }
- update_nvp = sets_nvp;
- perm_name = value;
- } else {
- nvlist_free(who_nvp);
- nvlist_free(perms_nvp);
- if (sets_nvp)
- nvlist_free(sets_nvp);
- return (zfs_error(zhp->zfs_hdl,
- EZFS_BADPERM, value));
- }
+ for (perm = strtok(perms, ","); perm; perm = strtok(NULL, ",")) {
+ const char *perm_canonical = zfs_deleg_canonicalize_perm(perm);
+
+ if (perm_canonical) {
+ verify(nvlist_add_boolean(perms_nvp,
+ perm_canonical) == 0);
+ } else if (perm[0] == '@') {
+ verify(nvlist_add_boolean(sets_nvp, perm) == 0);
+ } else {
+ nvlist_free(who_nvp);
+ nvlist_free(perms_nvp);
+ nvlist_free(sets_nvp);
+ return (zfs_error(zhp->zfs_hdl, EZFS_BADPERM, perm));
}
- verify(nvlist_add_boolean(update_nvp, perm_name) == 0);
}
if (whostr && who_type != ZFS_DELEG_CREATE) {
who_tok = strtok(whostr, ",");
if (who_tok == NULL) {
nvlist_free(who_nvp);
- nvlist_free(perms_nvp);
+ if (perms_nvp)
+ nvlist_free(perms_nvp);
if (sets_nvp)
nvlist_free(sets_nvp);
(void) snprintf(errbuf, sizeof (errbuf),
@@ -1455,7 +1406,8 @@ zfs_build_perms(zfs_handle_t *zhp, char *whostr, char *perms,
&who_id);
if (error) {
nvlist_free(who_nvp);
- nvlist_free(perms_nvp);
+ if (perms_nvp)
+ nvlist_free(perms_nvp);
if (sets_nvp)
nvlist_free(sets_nvp);
(void) snprintf(errbuf, sizeof (errbuf),
@@ -1468,7 +1420,6 @@ zfs_build_perms(zfs_handle_t *zhp, char *whostr, char *perms,
/*
* add entries for both local and descendent when required
*/
-
zfs_perms_add_who_nvlist(who_nvp, who_id, who_tok,
perms_nvp, sets_nvp, who_type, inherit);
@@ -2321,13 +2272,13 @@ get_numeric_property(zfs_handle_t *zhp, zfs_prop_t prop, zfs_source_t *src,
default:
switch (zfs_prop_get_type(prop)) {
- case prop_type_number:
- case prop_type_boolean:
- case prop_type_index:
+ case PROP_TYPE_NUMBER:
+ case PROP_TYPE_BOOLEAN:
+ case PROP_TYPE_INDEX:
*val = getprop_uint64(zhp, prop, source);
break;
- case prop_type_string:
+ case PROP_TYPE_STRING:
default:
zfs_error_aux(zhp->zfs_hdl, dgettext(TEXT_DOMAIN,
"cannot get non-numeric property"));
@@ -2536,7 +2487,7 @@ zfs_prop_get(zfs_handle_t *zhp, zfs_prop_t prop, char *propbuf, size_t proplen,
default:
switch (zfs_prop_get_type(prop)) {
- case prop_type_number:
+ case PROP_TYPE_NUMBER:
if (get_numeric_property(zhp, prop, src,
&source, &val) != 0)
return (-1);
@@ -2547,12 +2498,12 @@ zfs_prop_get(zfs_handle_t *zhp, zfs_prop_t prop, char *propbuf, size_t proplen,
zfs_nicenum(val, propbuf, proplen);
break;
- case prop_type_string:
+ case PROP_TYPE_STRING:
(void) strlcpy(propbuf,
getprop_string(zhp, prop, &source), proplen);
break;
- case prop_type_boolean:
+ case PROP_TYPE_BOOLEAN:
if (get_numeric_property(zhp, prop, src,
&source, &val) != 0)
return (-1);
@@ -2560,7 +2511,7 @@ zfs_prop_get(zfs_handle_t *zhp, zfs_prop_t prop, char *propbuf, size_t proplen,
break;
- case prop_type_index:
+ case PROP_TYPE_INDEX:
val = getprop_uint64(zhp, prop, &source);
if (zfs_prop_index_to_string(prop, val,
&strval) != 0)
diff --git a/usr/src/lib/libzfs/common/libzfs_util.c b/usr/src/lib/libzfs/common/libzfs_util.c
index 26c4422b82..7c45ef727e 100644
--- a/usr/src/lib/libzfs/common/libzfs_util.c
+++ b/usr/src/lib/libzfs/common/libzfs_util.c
@@ -44,6 +44,7 @@
#include <libzfs.h>
#include "libzfs_impl.h"
+#include "zfs_prop.h"
int
libzfs_errno(libzfs_handle_t *hdl)
@@ -186,9 +187,6 @@ libzfs_error_description(libzfs_handle_t *hdl)
return (dgettext(TEXT_DOMAIN, "invalid permission"));
case EZFS_BADPERMSET:
return (dgettext(TEXT_DOMAIN, "invalid permission set name"));
- case EZFS_PERMSET_CIRCULAR:
- return (dgettext(TEXT_DOMAIN,
- "Cannot define a permission set in terms of itself"));
case EZFS_NODELEGATION:
return (dgettext(TEXT_DOMAIN, "delegated administration is "
"disabled on pool"));
@@ -556,6 +554,8 @@ libzfs_init(void)
hdl->libzfs_sharetab = fopen("/etc/dfs/sharetab", "r");
+ zfs_prop_init();
+
return (hdl);
}