Mercurial > illumos > illumos-gate
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(). */