changeset 3635:63e2169c1249

PSARC 2007/050 zfs list -d 6260523 want 'zfs list <path>'
author ck153898
date Mon, 12 Feb 2007 11:30:24 -0800
parents f78a304117bb
children 1f5a3ccc94df
files usr/src/cmd/zfs/zfs_iter.c usr/src/cmd/zfs/zfs_iter.h usr/src/cmd/zfs/zfs_main.c usr/src/lib/libzfs/common/libzfs.h usr/src/lib/libzfs/common/libzfs_util.c usr/src/lib/libzfs/common/mapfile-vers
diffstat 6 files changed, 65 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/cmd/zfs/zfs_iter.c	Mon Feb 12 10:14:36 2007 -0800
+++ b/usr/src/cmd/zfs/zfs_iter.c	Mon Feb 12 11:30:24 2007 -0800
@@ -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 @@
 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 @@
 		}
 
 		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;
--- a/usr/src/cmd/zfs/zfs_iter.h	Mon Feb 12 10:14:36 2007 -0800
+++ b/usr/src/cmd/zfs/zfs_iter.h	Mon Feb 12 11:30:24 2007 -0800
@@ -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 @@
 } 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 *);
 
--- a/usr/src/cmd/zfs/zfs_main.c	Mon Feb 12 10:14:36 2007 -0800
+++ b/usr/src/cmd/zfs/zfs_main.c	Mon Feb 12 11:30:24 2007 -0800
@@ -1273,7 +1273,7 @@
 
 	/* 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 @@
 
 	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 @@
 	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 @@
 	}
 
 	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) = '=';
--- a/usr/src/lib/libzfs/common/libzfs.h	Mon Feb 12 10:14:36 2007 -0800
+++ b/usr/src/lib/libzfs/common/libzfs.h	Mon Feb 12 11:30:24 2007 -0800
@@ -319,6 +319,7 @@
 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.
--- a/usr/src/lib/libzfs/common/libzfs_util.c	Mon Feb 12 10:14:36 2007 -0800
+++ b/usr/src/lib/libzfs/common/libzfs_util.c	Mon Feb 12 11:30:24 2007 -0800
@@ -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 @@
 }
 
 /*
+ * 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().
  */
--- a/usr/src/lib/libzfs/common/mapfile-vers	Mon Feb 12 10:14:36 2007 -0800
+++ b/usr/src/lib/libzfs/common/mapfile-vers	Mon Feb 12 11:30:24 2007 -0800
@@ -60,6 +60,7 @@
 	zfs_nicenum;
 	zfs_nicestrtonum;
 	zfs_open;
+	zfs_path_to_zhandle;
 	zfs_promote;
 	zfs_prop_align_right;
 	zfs_prop_column_name;