libzfs_util.c revision 06eeb2ad640ce72d394ac521094bed7681044408
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/*
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * Copyright 2006 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>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <strings.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <unistd.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/mnttab.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <libzfs.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "libzfs_impl.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrockint
99653d4ee642c6528e88224f12409a5f23060994eschrocklibzfs_errno(libzfs_handle_t *hdl)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock return (hdl->libzfs_error);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrockconst char *
99653d4ee642c6528e88224f12409a5f23060994eschrocklibzfs_error_action(libzfs_handle_t *hdl)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock return (hdl->libzfs_action);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrockconst 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:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "umount failed"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_UNSHAREFAILED:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "unshare(1M) failed"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_SHAREFAILED:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "share(1M) failed"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_DEVLINKS:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "failed to create /dev links"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_PERM:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "permission denied"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_NOSPC:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "out of space"));
99653d4ee642c6528e88224f12409a5f23060994eschrock 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"));
3bb79bece53191f2cf27aa61a72ea1784a7ce700eschrock case EZFS_RECURSIVE:
3bb79bece53191f2cf27aa61a72ea1784a7ce700eschrock return (dgettext(TEXT_DOMAIN, "recursive dataset dependency"));
06eeb2ad640ce72d394ac521094bed7681044408ek case EZFS_NOHISTORY:
06eeb2ad640ce72d394ac521094bed7681044408ek return (dgettext(TEXT_DOMAIN, "no history available"));
99653d4ee642c6528e88224f12409a5f23060994eschrock case EZFS_UNKNOWN:
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "unknown error"));
99653d4ee642c6528e88224f12409a5f23060994eschrock default:
c08432ebe688ed6410b302771a9afd8e23e2a7cceschrock assert(hdl->libzfs_error == 0);
c08432ebe688ed6410b302771a9afd8e23e2a7cceschrock return (dgettext(TEXT_DOMAIN, "no error"));
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock/*PRINTFLIKE2*/
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
99653d4ee642c6528e88224f12409a5f23060994eschrockzfs_error_aux(libzfs_handle_t *hdl, const char *fmt, ...)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens va_list ap;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens va_start(ap, fmt);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) vsnprintf(hdl->libzfs_desc, sizeof (hdl->libzfs_desc),
99653d4ee642c6528e88224f12409a5f23060994eschrock fmt, ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock hdl->libzfs_desc_active = 1;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock va_end(ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrockstatic void
99653d4ee642c6528e88224f12409a5f23060994eschrockzfs_verror(libzfs_handle_t *hdl, int error, const char *fmt, va_list ap)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) vsnprintf(hdl->libzfs_action, sizeof (hdl->libzfs_action),
99653d4ee642c6528e88224f12409a5f23060994eschrock fmt, ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock hdl->libzfs_error = error;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if (hdl->libzfs_desc_active)
99653d4ee642c6528e88224f12409a5f23060994eschrock hdl->libzfs_desc_active = 0;
99653d4ee642c6528e88224f12409a5f23060994eschrock else
99653d4ee642c6528e88224f12409a5f23060994eschrock hdl->libzfs_desc[0] = '\0';
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if (hdl->libzfs_printerr) {
99653d4ee642c6528e88224f12409a5f23060994eschrock if (error == EZFS_UNKNOWN) {
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, dgettext(TEXT_DOMAIN, "internal "
99653d4ee642c6528e88224f12409a5f23060994eschrock "error: %s\n"), libzfs_error_description(hdl));
99653d4ee642c6528e88224f12409a5f23060994eschrock abort();
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, "%s: %s\n", hdl->libzfs_action,
99653d4ee642c6528e88224f12409a5f23060994eschrock libzfs_error_description(hdl));
99653d4ee642c6528e88224f12409a5f23060994eschrock if (error == EZFS_NOMEM)
99653d4ee642c6528e88224f12409a5f23060994eschrock exit(1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock/*PRINTFLIKE3*/
99653d4ee642c6528e88224f12409a5f23060994eschrockint
99653d4ee642c6528e88224f12409a5f23060994eschrockzfs_error(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);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens va_end(ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
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);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock case EINTR:
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_verror(hdl, EZFS_INTR, fmt, ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock return (0);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock/*PRINTFLIKE3*/
99653d4ee642c6528e88224f12409a5f23060994eschrockint
99653d4ee642c6528e88224f12409a5f23060994eschrockzfs_standard_error(libzfs_handle_t *hdl, int error, const char *fmt, ...)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens va_list ap;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens va_start(ap, fmt);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock if (zfs_common_error(hdl, error, fmt, ap) != 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock va_end(ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
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"));
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_verror(hdl, EZFS_NOENT, fmt, ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock 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,
99653d4ee642c6528e88224f12409a5f23060994eschrock "dataset is busy"));
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_verror(hdl, EZFS_BUSY, fmt, ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock default:
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_error_aux(hdl, strerror(errno));
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_verror(hdl, EZFS_UNKNOWN, fmt, ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock va_end(ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
99653d4ee642c6528e88224f12409a5f23060994eschrock/*PRINTFLIKE3*/
99653d4ee642c6528e88224f12409a5f23060994eschrockint
99653d4ee642c6528e88224f12409a5f23060994eschrockzpool_standard_error(libzfs_handle_t *hdl, int error, const char *fmt, ...)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
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, dgettext(TEXT_DOMAIN, "no such pool"));
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_verror(hdl, EZFS_NOENT, fmt, ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock case EEXIST:
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
99653d4ee642c6528e88224f12409a5f23060994eschrock "pool already exists"));
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_verror(hdl, EZFS_EXISTS, fmt, ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock case EBUSY:
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "pool is busy"));
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_verror(hdl, EZFS_EXISTS, fmt, ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock case ENXIO:
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
99653d4ee642c6528e88224f12409a5f23060994eschrock "one or more devices is currently unavailable"));
99653d4ee642c6528e88224f12409a5f23060994eschrock 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 default:
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_error_aux(hdl, strerror(error));
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_verror(hdl, EZFS_UNKNOWN, fmt, ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock va_end(ap);
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Display an out of memory error message and abort the current program.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
99653d4ee642c6528e88224f12409a5f23060994eschrockint
99653d4ee642c6528e88224f12409a5f23060994eschrockno_memory(libzfs_handle_t *hdl)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
99653d4ee642c6528e88224f12409a5f23060994eschrock return (zfs_error(hdl, EZFS_NOMEM, "internal error"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * A safe form of malloc() which will die if the allocation fails.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid *
99653d4ee642c6528e88224f12409a5f23060994eschrockzfs_alloc(libzfs_handle_t *hdl, size_t size)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens void *data;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((data = calloc(1, size)) == NULL)
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) no_memory(hdl);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (data);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock/*
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * A safe form of realloc(), which also zeroes newly allocated space.
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock */
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrockvoid *
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrockzfs_realloc(libzfs_handle_t *hdl, void *ptr, size_t oldsize, size_t newsize)
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock{
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock void *ret;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock if ((ret = realloc(ptr, newsize)) == NULL) {
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock (void) no_memory(hdl);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock free(ptr);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock return (NULL);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock }
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock bzero((char *)ret + oldsize, (newsize - oldsize));
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock return (ret);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock}
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * A safe form of strdup() which will die if the allocation fails.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrenschar *
99653d4ee642c6528e88224f12409a5f23060994eschrockzfs_strdup(libzfs_handle_t *hdl, const char *str)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *ret;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((ret = strdup(str)) == NULL)
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) no_memory(hdl);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (ret);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Convert a number to an appropriately human-readable output.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid
fa9e4066f08beec538e775443c5be79dd423fcabahrenszfs_nicenum(uint64_t num, char *buf, size_t buflen)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t n = num;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int index = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char u;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (n >= 1024) {
5c7098917783942b65876f681a21342761227dadeschrock n /= 1024;
fa9e4066f08beec538e775443c5be79dd423fcabahrens index++;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens u = " KMGTPE"[index];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
5c7098917783942b65876f681a21342761227dadeschrock if (index == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) snprintf(buf, buflen, "%llu", n);
5c7098917783942b65876f681a21342761227dadeschrock } else if ((num & ((1ULL << 10 * index) - 1)) == 0) {
5c7098917783942b65876f681a21342761227dadeschrock /*
5c7098917783942b65876f681a21342761227dadeschrock * If this is an even multiple of the base, always display
5c7098917783942b65876f681a21342761227dadeschrock * without any decimal precision.
5c7098917783942b65876f681a21342761227dadeschrock */
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) snprintf(buf, buflen, "%llu%c", n, u);
5c7098917783942b65876f681a21342761227dadeschrock } else {
5c7098917783942b65876f681a21342761227dadeschrock /*
5c7098917783942b65876f681a21342761227dadeschrock * We want to choose a precision that reflects the best choice
5c7098917783942b65876f681a21342761227dadeschrock * for fitting in 5 characters. This can get rather tricky when
5c7098917783942b65876f681a21342761227dadeschrock * we have numbers that are very close to an order of magnitude.
5c7098917783942b65876f681a21342761227dadeschrock * For example, when displaying 10239 (which is really 9.999K),
5c7098917783942b65876f681a21342761227dadeschrock * we want only a single place of precision for 10.0K. We could
5c7098917783942b65876f681a21342761227dadeschrock * develop some complex heuristics for this, but it's much
5c7098917783942b65876f681a21342761227dadeschrock * easier just to try each combination in turn.
5c7098917783942b65876f681a21342761227dadeschrock */
5c7098917783942b65876f681a21342761227dadeschrock int i;
5c7098917783942b65876f681a21342761227dadeschrock for (i = 2; i >= 0; i--) {
5c7098917783942b65876f681a21342761227dadeschrock (void) snprintf(buf, buflen, "%.*f%c", i,
5c7098917783942b65876f681a21342761227dadeschrock (double)num / (1ULL << 10 * index), u);
5c7098917783942b65876f681a21342761227dadeschrock if (strlen(buf) <= 5)
5c7098917783942b65876f681a21342761227dadeschrock break;
5c7098917783942b65876f681a21342761227dadeschrock }
5c7098917783942b65876f681a21342761227dadeschrock }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrockvoid
99653d4ee642c6528e88224f12409a5f23060994eschrocklibzfs_print_on_error(libzfs_handle_t *hdl, boolean_t printerr)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock hdl->libzfs_printerr = printerr;
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrocklibzfs_handle_t *
99653d4ee642c6528e88224f12409a5f23060994eschrocklibzfs_init(void)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock libzfs_handle_t *hdl;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if ((hdl = calloc(sizeof (libzfs_handle_t), 1)) == NULL) {
99653d4ee642c6528e88224f12409a5f23060994eschrock return (NULL);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
c08432ebe688ed6410b302771a9afd8e23e2a7cceschrock if ((hdl->libzfs_fd = open(ZFS_DEV, O_RDWR)) < 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock free(hdl);
99653d4ee642c6528e88224f12409a5f23060994eschrock return (NULL);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if ((hdl->libzfs_mnttab = fopen(MNTTAB, "r")) == NULL) {
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) close(hdl->libzfs_fd);
99653d4ee642c6528e88224f12409a5f23060994eschrock free(hdl);
99653d4ee642c6528e88224f12409a5f23060994eschrock return (NULL);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock hdl->libzfs_sharetab = fopen("/etc/dfs/sharetab", "r");
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock return (hdl);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrockvoid
99653d4ee642c6528e88224f12409a5f23060994eschrocklibzfs_fini(libzfs_handle_t *hdl)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) close(hdl->libzfs_fd);
99653d4ee642c6528e88224f12409a5f23060994eschrock if (hdl->libzfs_mnttab)
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fclose(hdl->libzfs_mnttab);
99653d4ee642c6528e88224f12409a5f23060994eschrock if (hdl->libzfs_sharetab)
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fclose(hdl->libzfs_sharetab);
99653d4ee642c6528e88224f12409a5f23060994eschrock namespace_clear(hdl);
99653d4ee642c6528e88224f12409a5f23060994eschrock free(hdl);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrocklibzfs_handle_t *
99653d4ee642c6528e88224f12409a5f23060994eschrockzpool_get_handle(zpool_handle_t *zhp)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock return (zhp->zpool_hdl);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrocklibzfs_handle_t *
99653d4ee642c6528e88224f12409a5f23060994eschrockzfs_get_handle(zfs_handle_t *zhp)
99653d4ee642c6528e88224f12409a5f23060994eschrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock return (zhp->zfs_hdl);
99653d4ee642c6528e88224f12409a5f23060994eschrock}
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock/*
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * Initialize the zc_nvlist_dst member to prepare for receiving an nvlist from
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * an ioctl().
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock */
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrockint
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrockzcmd_alloc_dst_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, size_t len)
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock{
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock if (len == 0)
a2eea2e101e6a163a537dcc6d4e3c4da2a0ea5b2ahrens len = 2048;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock zc->zc_nvlist_dst_size = len;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock if ((zc->zc_nvlist_dst = (uint64_t)(uintptr_t)
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock zfs_alloc(hdl, zc->zc_nvlist_dst_size)) == NULL)
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock return (-1);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock return (0);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock}
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock/*
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * Called when an ioctl() which returns an nvlist fails with ENOMEM. This will
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * expand the nvlist to the size specified in 'zc_nvlist_dst_size', which was
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * filled in by the kernel to indicate the actual required size.
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock */
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrockint
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrockzcmd_expand_dst_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc)
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock{
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock free((void *)(uintptr_t)zc->zc_nvlist_dst);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock if ((zc->zc_nvlist_dst = (uint64_t)(uintptr_t)
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock zfs_alloc(hdl, zc->zc_nvlist_dst_size))
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock == NULL)
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock return (-1);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock return (0);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock}
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock/*
a2eea2e101e6a163a537dcc6d4e3c4da2a0ea5b2ahrens * Called to free the src and dst nvlists stored in the command structure.
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock */
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrockvoid
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrockzcmd_free_nvlists(zfs_cmd_t *zc)
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock{
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock free((void *)(uintptr_t)zc->zc_nvlist_src);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock free((void *)(uintptr_t)zc->zc_nvlist_dst);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock}
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrockint
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrockzcmd_write_src_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, nvlist_t *nvl,
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock size_t *size)
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock{
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock char *packed;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock size_t len;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock verify(nvlist_size(nvl, &len, NV_ENCODE_NATIVE) == 0);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock if ((packed = zfs_alloc(hdl, len)) == NULL)
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock return (-1);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock verify(nvlist_pack(nvl, &packed, &len, NV_ENCODE_NATIVE, 0) == 0);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock zc->zc_nvlist_src = (uint64_t)(uintptr_t)packed;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock zc->zc_nvlist_src_size = len;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock if (size)
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock *size = len;
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock return (0);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock}
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock/*
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock * Unpacks an nvlist from the ZFS ioctl command structure.
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock */
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrockint
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrockzcmd_read_dst_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, nvlist_t **nvlp)
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock{
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock if (nvlist_unpack((void *)(uintptr_t)zc->zc_nvlist_dst,
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock zc->zc_nvlist_dst_size, nvlp, 0) != 0)
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock return (no_memory(hdl));
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock return (0);
e9dbad6f263d5570ed7ff5443ec5b958af8c24d7eschrock}