Author: delphij
Date: Fri Mar 28 23:12:00 2014
New Revision: 263889
URL: http://svnweb.freebsd.org/changeset/base/263889

Log:
  MFV r263887:
  
  3993 zpool(1M) and zfs(1M) should support -p for "list" and "get"
  4700 "zpool get" doesn't support -H or -o options
  
  MFC after:    2 weeks

Modified:
  head/cddl/contrib/opensolaris/cmd/zpool/zpool.8
  head/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c
  head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs.h
  head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c
  head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c
Directory Properties:
  head/cddl/contrib/opensolaris/   (props changed)
  head/cddl/contrib/opensolaris/lib/libzfs/   (props changed)

Modified: head/cddl/contrib/opensolaris/cmd/zpool/zpool.8
==============================================================================
--- head/cddl/contrib/opensolaris/cmd/zpool/zpool.8     Fri Mar 28 22:49:10 
2014        (r263888)
+++ head/cddl/contrib/opensolaris/cmd/zpool/zpool.8     Fri Mar 28 23:12:00 
2014        (r263889)
@@ -1,5 +1,6 @@
 '\" te
 .\" Copyright (c) 2012, Martin Matuska <m...@freebsd.org>.
+.\" Copyright (c) 2013-2014, Xin Li <delp...@freebsd.org>.
 .\" All Rights Reserved.
 .\"
 .\" The contents of this file are subject to the terms of the
@@ -25,7 +26,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd March 20, 2014
+.Dd March 28, 2014
 .Dt ZPOOL 8
 .Os
 .Sh NAME
@@ -70,6 +71,8 @@
 .Ar pool ...
 .Nm
 .Cm get
+.Op Fl Hp
+.Op Fl o Ar field Ns Op , Ns Ar ...
 .Ar all | property Ns Op , Ns Ar ...
 .Ar pool ...
 .Nm
@@ -120,7 +123,7 @@
 .Ar device
 .Nm
 .Cm list
-.Op Fl H
+.Op Fl Hpv
 .Op Fl o Ar property Ns Op , Ns Ar ...
 .Op Fl T Cm d Ns | Ns Cm u
 .Op Ar pool
@@ -1018,6 +1021,8 @@ is currently being used. This may lead t
 .It Xo
 .Nm
 .Cm get
+.Op Fl Hp
+.Op Fl o Ar field Ns Op , Ns Ar ...
 .Ar all | property Ns Op , Ns Ar ...
 .Ar pool ...
 .Xc
@@ -1036,6 +1041,19 @@ the following fields:
 See the
 .Qq Sx Properties
 section for more information on the available pool properties.
+.Pp
+.It Fl H
+Scripted mode. Do not display headers, and separate fields by a single tab
+instead of arbitrary space.
+.It Fl p
+Display numbers in parsable (exact) values.
+.It Fl o Ar field
+A comma-separated list of columns to display.
+.Sy name Ns , Ns
+.Sy property Ns , Ns
+.Sy value Ns , Ns
+.Sy source
+is the default value.
 .It Xo
 .Nm
 .Cm history
@@ -1335,7 +1353,7 @@ Treat exported or foreign devices as ina
 .It Xo
 .Nm
 .Cm list
-.Op Fl Hv
+.Op Fl Hpv
 .Op Fl o Ar property Ns Op , Ns Ar ...
 .Op Fl T Cm d Ns | Ns Cm u
 .Op Ar pool
@@ -1371,6 +1389,8 @@ for unixtime
 .It Fl H
 Scripted mode. Do not display headers, and separate fields by a single tab
 instead of arbitrary space.
+.It Fl p
+Display numbers in parsable (exact) values.
 .It Fl v
 Show more detailed information.
 .It Fl o Ar property Ns Op , Ns Ar ...

Modified: head/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c
==============================================================================
--- head/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c        Fri Mar 28 
22:49:10 2014        (r263888)
+++ head/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c        Fri Mar 28 
23:12:00 2014        (r263889)
@@ -236,7 +236,7 @@ get_usage(zpool_help_t idx) {
        case HELP_LABELCLEAR:
                return (gettext("\tlabelclear [-f] <vdev>\n"));
        case HELP_LIST:
-               return (gettext("\tlist [-Hv] [-o property[,...]] "
+               return (gettext("\tlist [-Hpv] [-o property[,...]] "
                    "[-T d|u] [pool] ... [interval [count]]\n"));
        case HELP_OFFLINE:
                return (gettext("\toffline [-t] <pool> <device> ...\n"));
@@ -258,8 +258,8 @@ get_usage(zpool_help_t idx) {
                return (gettext("\tupgrade [-v]\n"
                    "\tupgrade [-V version] <-a | pool ...>\n"));
        case HELP_GET:
-               return (gettext("\tget <\"all\" | property[,...]> "
-                   "<pool> ...\n"));
+               return (gettext("\tget [-Hp] [-o \"all\" | field[,...]] "
+                   "<\"all\" | property[,...]> <pool> ...\n"));
        case HELP_SET:
                return (gettext("\tset <property=value> <pool> \n"));
        case HELP_SPLIT:
@@ -2765,6 +2765,7 @@ typedef struct list_cbdata {
        int             cb_namewidth;
        boolean_t       cb_scripted;
        zprop_list_t    *cb_proplist;
+       boolean_t       cb_literal;
 } list_cbdata_t;
 
 /*
@@ -2860,7 +2861,7 @@ print_pool(zpool_handle_t *zhp, list_cbd
                            zpool_get_prop_int(zhp, pl->pl_prop, NULL) == 0)
                                propstr = "-";
                        else if (zpool_get_prop(zhp, pl->pl_prop, property,
-                           sizeof (property), NULL) != 0)
+                           sizeof (property), NULL, cb->cb_literal) != 0)
                                propstr = "-";
                        else
                                propstr = property;
@@ -3011,12 +3012,13 @@ list_callback(zpool_handle_t *zhp, void 
 }
 
 /*
- * zpool list [-H] [-o prop[,prop]*] [-T d|u] [pool] ... [interval [count]]
+ * zpool list [-Hp] [-o prop[,prop]*] [-T d|u] [pool] ... [interval [count]]
  *
  *     -H      Scripted mode.  Don't display headers, and separate properties
  *             by a single tab.
  *     -o      List of properties to display.  Defaults to
  *             "name,size,allocated,free,capacity,health,altroot"
+ *     -p      Diplay values in parsable (exact) format.
  *     -T      Display a timestamp in date(1) or Unix format
  *
  * List all pools in the system, whether or not they're healthy.  Output space
@@ -3037,7 +3039,7 @@ zpool_do_list(int argc, char **argv)
        boolean_t first = B_TRUE;
 
        /* check options */
-       while ((c = getopt(argc, argv, ":Ho:T:v")) != -1) {
+       while ((c = getopt(argc, argv, ":Ho:pT:v")) != -1) {
                switch (c) {
                case 'H':
                        cb.cb_scripted = B_TRUE;
@@ -3045,6 +3047,9 @@ zpool_do_list(int argc, char **argv)
                case 'o':
                        props = optarg;
                        break;
+               case 'p':
+                       cb.cb_literal = B_TRUE;
+                       break;
                case 'T':
                        get_timestamp_arg(*optarg);
                        break;
@@ -5199,7 +5204,7 @@ get_callback(zpool_handle_t *zhp, void *
                        }
                } else {
                        if (zpool_get_prop(zhp, pl->pl_prop, value,
-                           sizeof (value), &srctype) != 0)
+                           sizeof (value), &srctype, cbp->cb_literal) != 0)
                                continue;
 
                        zprop_print_one_property(zpool_get_name(zhp), cbp,
@@ -5210,20 +5215,32 @@ get_callback(zpool_handle_t *zhp, void *
        return (0);
 }
 
+/*
+ * zpool get [-Hp] [-o "all" | field[,...]] <"all" | property[,...]> <pool> ...
+ *
+ *     -H      Scripted mode.  Don't display headers, and separate properties
+ *             by a single tab.
+ *     -o      List of columns to display.  Defaults to
+ *             "name,property,value,source".
+ *     -p      Diplay values in parsable (exact) format.
+ *
+ * Get properties of pools in the system. Output space statistics
+ * for each one as well as other attributes.
+ */
 int
 zpool_do_get(int argc, char **argv)
 {
        zprop_get_cbdata_t cb = { 0 };
        zprop_list_t fake_name = { 0 };
        int ret;
-
-       if (argc < 2) {
-               (void) fprintf(stderr, gettext("missing property "
-                   "argument\n"));
-               usage(B_FALSE);
-       }
+       int c, i;
+       char *value;
 
        cb.cb_first = B_TRUE;
+
+       /*
+        * Set up default columns and sources.
+        */
        cb.cb_sources = ZPROP_SRC_ALL;
        cb.cb_columns[0] = GET_COL_NAME;
        cb.cb_columns[1] = GET_COL_PROPERTY;
@@ -5231,10 +5248,89 @@ zpool_do_get(int argc, char **argv)
        cb.cb_columns[3] = GET_COL_SOURCE;
        cb.cb_type = ZFS_TYPE_POOL;
 
-       if (zprop_get_list(g_zfs, argv[1], &cb.cb_proplist,
+       /* check options */
+       while ((c = getopt(argc, argv, ":Hpo:")) != -1) {
+               switch (c) {
+               case 'p':
+                       cb.cb_literal = B_TRUE;
+                       break;
+               case 'H':
+                       cb.cb_scripted = B_TRUE;
+                       break;
+               case 'o':
+                       bzero(&cb.cb_columns, sizeof (cb.cb_columns));
+                       i = 0;
+                       while (*optarg != '\0') {
+                               static char *col_subopts[] =
+                               { "name", "property", "value", "source",
+                               "all", NULL };
+
+                               if (i == ZFS_GET_NCOLS) {
+                                       (void) fprintf(stderr, gettext("too "
+                                       "many fields given to -o "
+                                       "option\n"));
+                                       usage(B_FALSE);
+                               }
+
+                               switch (getsubopt(&optarg, col_subopts,
+                                   &value)) {
+                               case 0:
+                                       cb.cb_columns[i++] = GET_COL_NAME;
+                                       break;
+                               case 1:
+                                       cb.cb_columns[i++] = GET_COL_PROPERTY;
+                                       break;
+                               case 2:
+                                       cb.cb_columns[i++] = GET_COL_VALUE;
+                                       break;
+                               case 3:
+                                       cb.cb_columns[i++] = GET_COL_SOURCE;
+                                       break;
+                               case 4:
+                                       if (i > 0) {
+                                               (void) fprintf(stderr,
+                                                   gettext("\"all\" conflicts "
+                                                   "with specific fields "
+                                                   "given to -o option\n"));
+                                               usage(B_FALSE);
+                                       }
+                                       cb.cb_columns[0] = GET_COL_NAME;
+                                       cb.cb_columns[1] = GET_COL_PROPERTY;
+                                       cb.cb_columns[2] = GET_COL_VALUE;
+                                       cb.cb_columns[3] = GET_COL_SOURCE;
+                                       i = ZFS_GET_NCOLS;
+                                       break;
+                               default:
+                                       (void) fprintf(stderr,
+                                           gettext("invalid column name "
+                                           "'%s'\n"), value);
+                                       usage(B_FALSE);
+                               }
+                       }
+                       break;
+               case '?':
+                       (void) fprintf(stderr, gettext("invalid option '%c'\n"),
+                           optopt);
+                       usage(B_FALSE);
+               }
+       }
+
+       argc -= optind;
+       argv += optind;
+
+       if (argc < 1) {
+               (void) fprintf(stderr, gettext("missing property "
+                   "argument\n"));
+               usage(B_FALSE);
+       }
+
+       if (zprop_get_list(g_zfs, argv[0], &cb.cb_proplist,
            ZFS_TYPE_POOL) != 0)
                usage(B_FALSE);
 
+       argc--;
+       argv++;
+
        if (cb.cb_proplist != NULL) {
                fake_name.pl_prop = ZPOOL_PROP_NAME;
                fake_name.pl_width = strlen(gettext("NAME"));
@@ -5242,7 +5338,7 @@ zpool_do_get(int argc, char **argv)
                cb.cb_proplist = &fake_name;
        }
 
-       ret = for_each_pool(argc - 2, argv + 2, B_TRUE, &cb.cb_proplist,
+       ret = for_each_pool(argc, argv, B_TRUE, &cb.cb_proplist,
            get_callback, &cb);
 
        if (cb.cb_proplist == &fake_name)

Modified: head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs.h
==============================================================================
--- head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs.h    Fri Mar 28 
22:49:10 2014        (r263888)
+++ head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs.h    Fri Mar 28 
23:12:00 2014        (r263889)
@@ -270,7 +270,7 @@ extern int zpool_label_disk(libzfs_handl
  */
 extern int zpool_set_prop(zpool_handle_t *, const char *, const char *);
 extern int zpool_get_prop(zpool_handle_t *, zpool_prop_t, char *,
-    size_t proplen, zprop_source_t *);
+    size_t proplen, zprop_source_t *, boolean_t);
 extern uint64_t zpool_get_prop_int(zpool_handle_t *, zpool_prop_t,
     zprop_source_t *);
 

Modified: head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c
==============================================================================
--- head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c    Fri Mar 
28 22:49:10 2014        (r263888)
+++ head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c    Fri Mar 
28 23:12:00 2014        (r263889)
@@ -2237,8 +2237,8 @@ zfs_prop_get(zfs_handle_t *zhp, zfs_prop
                        }
 
                        if ((zpool_get_prop(zhp->zpool_hdl,
-                           ZPOOL_PROP_ALTROOT, buf, MAXPATHLEN, NULL)) ||
-                           (strcmp(root, "-") == 0))
+                           ZPOOL_PROP_ALTROOT, buf, MAXPATHLEN, NULL,
+                           B_FALSE)) || (strcmp(root, "-") == 0))
                                root[0] = '\0';
                        /*
                         * Special case an alternate root of '/'. This will

Modified: head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c
==============================================================================
--- head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c       Fri Mar 
28 22:49:10 2014        (r263888)
+++ head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c       Fri Mar 
28 23:12:00 2014        (r263889)
@@ -240,7 +240,7 @@ zpool_pool_state_to_name(pool_state_t st
  */
 int
 zpool_get_prop(zpool_handle_t *zhp, zpool_prop_t prop, char *buf, size_t len,
-    zprop_source_t *srctype)
+    zprop_source_t *srctype, boolean_t literal)
 {
        uint64_t intval;
        const char *strval;
@@ -272,9 +272,7 @@ zpool_get_prop(zpool_handle_t *zhp, zpoo
                                (void) strlcpy(buf,
                                    zpool_get_prop_string(zhp, prop, &src),
                                    len);
-                               if (srctype != NULL)
-                                       *srctype = src;
-                               return (0);
+                               break;
                        }
                        /* FALLTHROUGH */
                default:
@@ -306,12 +304,22 @@ zpool_get_prop(zpool_handle_t *zhp, zpoo
                case ZPOOL_PROP_FREE:
                case ZPOOL_PROP_FREEING:
                case ZPOOL_PROP_EXPANDSZ:
-                       (void) zfs_nicenum(intval, buf, len);
+                       if (literal) {
+                               (void) snprintf(buf, len, "%llu",
+                                   (u_longlong_t)intval);
+                       } else {
+                               (void) zfs_nicenum(intval, buf, len);
+                       }
                        break;
 
                case ZPOOL_PROP_CAPACITY:
-                       (void) snprintf(buf, len, "%llu%%",
-                           (u_longlong_t)intval);
+                       if (literal) {
+                               (void) snprintf(buf, len, "%llu",
+                                   (u_longlong_t)intval);
+                       } else {
+                               (void) snprintf(buf, len, "%llu%%",
+                                   (u_longlong_t)intval);
+                       }
                        break;
 
                case ZPOOL_PROP_DEDUPRATIO:
@@ -407,7 +415,7 @@ zpool_is_bootable(zpool_handle_t *zhp)
        char bootfs[ZPOOL_MAXNAMELEN];
 
        return (zpool_get_prop(zhp, ZPOOL_PROP_BOOTFS, bootfs,
-           sizeof (bootfs), NULL) == 0 && strncmp(bootfs, "-",
+           sizeof (bootfs), NULL, B_FALSE) == 0 && strncmp(bootfs, "-",
            sizeof (bootfs)) != 0);
 }
 
@@ -806,7 +814,7 @@ zpool_expand_proplist(zpool_handle_t *zh
 
                if (entry->pl_prop != ZPROP_INVAL &&
                    zpool_get_prop(zhp, entry->pl_prop, buf, sizeof (buf),
-                   NULL) == 0) {
+                   NULL, B_FALSE) == 0) {
                        if (strlen(buf) > entry->pl_width)
                                entry->pl_width = strlen(buf);
                }
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to