summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorck153898 <none@none>2007-02-12 11:30:24 -0800
committerck153898 <none@none>2007-02-12 11:30:24 -0800
commit5aba80db367b061758a29154d304977d00d8e4f4 (patch)
tree80dfd26b7701f87bd0d278f10812ec7c71b38ead
parent52d8a8f99665c68b55f5343b8158e0496c889707 (diff)
downloadillumos-joyent-5aba80db367b061758a29154d304977d00d8e4f4.tar.gz
PSARC 2007/050 zfs list -d
6260523 want 'zfs list <path>'
-rw-r--r--usr/src/cmd/zfs/zfs_iter.c12
-rw-r--r--usr/src/cmd/zfs/zfs_iter.h4
-rw-r--r--usr/src/cmd/zfs/zfs_main.c8
-rw-r--r--usr/src/lib/libzfs/common/libzfs.h1
-rw-r--r--usr/src/lib/libzfs/common/libzfs_util.c49
-rw-r--r--usr/src/lib/libzfs/common/mapfile-vers1
6 files changed, 65 insertions, 10 deletions
diff --git a/usr/src/cmd/zfs/zfs_iter.c b/usr/src/cmd/zfs/zfs_iter.c
index c2d4260d8f..eb6b8b14dc 100644
--- a/usr/src/cmd/zfs/zfs_iter.c
+++ b/usr/src/cmd/zfs/zfs_iter.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -311,7 +311,7 @@ zfs_sort(const void *larg, const void *rarg, void *data)
int
zfs_for_each(int argc, char **argv, boolean_t recurse, zfs_type_t types,
zfs_sort_column_t *sortcol, zfs_proplist_t **proplist, zfs_iter_f callback,
- void *data)
+ void *data, boolean_t args_can_be_paths)
{
callback_data_t cb;
int ret = 0;
@@ -361,7 +361,13 @@ zfs_for_each(int argc, char **argv, boolean_t recurse, zfs_type_t types,
}
for (i = 0; i < argc; i++) {
- if ((zhp = zfs_open(g_zfs, argv[i], argtype)) != NULL)
+ if (args_can_be_paths) {
+ zhp = zfs_path_to_zhandle(g_zfs, argv[i],
+ argtype);
+ } else {
+ zhp = zfs_open(g_zfs, argv[i], argtype);
+ }
+ if (zhp != NULL)
ret |= zfs_callback(zhp, &cb);
else
ret = 1;
diff --git a/usr/src/cmd/zfs/zfs_iter.h b/usr/src/cmd/zfs/zfs_iter.h
index d5c735d604..1f0ce8eb6f 100644
--- a/usr/src/cmd/zfs/zfs_iter.h
+++ b/usr/src/cmd/zfs/zfs_iter.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -41,7 +41,7 @@ typedef struct zfs_sort_column {
} zfs_sort_column_t;
int zfs_for_each(int, char **, boolean_t, zfs_type_t, zfs_sort_column_t *,
- zfs_proplist_t **, zfs_iter_f, void *);
+ zfs_proplist_t **, zfs_iter_f, void *, boolean_t);
int zfs_add_sort_column(zfs_sort_column_t **, const char *, boolean_t);
void zfs_free_sort_columns(zfs_sort_column_t *);
diff --git a/usr/src/cmd/zfs/zfs_main.c b/usr/src/cmd/zfs/zfs_main.c
index 1e728a1eda..6abfb3097e 100644
--- a/usr/src/cmd/zfs/zfs_main.c
+++ b/usr/src/cmd/zfs/zfs_main.c
@@ -1273,7 +1273,7 @@ zfs_do_get(int argc, char **argv)
/* run for each object */
ret = zfs_for_each(argc, argv, recurse, ZFS_TYPE_ANY, NULL,
- &cb.cb_proplist, get_callback, &cb);
+ &cb.cb_proplist, get_callback, &cb, B_FALSE);
if (cb.cb_proplist == &fake_name)
zfs_free_proplist(fake_name.pl_next);
@@ -1378,7 +1378,7 @@ zfs_do_inherit(int argc, char **argv)
ret = zfs_for_each(argc, argv, recurse,
ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, NULL, NULL,
- inherit_callback, &cb);
+ inherit_callback, &cb, B_FALSE);
if (cb.cb_any_successful) {
zpool_log_history(g_zfs, argc + optind + 1, argv - optind - 1,
@@ -1628,7 +1628,7 @@ zfs_do_list(int argc, char **argv)
cb.cb_first = B_TRUE;
ret = zfs_for_each(argc, argv, recurse, types, sortcol, &cb.cb_proplist,
- list_callback, &cb);
+ list_callback, &cb, B_TRUE);
zfs_free_proplist(cb.cb_proplist);
zfs_free_sort_columns(sortcol);
@@ -1983,7 +1983,7 @@ zfs_do_set(int argc, char **argv)
}
ret = zfs_for_each(argc - 2, argv + 2, B_FALSE,
- ZFS_TYPE_ANY, NULL, NULL, set_callback, &cb);
+ ZFS_TYPE_ANY, NULL, NULL, set_callback, &cb, B_FALSE);
if (cb.cb_any_successful) {
*(cb.cb_value - 1) = '=';
diff --git a/usr/src/lib/libzfs/common/libzfs.h b/usr/src/lib/libzfs/common/libzfs.h
index 685f7b5a14..2967ef0d11 100644
--- a/usr/src/lib/libzfs/common/libzfs.h
+++ b/usr/src/lib/libzfs/common/libzfs.h
@@ -319,6 +319,7 @@ extern void zfs_refresh_properties(zfs_handle_t *);
extern int zfs_name_valid(const char *, zfs_type_t);
extern int zfs_disable(zfs_handle_t *);
extern int zfs_enable(zfs_handle_t *);
+extern zfs_handle_t *zfs_path_to_zhandle(libzfs_handle_t *, char *, zfs_type_t);
/*
* Mount support functions.
diff --git a/usr/src/lib/libzfs/common/libzfs_util.c b/usr/src/lib/libzfs/common/libzfs_util.c
index 48ee3f509e..a16202534b 100644
--- a/usr/src/lib/libzfs/common/libzfs_util.c
+++ b/usr/src/lib/libzfs/common/libzfs_util.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -38,6 +38,8 @@
#include <strings.h>
#include <unistd.h>
#include <sys/mnttab.h>
+#include <sys/mntent.h>
+#include <sys/types.h>
#include <libzfs.h>
@@ -521,6 +523,51 @@ zfs_get_handle(zfs_handle_t *zhp)
}
/*
+ * Given a name, determine whether or not it's a valid path
+ * (starts with '/' or "./"). If so, walk the mnttab trying
+ * to match the device number. If not, treat the path as an
+ * fs/vol/snap name.
+ */
+zfs_handle_t *
+zfs_path_to_zhandle(libzfs_handle_t *hdl, char *path, zfs_type_t argtype)
+{
+ struct stat64 statbuf;
+ struct extmnttab entry;
+ int ret;
+
+ if (path[0] != '/' && strncmp(path, "./", strlen("./")) != 0) {
+ /*
+ * It's not a valid path, assume it's a name of type 'argtype'.
+ */
+ return (zfs_open(hdl, path, argtype));
+ }
+
+ if (stat64(path, &statbuf) != 0) {
+ (void) fprintf(stderr, "%s: %s\n", path, strerror(errno));
+ return (NULL);
+ }
+
+ rewind(hdl->libzfs_mnttab);
+ while ((ret = getextmntent(hdl->libzfs_mnttab, &entry, 0)) == 0) {
+ if (makedevice(entry.mnt_major, entry.mnt_minor) ==
+ statbuf.st_dev) {
+ break;
+ }
+ }
+ if (ret != 0) {
+ return (NULL);
+ }
+
+ if (strcmp(entry.mnt_fstype, MNTTYPE_ZFS) != 0) {
+ (void) fprintf(stderr, gettext("'%s': not a ZFS filesystem\n"),
+ path);
+ return (NULL);
+ }
+
+ return (zfs_open(hdl, entry.mnt_special, ZFS_TYPE_FILESYSTEM));
+}
+
+/*
* Initialize the zc_nvlist_dst member to prepare for receiving an nvlist from
* an ioctl().
*/
diff --git a/usr/src/lib/libzfs/common/mapfile-vers b/usr/src/lib/libzfs/common/mapfile-vers
index 1c3efe8e44..49a809fb4f 100644
--- a/usr/src/lib/libzfs/common/mapfile-vers
+++ b/usr/src/lib/libzfs/common/mapfile-vers
@@ -60,6 +60,7 @@ SUNWprivate_1.1 {
zfs_nicenum;
zfs_nicestrtonum;
zfs_open;
+ zfs_path_to_zhandle;
zfs_promote;
zfs_prop_align_right;
zfs_prop_column_name;