libzfs_util.c revision 8488aeb5df27784d479c16cde06a9e25cd9a1152
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER START
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The contents of this file are subject to the terms of the
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * Common Development and Distribution License (the "License").
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * You may not use this file except in compliance with the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fa9e4066f08beec538e775443c5be79dd423fcabahrens * or http://www.opensolaris.org/os/licensing.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * See the License for the specific language governing permissions
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and limitations under the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * When distributing Covered Code, include this CDDL HEADER in each
fa9e4066f08beec538e775443c5be79dd423fcabahrens * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If applicable, add the following below this CDDL HEADER, with the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * fields enclosed by brackets "[]" replaced with your own identifying
fa9e4066f08beec538e775443c5be79dd423fcabahrens * information: Portions Copyright [yyyy] [name of copyright owner]
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER END
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
b2634b9c57bbcfa01bb5dec2e196aec32957925fEric Taylor * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Use is subject to license terms.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#pragma ident "%Z%%M% %I% %E% SMI"
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Internal utility routines for the ZFS library.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <errno.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <fcntl.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <libintl.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <stdarg.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <stdio.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <stdlib.h>
990b4856d0eaada6f8140335733a1b1771ed2746lling#include <strings.h>
990b4856d0eaada6f8140335733a1b1771ed2746lling#include <unistd.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/mnttab.h>
5aba80db367b061758a29154d304977d00d8e4f4ck#include <sys/mntent.h>
5aba80db367b061758a29154d304977d00d8e4f4ck#include <sys/types.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <libzfs.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "libzfs_impl.h"
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
99653d4ee642c6528e88224f12409a5f23060994eschrocklibzfs_errno(libzfs_handle_t *hdl)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock return (hdl->libzfs_error);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrensconst char *
99653d4ee642c6528e88224f12409a5f23060994eschrocklibzfs_error_action(libzfs_handle_t *hdl)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock return (hdl->libzfs_action);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrensconst char *
99653d4ee642c6528e88224f12409a5f23060994eschrocklibzfs_error_description(libzfs_handle_t *hdl)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock if (hdl->libzfs_desc[0] != '\0')
99653d4ee642c6528e88224f12409a5f23060994eschrock return (hdl->libzfs_desc);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock switch (hdl->libzfs_error) {
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_NOMEM:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "out of memory"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_BADPROP:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "invalid property value"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_PROPREADONLY:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "read only property"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_PROPTYPE:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "property doesn't apply to "
99653d4ee642c6528e88224f12409a5f23060994eschrock "datasets of this type"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_PROPNONINHERIT:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "property cannot be inherited"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_PROPSPACE:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "invalid quota or reservation"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_BADTYPE:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "operation not applicable to "
99653d4ee642c6528e88224f12409a5f23060994eschrock "datasets of this type"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_BUSY:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "pool or dataset is busy"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_EXISTS:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "pool or dataset exists"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_NOENT:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "no such pool or dataset"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_BADSTREAM:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "invalid backup stream"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_DSREADONLY:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "dataset is read only"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_VOLTOOBIG:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "volume size exceeds limit for "
99653d4ee642c6528e88224f12409a5f23060994eschrock "this system"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_VOLHASDATA:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "volume has data"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_INVALIDNAME:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "invalid name"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_BADRESTORE:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "unable to restore to "
99653d4ee642c6528e88224f12409a5f23060994eschrock "destination"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_BADBACKUP:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "backup failed"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_BADTARGET:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "invalid target vdev"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_NODEVICE:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "no such device in pool"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_BADDEV:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "invalid device"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_NOREPLICAS:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "no valid replicas"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_RESILVERING:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "currently resilvering"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_BADVERSION:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "unsupported version"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_POOLUNAVAIL:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "pool is unavailable"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_DEVOVERFLOW:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "too many devices in one vdev"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_BADPATH:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "must be an absolute path"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_CROSSTARGET:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "operation crosses datasets or "
99653d4ee642c6528e88224f12409a5f23060994eschrock "pools"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_ZONED:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "dataset in use by local zone"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_MOUNTFAILED:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "mount failed"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_UMOUNTFAILED:
f3861e1a2ceec23a5b699c24d814b7775a9e0b52ahl return (dgettext(TEXT_DOMAIN, "umount failed"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_UNSHARENFSFAILED:
f3861e1a2ceec23a5b699c24d814b7775a9e0b52ahl return (dgettext(TEXT_DOMAIN, "unshare(1M) failed"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_SHARENFSFAILED:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (dgettext(TEXT_DOMAIN, "share(1M) failed"));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case EZFS_DEVLINKS:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (dgettext(TEXT_DOMAIN, "failed to create /dev links"));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case EZFS_PERM:
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks return (dgettext(TEXT_DOMAIN, "permission denied"));
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks case EZFS_NOSPC:
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks return (dgettext(TEXT_DOMAIN, "out of space"));
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks case EZFS_IO:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "I/O error"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_INTR:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "signal received"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_ISSPARE:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "device is reserved as a hot "
99653d4ee642c6528e88224f12409a5f23060994eschrock "spare"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_INVALCONFIG:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "invalid vdev configuration"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_RECURSIVE:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "recursive dataset dependency"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_NOHISTORY:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "no history available"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_UNSHAREISCSIFAILED:
3bb79bece53191f2cf27aa61a72ea1784a7ce700eschrock return (dgettext(TEXT_DOMAIN,
3bb79bece53191f2cf27aa61a72ea1784a7ce700eschrock "iscsitgtd failed request to unshare"));
06eeb2ad640ce72d394ac521094bed7681044408ek case EZFS_SHAREISCSIFAILED:
06eeb2ad640ce72d394ac521094bed7681044408ek return (dgettext(TEXT_DOMAIN,
f3861e1a2ceec23a5b699c24d814b7775a9e0b52ahl "iscsitgtd failed request to share"));
f3861e1a2ceec23a5b699c24d814b7775a9e0b52ahl case EZFS_POOLPROPS:
f3861e1a2ceec23a5b699c24d814b7775a9e0b52ahl return (dgettext(TEXT_DOMAIN, "failed to retrieve "
f3861e1a2ceec23a5b699c24d814b7775a9e0b52ahl "pool properties"));
f3861e1a2ceec23a5b699c24d814b7775a9e0b52ahl case EZFS_POOL_NOTSUP:
f3861e1a2ceec23a5b699c24d814b7775a9e0b52ahl return (dgettext(TEXT_DOMAIN, "operation not supported "
b1b8ab34de515a5e83206da22c3d7e563241b021lling "on this type of pool"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling case EZFS_POOL_INVALARG:
b1b8ab34de515a5e83206da22c3d7e563241b021lling return (dgettext(TEXT_DOMAIN, "invalid argument for "
b1b8ab34de515a5e83206da22c3d7e563241b021lling "this pool operation"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling case EZFS_NAMETOOLONG:
b1b8ab34de515a5e83206da22c3d7e563241b021lling return (dgettext(TEXT_DOMAIN, "dataset name is too long"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling case EZFS_OPENFAILED:
b1b8ab34de515a5e83206da22c3d7e563241b021lling return (dgettext(TEXT_DOMAIN, "open failed"));
b1b8ab34de515a5e83206da22c3d7e563241b021lling case EZFS_NOCAP:
b7661ccca92e6bf5160f4d5d2601efaeaa1f5161mmusante return (dgettext(TEXT_DOMAIN,
b7661ccca92e6bf5160f4d5d2601efaeaa1f5161mmusante "disk capacity information could not be retrieved"));
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor case EZFS_LABELFAILED:
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor return (dgettext(TEXT_DOMAIN, "write of label failed"));
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor case EZFS_UNKNOWN:
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor return (dgettext(TEXT_DOMAIN, "unknown error"));
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor default:
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor assert(hdl->libzfs_error == 0);
8488aeb5df27784d479c16cde06a9e25cd9a1152taylor return (dgettext(TEXT_DOMAIN, "no error"));
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks }
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks}
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks/*PRINTFLIKE2*/
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarksvoid
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarkszfs_error_aux(libzfs_handle_t *hdl, const char *fmt, ...)
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks{
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks va_list ap;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks va_start(ap, fmt);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks (void) vsnprintf(hdl->libzfs_desc, sizeof (hdl->libzfs_desc),
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock fmt, ap);
2f8aaab38e6371ad39ed90a1211ba8921acbb4d5eschrock hdl->libzfs_desc_active = 1;
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan
fa94a07fd0519b8abfd871ad8fe60e6bebe1e2bbbrendan va_end(ap);
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw}
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gw
e7cbe64f7a72dae5cb44f100db60ca88f3313c65gwstatic void
15e6edf145a9c2bb0e0272cf8debe823bb97529bgwzfs_verror(libzfs_handle_t *hdl, int error, const char *fmt, va_list ap)
15e6edf145a9c2bb0e0272cf8debe823bb97529bgw{
15e6edf145a9c2bb0e0272cf8debe823bb97529bgw (void) vsnprintf(hdl->libzfs_action, sizeof (hdl->libzfs_action),
89a89ebfd7c3b4056afe2c03e959e22824df777dlling fmt, ap);
89a89ebfd7c3b4056afe2c03e959e22824df777dlling hdl->libzfs_error = error;
89a89ebfd7c3b4056afe2c03e959e22824df777dlling
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson if (hdl->libzfs_desc_active)
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson hdl->libzfs_desc_active = 0;
e6ca193ded880d478cc39e34ef82d4be36e4445dGeorge Wilson else
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby hdl->libzfs_desc[0] = '\0';
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby if (hdl->libzfs_printerr) {
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby if (error == EZFS_UNKNOWN) {
842727c2f41f01b380de4f5e787d905702870f23Chris Kirby (void) fprintf(stderr, dgettext(TEXT_DOMAIN, "internal "
ca45db4129beff691dc46576c328149443788af2Chris Kirby "error: %s\n"), libzfs_error_description(hdl));
ca45db4129beff691dc46576c328149443788af2Chris Kirby abort();
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, "%s: %s\n", hdl->libzfs_action,
c08432ebe688ed6410b302771a9afd8e23e2a7cceschrock libzfs_error_description(hdl));
c08432ebe688ed6410b302771a9afd8e23e2a7cceschrock if (error == EZFS_NOMEM)
99653d4ee642c6528e88224f12409a5f23060994eschrock exit(1);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
99653d4ee642c6528e88224f12409a5f23060994eschrockzfs_error(libzfs_handle_t *hdl, int error, const char *msg)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (zfs_error_fmt(hdl, error, "%s", msg));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*PRINTFLIKE3*/
99653d4ee642c6528e88224f12409a5f23060994eschrockint
99653d4ee642c6528e88224f12409a5f23060994eschrockzfs_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock va_list ap;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock va_start(ap, fmt);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_verror(hdl, error, fmt, ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock va_end(ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrockstatic int
99653d4ee642c6528e88224f12409a5f23060994eschrockzfs_common_error(libzfs_handle_t *hdl, int error, const char *fmt,
99653d4ee642c6528e88224f12409a5f23060994eschrock va_list ap)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock switch (error) {
99653d4ee642c6528e88224f12409a5f23060994eschrock case EPERM:
99653d4ee642c6528e88224f12409a5f23060994eschrock case EACCES:
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_verror(hdl, EZFS_PERM, fmt, ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock case EIO:
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_verror(hdl, EZFS_IO, fmt, ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
b1b8ab34de515a5e83206da22c3d7e563241b021lling
99653d4ee642c6528e88224f12409a5f23060994eschrock case EINTR:
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_verror(hdl, EZFS_INTR, fmt, ap);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (-1);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
ece3d9b3bacef51a5f34d993935eedbb7bb87059lling return (0);
ece3d9b3bacef51a5f34d993935eedbb7bb87059lling}
ece3d9b3bacef51a5f34d993935eedbb7bb87059lling
ece3d9b3bacef51a5f34d993935eedbb7bb87059llingint
ece3d9b3bacef51a5f34d993935eedbb7bb87059llingzfs_standard_error(libzfs_handle_t *hdl, int error, const char *msg)
ece3d9b3bacef51a5f34d993935eedbb7bb87059lling{
99653d4ee642c6528e88224f12409a5f23060994eschrock return (zfs_standard_error_fmt(hdl, error, "%s", msg));
99653d4ee642c6528e88224f12409a5f23060994eschrock}
ece3d9b3bacef51a5f34d993935eedbb7bb87059lling
99653d4ee642c6528e88224f12409a5f23060994eschrock/*PRINTFLIKE3*/
99653d4ee642c6528e88224f12409a5f23060994eschrockint
99653d4ee642c6528e88224f12409a5f23060994eschrockzfs_standard_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock va_list ap;
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens va_start(ap, fmt);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock if (zfs_common_error(hdl, error, fmt, ap) != 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock va_end(ap);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (-1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock switch (error) {
99653d4ee642c6528e88224f12409a5f23060994eschrock case ENXIO:
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_verror(hdl, EZFS_IO, fmt, ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock case ENOENT:
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
99653d4ee642c6528e88224f12409a5f23060994eschrock "dataset does not exist"));
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks zfs_verror(hdl, EZFS_NOENT, fmt, ap);
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks break;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks case ENOSPC:
99653d4ee642c6528e88224f12409a5f23060994eschrock case EDQUOT:
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_verror(hdl, EZFS_NOSPC, fmt, ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock case EEXIST:
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
99653d4ee642c6528e88224f12409a5f23060994eschrock "dataset already exists"));
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_verror(hdl, EZFS_EXISTS, fmt, ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock case EBUSY:
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
ece3d9b3bacef51a5f34d993935eedbb7bb87059lling "dataset is busy"));
ece3d9b3bacef51a5f34d993935eedbb7bb87059lling zfs_verror(hdl, EZFS_BUSY, fmt, ap);
ece3d9b3bacef51a5f34d993935eedbb7bb87059lling break;
ece3d9b3bacef51a5f34d993935eedbb7bb87059lling
ece3d9b3bacef51a5f34d993935eedbb7bb87059lling case ENAMETOOLONG:
ece3d9b3bacef51a5f34d993935eedbb7bb87059lling zfs_verror(hdl, EZFS_NAMETOOLONG, fmt, ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock
ece3d9b3bacef51a5f34d993935eedbb7bb87059lling default:
fa9e4066f08beec538e775443c5be79dd423fcabahrens zfs_error_aux(hdl, strerror(errno));
fa9e4066f08beec538e775443c5be79dd423fcabahrens zfs_verror(hdl, EZFS_UNKNOWN, fmt, ap);
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock va_end(ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensint
99653d4ee642c6528e88224f12409a5f23060994eschrockzpool_standard_error(libzfs_handle_t *hdl, int error, const char *msg)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
97d9e3a676d96208790c885c4766194423e84b24ck return (zpool_standard_error_fmt(hdl, error, "%s", msg));
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock/*PRINTFLIKE3*/
99653d4ee642c6528e88224f12409a5f23060994eschrockint
99653d4ee642c6528e88224f12409a5f23060994eschrockzpool_standard_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock va_list ap;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock va_start(ap, fmt);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if (zfs_common_error(hdl, error, fmt, ap) != 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock va_end(ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock switch (error) {
99653d4ee642c6528e88224f12409a5f23060994eschrock case ENODEV:
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_verror(hdl, EZFS_NODEVICE, fmt, ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock case ENOENT:
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_error_aux(hdl,
99653d4ee642c6528e88224f12409a5f23060994eschrock dgettext(TEXT_DOMAIN, "no such pool or dataset"));
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_verror(hdl, EZFS_NOENT, fmt, ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks case EEXIST:
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks "pool already exists"));
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks zfs_verror(hdl, EZFS_EXISTS, fmt, ap);
b7661ccca92e6bf5160f4d5d2601efaeaa1f5161mmusante break;
b7661ccca92e6bf5160f4d5d2601efaeaa1f5161mmusante
b7661ccca92e6bf5160f4d5d2601efaeaa1f5161mmusante case EBUSY:
40ff3960ec49d8bb707c8b7f0030f2ac0c014033ck zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "pool is busy"));
40ff3960ec49d8bb707c8b7f0030f2ac0c014033ck zfs_verror(hdl, EZFS_EXISTS, fmt, ap);
40ff3960ec49d8bb707c8b7f0030f2ac0c014033ck break;
54d692b75b7a6f90ce7787309da5451f7458e66aGeorge Wilson
54d692b75b7a6f90ce7787309da5451f7458e66aGeorge Wilson case ENXIO:
54d692b75b7a6f90ce7787309da5451f7458e66aGeorge Wilson zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
54d692b75b7a6f90ce7787309da5451f7458e66aGeorge Wilson "one or more devices is currently unavailable"));
54d692b75b7a6f90ce7787309da5451f7458e66aGeorge Wilson zfs_verror(hdl, EZFS_BADDEV, fmt, ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock case ENAMETOOLONG:
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_verror(hdl, EZFS_DEVOVERFLOW, fmt, ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock case ENOTSUP:
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_verror(hdl, EZFS_POOL_NOTSUP, fmt, ap);
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
ece3d9b3bacef51a5f34d993935eedbb7bb87059lling case EINVAL:
ece3d9b3bacef51a5f34d993935eedbb7bb87059lling zfs_verror(hdl, EZFS_POOL_INVALARG, fmt, ap);
ece3d9b3bacef51a5f34d993935eedbb7bb87059lling break;
ece3d9b3bacef51a5f34d993935eedbb7bb87059lling
ece3d9b3bacef51a5f34d993935eedbb7bb87059lling default:
ece3d9b3bacef51a5f34d993935eedbb7bb87059lling zfs_error_aux(hdl, strerror(error));
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_verror(hdl, EZFS_UNKNOWN, fmt, ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
ece3d9b3bacef51a5f34d993935eedbb7bb87059lling
fa9e4066f08beec538e775443c5be79dd423fcabahrens va_end(ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock/*
99653d4ee642c6528e88224f12409a5f23060994eschrock * Display an out of memory error message and abort the current program.
99653d4ee642c6528e88224f12409a5f23060994eschrock */
99653d4ee642c6528e88224f12409a5f23060994eschrockint
99653d4ee642c6528e88224f12409a5f23060994eschrockno_memory(libzfs_handle_t *hdl)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock return (zfs_error(hdl, EZFS_NOMEM, "internal error"));
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock/*
99653d4ee642c6528e88224f12409a5f23060994eschrock * A safe form of malloc() which will die if the allocation fails.
99653d4ee642c6528e88224f12409a5f23060994eschrock */
b1b8ab34de515a5e83206da22c3d7e563241b021llingvoid *
b1b8ab34de515a5e83206da22c3d7e563241b021llingzfs_alloc(libzfs_handle_t *hdl, size_t size)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock void *data;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if ((data = calloc(1, size)) == NULL)
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) no_memory(hdl);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock return (data);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock/*
99653d4ee642c6528e88224f12409a5f23060994eschrock * A safe form of realloc(), which also zeroes newly allocated space.
43afaaa8b73f73af765f4fa90f39a0f86cb8a364Eric Schrock */
99653d4ee642c6528e88224f12409a5f23060994eschrockvoid *
99653d4ee642c6528e88224f12409a5f23060994eschrockzfs_realloc(libzfs_handle_t *hdl, void *ptr, size_t oldsize, size_t newsize)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock void *ret;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if ((ret = realloc(ptr, newsize)) == NULL) {
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) no_memory(hdl);
99653d4ee642c6528e88224f12409a5f23060994eschrock free(ptr);
99653d4ee642c6528e88224f12409a5f23060994eschrock return (NULL);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock bzero((char *)ret + oldsize, (newsize - oldsize));
b1b8ab34de515a5e83206da22c3d7e563241b021lling return (ret);
b1b8ab34de515a5e83206da22c3d7e563241b021lling}
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling/*
b1b8ab34de515a5e83206da22c3d7e563241b021lling * A safe form of strdup() which will die if the allocation fails.
b1b8ab34de515a5e83206da22c3d7e563241b021lling */
b1b8ab34de515a5e83206da22c3d7e563241b021llingchar *
b1b8ab34de515a5e83206da22c3d7e563241b021llingzfs_strdup(libzfs_handle_t *hdl, const char *str)
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks{
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks char *ret;
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks if ((ret = strdup(str)) == NULL)
54d692b75b7a6f90ce7787309da5451f7458e66aGeorge Wilson (void) no_memory(hdl);
54d692b75b7a6f90ce7787309da5451f7458e66aGeorge Wilson
54d692b75b7a6f90ce7787309da5451f7458e66aGeorge Wilson return (ret);
54d692b75b7a6f90ce7787309da5451f7458e66aGeorge Wilson}
54d692b75b7a6f90ce7787309da5451f7458e66aGeorge Wilson
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks/*
99653d4ee642c6528e88224f12409a5f23060994eschrock * Convert a number to an appropriately human-readable output.
99653d4ee642c6528e88224f12409a5f23060994eschrock */
99653d4ee642c6528e88224f12409a5f23060994eschrockvoid
99653d4ee642c6528e88224f12409a5f23060994eschrockzfs_nicenum(uint64_t num, char *buf, size_t buflen)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock uint64_t n = num;
99653d4ee642c6528e88224f12409a5f23060994eschrock int index = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char u;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (n >= 1024) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens n /= 1024;
fa9e4066f08beec538e775443c5be79dd423fcabahrens index++;
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens u = " KMGTPE"[index];
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (index == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) snprintf(buf, buflen, "%llu", n);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else if ((num & ((1ULL << 10 * index) - 1)) == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If this is an even multiple of the base, always display
fa9e4066f08beec538e775443c5be79dd423fcabahrens * without any decimal precision.
99653d4ee642c6528e88224f12409a5f23060994eschrock */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) snprintf(buf, buflen, "%llu%c", n, u);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * We want to choose a precision that reflects the best choice
99653d4ee642c6528e88224f12409a5f23060994eschrock * for fitting in 5 characters. This can get rather tricky when
fa9e4066f08beec538e775443c5be79dd423fcabahrens * we have numbers that are very close to an order of magnitude.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * For example, when displaying 10239 (which is really 9.999K),
fa9e4066f08beec538e775443c5be79dd423fcabahrens * we want only a single place of precision for 10.0K. We could
fa9e4066f08beec538e775443c5be79dd423fcabahrens * develop some complex heuristics for this, but it's much
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * easier just to try each combination in turn.
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock */
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock int i;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock for (i = 2; i >= 0; i--) {
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock (void) snprintf(buf, buflen, "%.*f%c", i,
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock (double)num / (1ULL << 10 * index), u);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock if (strlen(buf) <= 5)
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock break;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock }
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock }
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock}
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrockvoid
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrocklibzfs_print_on_error(libzfs_handle_t *hdl, boolean_t printerr)
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock{
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock hdl->libzfs_printerr = printerr;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenslibzfs_handle_t *
fa9e4066f08beec538e775443c5be79dd423fcabahrenslibzfs_init(void)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
99653d4ee642c6528e88224f12409a5f23060994eschrock libzfs_handle_t *hdl;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((hdl = calloc(sizeof (libzfs_handle_t), 1)) == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
99653d4ee642c6528e88224f12409a5f23060994eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((hdl->libzfs_fd = open(ZFS_DEV, O_RDWR)) < 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(hdl);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((hdl->libzfs_mnttab = fopen(MNTTAB, "r")) == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) close(hdl->libzfs_fd);
fa9e4066f08beec538e775443c5be79dd423fcabahrens free(hdl);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (NULL);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens hdl->libzfs_sharetab = fopen("/etc/dfs/sharetab", "r");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (hdl);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
5c7098917783942b65876f681a21342761227dadeschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrenslibzfs_fini(libzfs_handle_t *hdl)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) close(hdl->libzfs_fd);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (hdl->libzfs_mnttab)
5c7098917783942b65876f681a21342761227dadeschrock (void) fclose(hdl->libzfs_mnttab);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (hdl->libzfs_sharetab)
5c7098917783942b65876f681a21342761227dadeschrock (void) fclose(hdl->libzfs_sharetab);
5c7098917783942b65876f681a21342761227dadeschrock zfs_uninit_libshare(hdl);
5c7098917783942b65876f681a21342761227dadeschrock namespace_clear(hdl);
5c7098917783942b65876f681a21342761227dadeschrock free(hdl);
5c7098917783942b65876f681a21342761227dadeschrock}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
5c7098917783942b65876f681a21342761227dadeschrocklibzfs_handle_t *
5c7098917783942b65876f681a21342761227dadeschrockzpool_get_handle(zpool_handle_t *zhp)
5c7098917783942b65876f681a21342761227dadeschrock{
5c7098917783942b65876f681a21342761227dadeschrock return (zhp->zpool_hdl);
5c7098917783942b65876f681a21342761227dadeschrock}
5c7098917783942b65876f681a21342761227dadeschrock
5c7098917783942b65876f681a21342761227dadeschrocklibzfs_handle_t *
5c7098917783942b65876f681a21342761227dadeschrockzfs_get_handle(zfs_handle_t *zhp)
5c7098917783942b65876f681a21342761227dadeschrock{
5c7098917783942b65876f681a21342761227dadeschrock return (zhp->zfs_hdl);
5c7098917783942b65876f681a21342761227dadeschrock}
5c7098917783942b65876f681a21342761227dadeschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock/*
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * Given a name, determine whether or not it's a valid path
5c7098917783942b65876f681a21342761227dadeschrock * (starts with '/' or "./"). If so, walk the mnttab trying
5c7098917783942b65876f681a21342761227dadeschrock * to match the device number. If not, treat the path as an
5c7098917783942b65876f681a21342761227dadeschrock * fs/vol/snap name.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
99653d4ee642c6528e88224f12409a5f23060994eschrockzfs_handle_t *
99653d4ee642c6528e88224f12409a5f23060994eschrockzfs_path_to_zhandle(libzfs_handle_t *hdl, char *path, zfs_type_t argtype)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock struct stat64 statbuf;
99653d4ee642c6528e88224f12409a5f23060994eschrock struct extmnttab entry;
99653d4ee642c6528e88224f12409a5f23060994eschrock int ret;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if (path[0] != '/' && strncmp(path, "./", strlen("./")) != 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock /*
99653d4ee642c6528e88224f12409a5f23060994eschrock * It's not a valid path, assume it's a name of type 'argtype'.
99653d4ee642c6528e88224f12409a5f23060994eschrock */
99653d4ee642c6528e88224f12409a5f23060994eschrock return (zfs_open(hdl, path, argtype));
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if (stat64(path, &statbuf) != 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, "%s: %s\n", path, strerror(errno));
c08432ebe688ed6410b302771a9afd8e23e2a7cceschrock return (NULL);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock rewind(hdl->libzfs_mnttab);
99653d4ee642c6528e88224f12409a5f23060994eschrock while ((ret = getextmntent(hdl->libzfs_mnttab, &entry, 0)) == 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock if (makedevice(entry.mnt_major, entry.mnt_minor) ==
99653d4ee642c6528e88224f12409a5f23060994eschrock statbuf.st_dev) {
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock if (ret != 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock return (NULL);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens
990b4856d0eaada6f8140335733a1b1771ed2746lling if (strcmp(entry.mnt_fstype, MNTTYPE_ZFS) != 0) {
b2634b9c57bbcfa01bb5dec2e196aec32957925fEric Taylor (void) fprintf(stderr, gettext("'%s': not a ZFS filesystem\n"),
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens path);
99653d4ee642c6528e88224f12409a5f23060994eschrock return (NULL);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock return (zfs_open(hdl, entry.mnt_special, ZFS_TYPE_FILESYSTEM));
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock/*
99653d4ee642c6528e88224f12409a5f23060994eschrock * Initialize the zc_nvlist_dst member to prepare for receiving an nvlist from
99653d4ee642c6528e88224f12409a5f23060994eschrock * an ioctl().
99653d4ee642c6528e88224f12409a5f23060994eschrock */
99653d4ee642c6528e88224f12409a5f23060994eschrockint
6733190958bbcc0bd6d1d601e7ae0a6994dafb45dougmzcmd_alloc_dst_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, size_t len)
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks{
ecd6cf800b63704be73fb264c3f5b6e0dafc068dmarks if (len == 0)
29ab75c9a733dad2978c4860efd954b5625e3467rm len = 2048;
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock zc->zc_nvlist_dst_size = len;
99653d4ee642c6528e88224f12409a5f23060994eschrock if ((zc->zc_nvlist_dst = (uint64_t)(uintptr_t)
b2634b9c57bbcfa01bb5dec2e196aec32957925fEric Taylor zfs_alloc(hdl, zc->zc_nvlist_dst_size)) == NULL)
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock return (0);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock/*
99653d4ee642c6528e88224f12409a5f23060994eschrock * Called when an ioctl() which returns an nvlist fails with ENOMEM. This will
99653d4ee642c6528e88224f12409a5f23060994eschrock * expand the nvlist to the size specified in 'zc_nvlist_dst_size', which was
99653d4ee642c6528e88224f12409a5f23060994eschrock * filled in by the kernel to indicate the actual required size.
99653d4ee642c6528e88224f12409a5f23060994eschrock */
99653d4ee642c6528e88224f12409a5f23060994eschrockint
99653d4ee642c6528e88224f12409a5f23060994eschrockzcmd_expand_dst_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock free((void *)(uintptr_t)zc->zc_nvlist_dst);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock if ((zc->zc_nvlist_dst = (uint64_t)(uintptr_t)
d5b5bb256c576fe5ef26e0795bd40abe77f93246Rich Morris zfs_alloc(hdl, zc->zc_nvlist_dst_size))
d5b5bb256c576fe5ef26e0795bd40abe77f93246Rich Morris == NULL)
d5b5bb256c576fe5ef26e0795bd40abe77f93246Rich Morris return (-1);
d5b5bb256c576fe5ef26e0795bd40abe77f93246Rich Morris
d5b5bb256c576fe5ef26e0795bd40abe77f93246Rich Morris return (0);
d5b5bb256c576fe5ef26e0795bd40abe77f93246Rich Morris}
5aba80db367b061758a29154d304977d00d8e4f4ck
5aba80db367b061758a29154d304977d00d8e4f4ck/*
5aba80db367b061758a29154d304977d00d8e4f4ck * Called to free the src and dst nvlists stored in the command structure.
5aba80db367b061758a29154d304977d00d8e4f4ck */
5aba80db367b061758a29154d304977d00d8e4f4ckvoid
5aba80db367b061758a29154d304977d00d8e4f4ckzcmd_free_nvlists(zfs_cmd_t *zc)
5aba80db367b061758a29154d304977d00d8e4f4ck{
5aba80db367b061758a29154d304977d00d8e4f4ck free((void *)(uintptr_t)zc->zc_nvlist_src);
5aba80db367b061758a29154d304977d00d8e4f4ck free((void *)(uintptr_t)zc->zc_nvlist_dst);
5aba80db367b061758a29154d304977d00d8e4f4ck}
5aba80db367b061758a29154d304977d00d8e4f4ck
5aba80db367b061758a29154d304977d00d8e4f4ckint
5aba80db367b061758a29154d304977d00d8e4f4ckzcmd_write_src_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, nvlist_t *nvl,
5aba80db367b061758a29154d304977d00d8e4f4ck size_t *size)
5aba80db367b061758a29154d304977d00d8e4f4ck{
5aba80db367b061758a29154d304977d00d8e4f4ck char *packed;
5aba80db367b061758a29154d304977d00d8e4f4ck size_t len;
5aba80db367b061758a29154d304977d00d8e4f4ck
5aba80db367b061758a29154d304977d00d8e4f4ck verify(nvlist_size(nvl, &len, NV_ENCODE_NATIVE) == 0);
5aba80db367b061758a29154d304977d00d8e4f4ck
5aba80db367b061758a29154d304977d00d8e4f4ck if ((packed = zfs_alloc(hdl, len)) == NULL)
5aba80db367b061758a29154d304977d00d8e4f4ck return (-1);
5aba80db367b061758a29154d304977d00d8e4f4ck
5aba80db367b061758a29154d304977d00d8e4f4ck verify(nvlist_pack(nvl, &packed, &len, NV_ENCODE_NATIVE, 0) == 0);
5aba80db367b061758a29154d304977d00d8e4f4ck
5aba80db367b061758a29154d304977d00d8e4f4ck zc->zc_nvlist_src = (uint64_t)(uintptr_t)packed;
5aba80db367b061758a29154d304977d00d8e4f4ck zc->zc_nvlist_src_size = len;
5aba80db367b061758a29154d304977d00d8e4f4ck
5aba80db367b061758a29154d304977d00d8e4f4ck if (size)
5aba80db367b061758a29154d304977d00d8e4f4ck *size = len;
5aba80db367b061758a29154d304977d00d8e4f4ck return (0);
5aba80db367b061758a29154d304977d00d8e4f4ck}
5aba80db367b061758a29154d304977d00d8e4f4ck
5aba80db367b061758a29154d304977d00d8e4f4ck/*
5aba80db367b061758a29154d304977d00d8e4f4ck * Unpacks an nvlist from the ZFS ioctl command structure.
5aba80db367b061758a29154d304977d00d8e4f4ck */
5aba80db367b061758a29154d304977d00d8e4f4ckint
5aba80db367b061758a29154d304977d00d8e4f4ckzcmd_read_dst_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, nvlist_t **nvlp)
5aba80db367b061758a29154d304977d00d8e4f4ck{
5aba80db367b061758a29154d304977d00d8e4f4ck if (nvlist_unpack((void *)(uintptr_t)zc->zc_nvlist_dst,
5aba80db367b061758a29154d304977d00d8e4f4ck zc->zc_nvlist_dst_size, nvlp, 0) != 0)
5aba80db367b061758a29154d304977d00d8e4f4ck return (no_memory(hdl));
5aba80db367b061758a29154d304977d00d8e4f4ck
5aba80db367b061758a29154d304977d00d8e4f4ck return (0);
5aba80db367b061758a29154d304977d00d8e4f4ck}
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrockstatic void
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrockzfs_print_prop_headers(libzfs_get_cbdata_t *cbp)
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock{
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock zfs_proplist_t *pl = cbp->cb_proplist;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock int i;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock char *title;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock size_t len;
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock cbp->cb_first = B_FALSE;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock if (cbp->cb_scripted)
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock return;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock /*
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * Start with the length of the column headers.
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock */
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock cbp->cb_colwidths[GET_COL_NAME] = strlen(dgettext(TEXT_DOMAIN, "NAME"));
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock cbp->cb_colwidths[GET_COL_PROPERTY] = strlen(dgettext(TEXT_DOMAIN,
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock "PROPERTY"));
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock cbp->cb_colwidths[GET_COL_VALUE] = strlen(dgettext(TEXT_DOMAIN,
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock "VALUE"));
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock cbp->cb_colwidths[GET_COL_SOURCE] = strlen(dgettext(TEXT_DOMAIN,
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock "SOURCE"));
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock /*
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * Go through and calculate the widths for each column. For the
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * 'source' column, we kludge it up by taking the worst-case scenario of
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * inheriting from the longest name. This is acceptable because in the
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * majority of cases 'SOURCE' is the last column displayed, and we don't
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * use the width anyway. Note that the 'VALUE' column can be oversized,
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * if the name of the property is much longer the any values we find.
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock */
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock for (pl = cbp->cb_proplist; pl != NULL; pl = pl->pl_next) {
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock /*
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * 'PROPERTY' column
a2eea2e101e6a163a537dcc6d4e3c4da2a0ea5b2ahrens */
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock if (pl->pl_prop != ZFS_PROP_INVAL) {
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock len = strlen(zfs_prop_to_name(pl->pl_prop));
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock if (len > cbp->cb_colwidths[GET_COL_PROPERTY])
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock cbp->cb_colwidths[GET_COL_PROPERTY] = len;
990b4856d0eaada6f8140335733a1b1771ed2746lling } else {
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock len = strlen(pl->pl_user_prop);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock if (len > cbp->cb_colwidths[GET_COL_PROPERTY])
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock cbp->cb_colwidths[GET_COL_PROPERTY] = len;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock }
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling /*
990b4856d0eaada6f8140335733a1b1771ed2746lling * 'VALUE' column
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock */
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock if ((pl->pl_prop != ZFS_PROP_NAME || !pl->pl_all) &&
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock pl->pl_width > cbp->cb_colwidths[GET_COL_VALUE])
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock cbp->cb_colwidths[GET_COL_VALUE] = pl->pl_width;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock /*
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * 'NAME' and 'SOURCE' columns
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock */
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock if (pl->pl_prop == ZFS_PROP_NAME &&
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock pl->pl_width > cbp->cb_colwidths[GET_COL_NAME]) {
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock cbp->cb_colwidths[GET_COL_NAME] = pl->pl_width;
990b4856d0eaada6f8140335733a1b1771ed2746lling cbp->cb_colwidths[GET_COL_SOURCE] = pl->pl_width +
990b4856d0eaada6f8140335733a1b1771ed2746lling strlen(dgettext(TEXT_DOMAIN, "inherited from"));
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock }
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock }
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock /*
990b4856d0eaada6f8140335733a1b1771ed2746lling * Now go through and print the headers.
990b4856d0eaada6f8140335733a1b1771ed2746lling */
990b4856d0eaada6f8140335733a1b1771ed2746lling for (i = 0; i < 4; i++) {
990b4856d0eaada6f8140335733a1b1771ed2746lling switch (cbp->cb_columns[i]) {
990b4856d0eaada6f8140335733a1b1771ed2746lling case GET_COL_NAME:
990b4856d0eaada6f8140335733a1b1771ed2746lling title = dgettext(TEXT_DOMAIN, "NAME");
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
990b4856d0eaada6f8140335733a1b1771ed2746lling case GET_COL_PROPERTY:
990b4856d0eaada6f8140335733a1b1771ed2746lling title = dgettext(TEXT_DOMAIN, "PROPERTY");
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
990b4856d0eaada6f8140335733a1b1771ed2746lling case GET_COL_VALUE:
990b4856d0eaada6f8140335733a1b1771ed2746lling title = dgettext(TEXT_DOMAIN, "VALUE");
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
990b4856d0eaada6f8140335733a1b1771ed2746lling case GET_COL_SOURCE:
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock title = dgettext(TEXT_DOMAIN, "SOURCE");
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock break;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock default:
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock title = NULL;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock }
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock if (title != NULL) {
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock if (i == 3 || cbp->cb_columns[i + 1] == 0)
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock (void) printf("%s", title);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock else
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock (void) printf("%-*s ",
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock cbp->cb_colwidths[cbp->cb_columns[i]],
b1b8ab34de515a5e83206da22c3d7e563241b021lling title);
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) printf("\n");
990b4856d0eaada6f8140335733a1b1771ed2746lling}
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling/*
990b4856d0eaada6f8140335733a1b1771ed2746lling * Display a single line of output, according to the settings in the callback
990b4856d0eaada6f8140335733a1b1771ed2746lling * structure.
990b4856d0eaada6f8140335733a1b1771ed2746lling */
990b4856d0eaada6f8140335733a1b1771ed2746llingvoid
990b4856d0eaada6f8140335733a1b1771ed2746llinglibzfs_print_one_property(const char *name, libzfs_get_cbdata_t *cbp,
990b4856d0eaada6f8140335733a1b1771ed2746lling const char *propname, const char *value, zfs_source_t sourcetype,
990b4856d0eaada6f8140335733a1b1771ed2746lling const char *source)
990b4856d0eaada6f8140335733a1b1771ed2746lling{
990b4856d0eaada6f8140335733a1b1771ed2746lling int i;
990b4856d0eaada6f8140335733a1b1771ed2746lling const char *str;
990b4856d0eaada6f8140335733a1b1771ed2746lling char buf[128];
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling /*
990b4856d0eaada6f8140335733a1b1771ed2746lling * Ignore those source types that the user has chosen to ignore.
990b4856d0eaada6f8140335733a1b1771ed2746lling */
990b4856d0eaada6f8140335733a1b1771ed2746lling if ((sourcetype & cbp->cb_sources) == 0)
b1b8ab34de515a5e83206da22c3d7e563241b021lling return;
990b4856d0eaada6f8140335733a1b1771ed2746lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling if (cbp->cb_first)
990b4856d0eaada6f8140335733a1b1771ed2746lling zfs_print_prop_headers(cbp);
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling for (i = 0; i < 4; i++) {
b1b8ab34de515a5e83206da22c3d7e563241b021lling switch (cbp->cb_columns[i]) {
b1b8ab34de515a5e83206da22c3d7e563241b021lling case GET_COL_NAME:
b1b8ab34de515a5e83206da22c3d7e563241b021lling str = name;
b1b8ab34de515a5e83206da22c3d7e563241b021lling break;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling case GET_COL_PROPERTY:
b1b8ab34de515a5e83206da22c3d7e563241b021lling str = propname;
b1b8ab34de515a5e83206da22c3d7e563241b021lling break;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling case GET_COL_VALUE:
b1b8ab34de515a5e83206da22c3d7e563241b021lling str = value;
b1b8ab34de515a5e83206da22c3d7e563241b021lling break;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling case GET_COL_SOURCE:
b1b8ab34de515a5e83206da22c3d7e563241b021lling switch (sourcetype) {
b1b8ab34de515a5e83206da22c3d7e563241b021lling case ZFS_SRC_NONE:
b1b8ab34de515a5e83206da22c3d7e563241b021lling str = "-";
deb8317b8f5925e3f6dd7cb6ed0cdd035f546a5aMark J Musante break;
deb8317b8f5925e3f6dd7cb6ed0cdd035f546a5aMark J Musante
deb8317b8f5925e3f6dd7cb6ed0cdd035f546a5aMark J Musante case ZFS_SRC_DEFAULT:
deb8317b8f5925e3f6dd7cb6ed0cdd035f546a5aMark J Musante str = "default";
b1b8ab34de515a5e83206da22c3d7e563241b021lling break;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling case ZFS_SRC_LOCAL:
b1b8ab34de515a5e83206da22c3d7e563241b021lling str = "local";
b1b8ab34de515a5e83206da22c3d7e563241b021lling break;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling case ZFS_SRC_TEMPORARY:
b1b8ab34de515a5e83206da22c3d7e563241b021lling str = "temporary";
b1b8ab34de515a5e83206da22c3d7e563241b021lling break;
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling case ZFS_SRC_INHERITED:
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) snprintf(buf, sizeof (buf),
990b4856d0eaada6f8140335733a1b1771ed2746lling "inherited from %s", source);
990b4856d0eaada6f8140335733a1b1771ed2746lling str = buf;
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
990b4856d0eaada6f8140335733a1b1771ed2746lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling default:
b1b8ab34de515a5e83206da22c3d7e563241b021lling continue;
b1b8ab34de515a5e83206da22c3d7e563241b021lling }
b1b8ab34de515a5e83206da22c3d7e563241b021lling
b1b8ab34de515a5e83206da22c3d7e563241b021lling if (cbp->cb_columns[i + 1] == 0)
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) printf("%s", str);
b1b8ab34de515a5e83206da22c3d7e563241b021lling else if (cbp->cb_scripted)
b1b8ab34de515a5e83206da22c3d7e563241b021lling (void) printf("%s\t", str);
b1b8ab34de515a5e83206da22c3d7e563241b021lling else
deb8317b8f5925e3f6dd7cb6ed0cdd035f546a5aMark J Musante (void) printf("%-*s ",
deb8317b8f5925e3f6dd7cb6ed0cdd035f546a5aMark J Musante cbp->cb_colwidths[cbp->cb_columns[i]],
deb8317b8f5925e3f6dd7cb6ed0cdd035f546a5aMark J Musante str);
deb8317b8f5925e3f6dd7cb6ed0cdd035f546a5aMark J Musante
deb8317b8f5925e3f6dd7cb6ed0cdd035f546a5aMark J Musante }
b1b8ab34de515a5e83206da22c3d7e563241b021lling
deb8317b8f5925e3f6dd7cb6ed0cdd035f546a5aMark J Musante (void) printf("\n");
b1b8ab34de515a5e83206da22c3d7e563241b021lling}
b1b8ab34de515a5e83206da22c3d7e563241b021lling