libzfs_util.c revision c08432ebe688ed6410b302771a9afd8e23e2a7cc
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fa9e4066f08beec538e775443c5be79dd423fcabahrens * See the License for the specific language governing permissions
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and limitations under the License.
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 * CDDL HEADER END
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Use is subject to license terms.
fa9e4066f08beec538e775443c5be79dd423fcabahrens#pragma ident "%Z%%M% %I% %E% SMI"
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Internal utility routines for the ZFS library.
99653d4ee642c6528e88224f12409a5f23060994eschrockconst char *
99653d4ee642c6528e88224f12409a5f23060994eschrockconst char *
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "invalid property value"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "read only property"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "property doesn't apply to "
99653d4ee642c6528e88224f12409a5f23060994eschrock "datasets of this type"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "property cannot be inherited"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "invalid quota or reservation"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "operation not applicable to "
99653d4ee642c6528e88224f12409a5f23060994eschrock "datasets of this type"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "pool or dataset is busy"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "pool or dataset exists"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "no such pool or dataset"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "invalid backup stream"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "dataset is read only"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "volume size exceeds limit for "
99653d4ee642c6528e88224f12409a5f23060994eschrock "this system"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "unable to restore to "
99653d4ee642c6528e88224f12409a5f23060994eschrock "destination"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "invalid target vdev"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "no such device in pool"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "no valid replicas"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "currently resilvering"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "unsupported version"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "pool is unavailable"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "too many devices in one vdev"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "must be an absolute path"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "operation crosses datasets or "
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "dataset in use by local zone"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "unshare(1M) failed"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "share(1M) failed"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "failed to create /dev links"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "permission denied"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "device is reserved as a hot "
99653d4ee642c6528e88224f12409a5f23060994eschrock return (dgettext(TEXT_DOMAIN, "invalid vdev configuration"));
3bb79bece53191f2cf27aa61a72ea1784a7ce700eschrock return (dgettext(TEXT_DOMAIN, "recursive dataset dependency"));
99653d4ee642c6528e88224f12409a5f23060994eschrock/*PRINTFLIKE2*/
99653d4ee642c6528e88224f12409a5f23060994eschrockzfs_error_aux(libzfs_handle_t *hdl, const char *fmt, ...)
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) vsnprintf(hdl->libzfs_desc, sizeof (hdl->libzfs_desc),
99653d4ee642c6528e88224f12409a5f23060994eschrockzfs_verror(libzfs_handle_t *hdl, int error, const char *fmt, va_list ap)
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) vsnprintf(hdl->libzfs_action, sizeof (hdl->libzfs_action),
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, dgettext(TEXT_DOMAIN, "internal "
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) fprintf(stderr, "%s: %s\n", hdl->libzfs_action,
99653d4ee642c6528e88224f12409a5f23060994eschrock/*PRINTFLIKE3*/
99653d4ee642c6528e88224f12409a5f23060994eschrockzfs_error(libzfs_handle_t *hdl, int error, const char *fmt, ...)
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
99653d4ee642c6528e88224f12409a5f23060994eschrockzfs_common_error(libzfs_handle_t *hdl, int error, const char *fmt,
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
99653d4ee642c6528e88224f12409a5f23060994eschrock return (0);
99653d4ee642c6528e88224f12409a5f23060994eschrock/*PRINTFLIKE3*/
99653d4ee642c6528e88224f12409a5f23060994eschrockzfs_standard_error(libzfs_handle_t *hdl, int error, const char *fmt, ...)
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
99653d4ee642c6528e88224f12409a5f23060994eschrock "dataset does not exist"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
99653d4ee642c6528e88224f12409a5f23060994eschrock "dataset already exists"));
99653d4ee642c6528e88224f12409a5f23060994eschrock "dataset is busy"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
99653d4ee642c6528e88224f12409a5f23060994eschrock/*PRINTFLIKE3*/
99653d4ee642c6528e88224f12409a5f23060994eschrockzpool_standard_error(libzfs_handle_t *hdl, int error, const char *fmt, ...)
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "no such pool"));
99653d4ee642c6528e88224f12409a5f23060994eschrock "pool already exists"));
99653d4ee642c6528e88224f12409a5f23060994eschrock zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "pool is busy"));
99653d4ee642c6528e88224f12409a5f23060994eschrock "one or more devices is currently unavailable"));
99653d4ee642c6528e88224f12409a5f23060994eschrock return (-1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Display an out of memory error message and abort the current program.
99653d4ee642c6528e88224f12409a5f23060994eschrock return (zfs_error(hdl, EZFS_NOMEM, "internal error"));
fa9e4066f08beec538e775443c5be79dd423fcabahrens * A safe form of malloc() which will die if the allocation fails.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * A safe form of strdup() which will die if the allocation fails.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Convert a number to an appropriately human-readable output.
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (n >= 1024) {
5c7098917783942b65876f681a21342761227dadeschrock } else if ((num & ((1ULL << 10 * index) - 1)) == 0) {
5c7098917783942b65876f681a21342761227dadeschrock * If this is an even multiple of the base, always display
5c7098917783942b65876f681a21342761227dadeschrock * without any decimal precision.
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 for (i = 2; i >= 0; i--) {
99653d4ee642c6528e88224f12409a5f23060994eschrocklibzfs_print_on_error(libzfs_handle_t *hdl, boolean_t printerr)
99653d4ee642c6528e88224f12409a5f23060994eschrock if ((hdl = calloc(sizeof (libzfs_handle_t), 1)) == NULL) {
c08432ebe688ed6410b302771a9afd8e23e2a7cceschrock if ((hdl->libzfs_fd = open(ZFS_DEV, O_RDWR)) < 0) {
99653d4ee642c6528e88224f12409a5f23060994eschrock if ((hdl->libzfs_mnttab = fopen(MNTTAB, "r")) == NULL) {