a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko/*
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * CDDL HEADER START
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko *
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * The contents of this file are subject to the terms of the
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * Common Development and Distribution License (the "License").
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * You may not use this file except in compliance with the License.
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko *
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * or http://www.opensolaris.org/os/licensing.
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * See the License for the specific language governing permissions
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * and limitations under the License.
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko *
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * When distributing Covered Code, include this CDDL HEADER in each
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * If applicable, add the following below this CDDL HEADER, with the
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * fields enclosed by brackets "[]" replaced with your own identifying
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * information: Portions Copyright [yyyy] [name of copyright owner]
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko *
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * CDDL HEADER END
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko */
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko/*
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome * Copyright 2015 Toomas Soome <tsoome@me.com>
0afb687bf3724077cd5f304f176b5ee2b92aa2c2Gary Mills * Copyright 2015 Gary Mills
9adfa60d484ce2435f5af77cc99dcd4e692b6660Matthew Ahrens * Copyright (c) 2015 by Delphix. All rights reserved.
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko */
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko/*
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * System includes
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko */
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko#include <assert.h>
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko#include <stdio.h>
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko#include <strings.h>
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko#include <libzfs.h>
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko#include <locale.h>
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko#include <langinfo.h>
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko#include <stdlib.h>
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko#include <wchar.h>
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko#include <sys/types.h>
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko#include "libbe.h"
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko#ifndef lint
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko#define _(x) gettext(x)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko#else
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko#define _(x) (x)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko#endif
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko#ifndef TEXT_DOMAIN
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko#define TEXT_DOMAIN "SYS_TEST"
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko#endif
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko#define DT_BUF_LEN (128)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko#define NUM_COLS (6)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int be_do_activate(int argc, char **argv);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int be_do_create(int argc, char **argv);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int be_do_destroy(int argc, char **argv);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int be_do_list(int argc, char **argv);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int be_do_mount(int argc, char **argv);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int be_do_unmount(int argc, char **argv);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int be_do_rename(int argc, char **argv);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int be_do_rollback(int argc, char **argv);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic void usage(void);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko/*
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * single column name/width output format description
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko */
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostruct col_info {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *col_name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko size_t width;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko};
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko/*
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * all columns output format
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko */
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostruct hdr_info {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko struct col_info cols[NUM_COLS];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko};
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko/*
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * type of possible output formats
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko */
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkoenum be_fmt {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko BE_FMT_DEFAULT,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko BE_FMT_DATASET,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko BE_FMT_SNAPSHOT,
9b7d742f0ee8ff89c05a8b5275d11359920ec60fAlexander Eremin BE_FMT_ALL
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko};
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko/*
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * command handler description
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko */
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkotypedef struct be_command {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int (*func)(int argc, char **argv);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko} be_command_t;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko/*
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * sorted list of be commands
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko */
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenkostatic const be_command_t be_command_tbl[] = {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko { "activate", be_do_activate },
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko { "create", be_do_create },
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko { "destroy", be_do_destroy },
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko { "list", be_do_list },
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko { "mount", be_do_mount },
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko { "unmount", be_do_unmount },
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko { "umount", be_do_unmount }, /* unmount alias */
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko { "rename", be_do_rename },
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko { "rollback", be_do_rollback },
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko { NULL, NULL },
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko};
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic void
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkousage(void)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko{
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("usage:\n"
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "\tbeadm subcommand cmd_options\n"
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "\n"
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "\tsubcommands:\n"
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "\n"
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin "\tbeadm activate [-v] beName\n"
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin "\tbeadm create [-a] [-d BE_desc]\n"
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "\t\t[-o property=value] ... [-p zpool] \n"
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin "\t\t[-e nonActiveBe | beName@snapshot] [-v] beName\n"
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "\tbeadm create [-d BE_desc]\n"
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin "\t\t[-o property=value] ... [-p zpool] [-v] beName@snapshot\n"
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin "\tbeadm destroy [-Ffsv] beName \n"
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin "\tbeadm destroy [-Fv] beName@snapshot \n"
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome "\tbeadm list [[-a] | [-d] [-s]] [-H]\n"
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome "\t\t[-k|-K date | name | space] [-v] [beName]\n"
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin "\tbeadm mount [-s ro|rw] [-v] beName [mountpoint]\n"
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin "\tbeadm unmount [-fv] beName | mountpoint\n"
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin "\tbeadm umount [-fv] beName | mountpoint\n"
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin "\tbeadm rename [-v] origBeName newBeName\n"
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin "\tbeadm rollback [-v] beName snapshot\n"
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin "\tbeadm rollback [-v] beName@snapshot\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko}
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkorun_be_cmd(const char *cmdname, int argc, char **argv)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko{
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko const be_command_t *command;
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko for (command = &be_command_tbl[0]; command->name != NULL; command++)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (strcmp(command->name, cmdname) == 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (command->func(argc, argv));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Invalid command: %s\n"), cmdname);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko usage();
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko}
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkoint
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkomain(int argc, char **argv)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko{
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *cmdname;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) setlocale(LC_ALL, "");
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) textdomain(TEXT_DOMAIN);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (argc < 2) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko usage();
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko cmdname = argv[1];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko /* Turn error printing off */
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko libbe_print_errors(B_FALSE);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (run_be_cmd(cmdname, --argc, ++argv));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko}
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic void
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkoprint_hdr(struct hdr_info *hdr_info)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko{
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko boolean_t first = B_TRUE;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko size_t i;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko for (i = 0; i < NUM_COLS; i++) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko struct col_info *col_info = &hdr_info->cols[i];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *name = col_info->col_name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko size_t width = col_info->width;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (name == NULL)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko continue;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (first) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf("%-*s", width, name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko first = B_FALSE;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko } else
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(" %-*s", width, name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) putchar('\n');
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko}
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic void
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkoinit_hdr_cols(enum be_fmt be_fmt, struct hdr_info *hdr)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko{
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko struct col_info *col = hdr->cols;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko size_t i;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko col[1].col_name = _("Active");
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko col[2].col_name = _("Mountpoint");
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko col[3].col_name = _("Space");
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko col[4].col_name = _("Policy");
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko col[5].col_name = _("Created");
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko col[6].col_name = NULL;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko switch (be_fmt) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_FMT_ALL:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko col[0].col_name = _("BE/Dataset/Snapshot");
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_FMT_DATASET:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko col[0].col_name = _("BE/Dataset");
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_FMT_SNAPSHOT:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko col[0].col_name = _("BE/Snapshot");
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko col[1].col_name = NULL;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko col[2].col_name = NULL;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_FMT_DEFAULT:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko default:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko col[0].col_name = _("BE");
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko for (i = 0; i < NUM_COLS; i++) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *name = col[i].col_name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko col[i].width = 0;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (name != NULL) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko wchar_t wname[128];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko size_t sz = mbstowcs(wname, name, sizeof (wname) /
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko sizeof (wchar_t));
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko if (sz > 0) {
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko int wcsw = wcswidth(wname, sz);
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko if (wcsw > 0)
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko col[i].width = wcsw;
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko else
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko col[i].width = sz;
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko } else {
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko col[i].width = strlen(name);
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko}
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic void
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkonicenum(uint64_t num, char *buf, size_t buflen)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko{
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko uint64_t n = num;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int index = 0;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char u;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko while (n >= 1024) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko n /= 1024;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko index++;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko u = " KMGTPE"[index];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (index == 0) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) snprintf(buf, buflen, "%llu", n);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko } else {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int i;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko for (i = 2; i >= 0; i--) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (snprintf(buf, buflen, "%.*f%c", i,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (double)num / (1ULL << 10 * index), u) <= 5)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko}
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic void
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkocount_widths(enum be_fmt be_fmt, struct hdr_info *hdr, be_node_list_t *be_nodes)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko{
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko size_t len[NUM_COLS];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char buf[DT_BUF_LEN];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int i;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko be_node_list_t *cur_be;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko for (i = 0; i < NUM_COLS; i++)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko len[i] = hdr->cols[i].width;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko for (cur_be = be_nodes; cur_be != NULL; cur_be = cur_be->be_next_node) {
9adfa60d484ce2435f5af77cc99dcd4e692b6660Matthew Ahrens char name[ZFS_MAX_DATASET_NAME_LEN + 1];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *be_name = cur_be->be_node_name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *root_ds = cur_be->be_root_ds;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char *pos;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko size_t node_name_len = strlen(cur_be->be_node_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko size_t root_ds_len = strlen(cur_be->be_root_ds);
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko size_t mntpt_len = 0;
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko size_t policy_len = 0;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko size_t used_len;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko uint64_t used = cur_be->be_space_used;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko be_snapshot_list_t *snap = NULL;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko if (cur_be->be_mntpt != NULL)
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko mntpt_len = strlen(cur_be->be_mntpt);
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko if (cur_be->be_policy_type != NULL)
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko policy_len = strlen(cur_be->be_policy_type);
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko
542e9fda333dd4a22b4c450409aef403e221c4b3Alexander Stetsenko (void) strlcpy(name, root_ds, sizeof (name));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko pos = strstr(name, be_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_fmt == BE_FMT_DEFAULT) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (node_name_len > len[0])
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko len[0] = node_name_len;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko } else {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (root_ds_len + 3 > len[0])
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko len[0] = root_ds_len + 3;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (mntpt_len > len[2])
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko len[2] = mntpt_len;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (policy_len > len[4])
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko len[4] = policy_len;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko for (snap = cur_be->be_node_snapshots; snap != NULL;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko snap = snap->be_next_snapshot) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko uint64_t snap_used = snap->be_snapshot_space_used;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *snap_name = snap->be_snapshot_name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) strcpy(pos, snap_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_fmt == BE_FMT_DEFAULT)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko used += snap_used;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko else if (be_fmt & BE_FMT_SNAPSHOT) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int snap_len = strlen(name) + 3;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_fmt == BE_FMT_SNAPSHOT)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko snap_len -= pos - name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (snap_len > len[0])
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko len[0] = snap_len;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nicenum(snap_used, buf, sizeof (buf));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko used_len = strlen(buf);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (used_len > len[3])
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko len[3] = used_len;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_fmt == BE_FMT_DEFAULT) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int used_len;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nicenum(used, buf, sizeof (buf));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko used_len = strlen(buf);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (used_len > len[3])
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko len[3] = used_len;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nicenum(used, buf, sizeof (buf));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko for (i = 0; i < NUM_COLS; i++)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[i].width = len[i];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko}
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic void
9b7d742f0ee8ff89c05a8b5275d11359920ec60fAlexander Ereminprint_be_nodes(const char *be_name, boolean_t parsable, struct hdr_info *hdr,
9b7d742f0ee8ff89c05a8b5275d11359920ec60fAlexander Eremin be_node_list_t *nodes)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko{
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char buf[64];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char datetime[DT_BUF_LEN];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko be_node_list_t *cur_be;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko for (cur_be = nodes; cur_be != NULL; cur_be = cur_be->be_next_node) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char active[3] = "-\0";
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int ai = 0;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *datetime_fmt = "%F %R";
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *name = cur_be->be_node_name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *mntpt = cur_be->be_mntpt;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko be_snapshot_list_t *snap = NULL;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko uint64_t used = cur_be->be_space_used;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko time_t creation = cur_be->be_node_creation;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko struct tm *tm;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_name != NULL && strcmp(be_name, name) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko continue;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (parsable)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko active[0] = '\0';
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko tm = localtime(&creation);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) strftime(datetime, DT_BUF_LEN, datetime_fmt, tm);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko for (snap = cur_be->be_node_snapshots; snap != NULL;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko snap = snap->be_next_snapshot)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko used += snap->be_snapshot_space_used;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin if (!cur_be->be_global_active)
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin active[ai++] = 'x';
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (cur_be->be_active)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko active[ai++] = 'N';
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin if (cur_be->be_active_on_boot) {
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin if (!cur_be->be_global_active)
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin active[ai] = 'b';
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin else
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin active[ai] = 'R';
7e0e2549bfaa531aff576083ab0c07f84fa8fb27Alexander Eremin }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nicenum(used, buf, sizeof (buf));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (parsable)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf("%s;%s;%s;%s;%llu;%s;%ld\n",
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko name,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko cur_be->be_uuid_str,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko active,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (cur_be->be_mounted ? mntpt: ""),
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko used,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko cur_be->be_policy_type,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko creation);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko else
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf("%-*s %-*s %-*s %-*s %-*s %-*s\n",
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[0].width, name,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[1].width, active,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[2].width, (cur_be->be_mounted ? mntpt:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "-"),
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[3].width, buf,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[4].width, cur_be->be_policy_type,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[5].width, datetime);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko}
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic void
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkoprint_be_snapshots(be_node_list_t *be, struct hdr_info *hdr, boolean_t parsable)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko{
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char buf[64];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char datetime[DT_BUF_LEN];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko be_snapshot_list_t *snap = NULL;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko for (snap = be->be_node_snapshots; snap != NULL;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko snap = snap->be_next_snapshot) {
9adfa60d484ce2435f5af77cc99dcd4e692b6660Matthew Ahrens char name[ZFS_MAX_DATASET_NAME_LEN + 1];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *datetime_fmt = "%F %R";
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *be_name = be->be_node_name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *root_ds = be->be_root_ds;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *snap_name = snap->be_snapshot_name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char *pos;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko uint64_t used = snap->be_snapshot_space_used;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko time_t creation = snap->be_snapshot_creation;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko struct tm *tm = localtime(&creation);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) strncpy(name, root_ds, sizeof (name));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko pos = strstr(name, be_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) strcpy(pos, snap_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) strftime(datetime, DT_BUF_LEN, datetime_fmt, tm);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nicenum(used, buf, sizeof (buf));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (parsable)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (hdr->cols[1].width != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf("%s;%s;%s;%s;%llu;%s;%ld\n",
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko be_name,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko snap_name,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "",
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "",
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko used,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko be->be_policy_type,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko creation);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko else
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf("%s;%s;%llu;%s;%ld\n",
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko be_name,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko snap_name,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko used,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko be->be_policy_type,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko creation);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko else
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (hdr->cols[1].width != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(" %-*s %-*s %-*s %-*s %-*s "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "%-*s\n",
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[0].width-3, name,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[1].width, "-",
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[2].width, "-",
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[3].width, buf,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[4].width, be->be_policy_type,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[5].width, datetime);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko else
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(" %-*s %-*s %-*s %-*s\n",
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[0].width-3, snap_name,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[3].width, buf,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[4].width, be->be_policy_type,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[5].width, datetime);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko}
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic void
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkoprint_fmt_nodes(const char *be_name, enum be_fmt be_fmt, boolean_t parsable,
9b7d742f0ee8ff89c05a8b5275d11359920ec60fAlexander Eremin struct hdr_info *hdr, be_node_list_t *nodes)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko{
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char buf[64];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char datetime[DT_BUF_LEN];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko be_node_list_t *cur_be;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko for (cur_be = nodes; cur_be != NULL; cur_be = cur_be->be_next_node) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char active[3] = "-\0";
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int ai = 0;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *datetime_fmt = "%F %R";
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *name = cur_be->be_node_name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *mntpt = cur_be->be_mntpt;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko uint64_t used = cur_be->be_space_used;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko time_t creation = cur_be->be_node_creation;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko struct tm *tm;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_name != NULL && strcmp(be_name, name) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko continue;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (!parsable)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf("%-s\n", name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko else
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko active[0] = '\0';
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko tm = localtime(&creation);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) strftime(datetime, DT_BUF_LEN, datetime_fmt, tm);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (cur_be->be_active)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko active[ai++] = 'N';
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (cur_be->be_active_on_boot)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko active[ai] = 'R';
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nicenum(used, buf, sizeof (buf));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_fmt & BE_FMT_DATASET)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (parsable)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf("%s;%s;%s;%s;%llu;%s;%ld\n",
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko cur_be->be_node_name,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko cur_be->be_root_ds,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko active,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (cur_be->be_mounted ? mntpt: ""),
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko used,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko cur_be->be_policy_type,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko creation);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko else
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(" %-*s %-*s %-*s %-*s %-*s "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "%-*s\n",
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[0].width-3, cur_be->be_root_ds,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[1].width, active,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[2].width, (cur_be->be_mounted ?
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko mntpt: "-"),
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[3].width, buf,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[4].width, cur_be->be_policy_type,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko hdr->cols[5].width, datetime);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_fmt & BE_FMT_SNAPSHOT)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko print_be_snapshots(cur_be, hdr, parsable);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko}
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic void
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkoprint_nodes(const char *be_name, boolean_t dsets, boolean_t snaps,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko boolean_t parsable, be_node_list_t *be_nodes)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko{
9b7d742f0ee8ff89c05a8b5275d11359920ec60fAlexander Eremin struct hdr_info hdr;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko enum be_fmt be_fmt = BE_FMT_DEFAULT;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (dsets)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko be_fmt |= BE_FMT_DATASET;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (snaps)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko be_fmt |= BE_FMT_SNAPSHOT;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
9b7d742f0ee8ff89c05a8b5275d11359920ec60fAlexander Eremin if (!parsable) {
9b7d742f0ee8ff89c05a8b5275d11359920ec60fAlexander Eremin init_hdr_cols(be_fmt, &hdr);
9b7d742f0ee8ff89c05a8b5275d11359920ec60fAlexander Eremin count_widths(be_fmt, &hdr, be_nodes);
9b7d742f0ee8ff89c05a8b5275d11359920ec60fAlexander Eremin print_hdr(&hdr);
9b7d742f0ee8ff89c05a8b5275d11359920ec60fAlexander Eremin }
9b7d742f0ee8ff89c05a8b5275d11359920ec60fAlexander Eremin
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_fmt == BE_FMT_DEFAULT)
9b7d742f0ee8ff89c05a8b5275d11359920ec60fAlexander Eremin print_be_nodes(be_name, parsable, &hdr, be_nodes);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko else
9b7d742f0ee8ff89c05a8b5275d11359920ec60fAlexander Eremin print_fmt_nodes(be_name, be_fmt, parsable, &hdr, be_nodes);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko}
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic boolean_t
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkoconfirm_destroy(const char *name)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko{
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko boolean_t res = B_FALSE;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *yesre = nl_langinfo(YESEXPR);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *nore = nl_langinfo(NOEXPR);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko regex_t yes_re;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko regex_t no_re;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char buf[128];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char *answer;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int cflags = REG_EXTENDED;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (regcomp(&yes_re, yesre, cflags) != 0) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko /* should not happen */
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Failed to compile 'yes' regexp\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (res);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (regcomp(&no_re, nore, cflags) != 0) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko /* should not happen */
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Failed to compile 'no' regexp\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko regfree(&yes_re);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (res);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(_("Are you sure you want to destroy %s?\n"
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "This action cannot be undone (y/[n]): "), name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko answer = fgets(buf, sizeof (buf), stdin);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (answer == NULL || *answer == '\0' || *answer == 10)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (regexec(&yes_re, answer, 0, NULL, 0) == 0) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko res = B_TRUE;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko } else if (regexec(&no_re, answer, 0, NULL, 0) != 0) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Invalid response. "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "Please enter 'y' or 'n'.\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkoout:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko regfree(&yes_re);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko regfree(&no_re);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (res);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko}
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkobe_nvl_alloc(nvlist_t **nvlp)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko{
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko assert(nvlp != NULL);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (nvlist_alloc(nvlp, NV_UNIQUE_NAME, 0) != 0) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) perror(_("nvlist_alloc failed.\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (0);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko}
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkobe_nvl_add_string(nvlist_t *nvl, const char *name, const char *val)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko{
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko assert(nvl != NULL);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (nvlist_add_string(nvl, name, val) != 0) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("nvlist_add_string failed for "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "%s (%s).\n"), name, val);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (0);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko}
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkobe_nvl_add_nvlist(nvlist_t *nvl, const char *name, nvlist_t *val)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko{
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko assert(nvl != NULL);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (nvlist_add_nvlist(nvl, name, val) != 0) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("nvlist_add_nvlist failed for %s.\n"),
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (0);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko}
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkobe_nvl_add_uint16(nvlist_t *nvl, const char *name, uint16_t val)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko{
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko assert(nvl != NULL);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (nvlist_add_uint16(nvl, name, val) != 0) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("nvlist_add_uint16 failed for "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "%s (%hu).\n"), name, val);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (0);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko}
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkobe_do_activate(int argc, char **argv)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko{
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nvlist_t *be_attrs;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int err = 1;
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin int c;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char *obe_name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin while ((c = getopt(argc, argv, "v")) != -1) {
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin switch (c) {
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin case 'v':
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin libbe_print_errors(B_TRUE);
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin break;
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin default:
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin usage();
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin return (1);
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin }
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin }
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko argc -= optind;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko argv += optind;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (argc != 1) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko usage();
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko obe_name = argv[0];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_alloc(&be_attrs) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_string(be_attrs, BE_ATTR_ORIG_BE_NAME, obe_name) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko err = be_activate(be_attrs);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko switch (err) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_SUCCESS:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(_("Activated successfully\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_BE_NOENT:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("%s does not exist or appear "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "to be a valid BE.\nPlease check that the name of "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "the BE provided is correct.\n"), obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_PERM:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_ACCESS:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to activate %s.\n"), obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("You have insufficient privileges to "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "execute this command.\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_ACTIVATE_CURR:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko default:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to activate %s.\n"), obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, "%s\n", be_err_to_str(err));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkoout:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nvlist_free(be_attrs);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (err);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko}
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkobe_do_create(int argc, char **argv)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko{
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nvlist_t *be_attrs;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nvlist_t *zfs_props = NULL;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko boolean_t activate = B_FALSE;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko boolean_t is_snap = B_FALSE;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int c;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int err = 1;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char *obe_name = NULL;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char *snap_name = NULL;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char *nbe_zpool = NULL;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char *nbe_name = NULL;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char *nbe_desc = NULL;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char *propname = NULL;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char *propval = NULL;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char *strval = NULL;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin while ((c = getopt(argc, argv, "ad:e:io:p:v")) != -1) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko switch (c) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case 'a':
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko activate = B_TRUE;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case 'd':
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nbe_desc = optarg;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case 'e':
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko obe_name = optarg;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case 'o':
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (zfs_props == NULL && be_nvl_alloc(&zfs_props) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko propname = optarg;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if ((propval = strchr(propname, '=')) == NULL) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("missing "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "'=' for -o option\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out2;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko *propval = '\0';
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko propval++;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (nvlist_lookup_string(zfs_props, propname,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko &strval) == 0) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("property '%s' "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "specified multiple times\n"), propname);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out2;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_string(zfs_props, propname, propval)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out2;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case 'p':
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nbe_zpool = optarg;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin case 'v':
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin libbe_print_errors(B_TRUE);
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko default:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko usage();
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out2;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko argc -= optind;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko argv += optind;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (argc != 1) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko usage();
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out2;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nbe_name = argv[0];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if ((snap_name = strrchr(nbe_name, '@')) != NULL) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (snap_name[1] == '\0') {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko usage();
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out2;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko snap_name[0] = '\0';
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko snap_name++;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko is_snap = B_TRUE;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (obe_name) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (is_snap) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko usage();
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out2;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko /*
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * Check if obe_name is really a snapshot name.
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * If so, split it out.
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko */
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if ((snap_name = strrchr(obe_name, '@')) != NULL) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (snap_name[1] == '\0') {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko usage();
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out2;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko snap_name[0] = '\0';
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko snap_name++;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko } else if (is_snap) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko obe_name = nbe_name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nbe_name = NULL;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_alloc(&be_attrs) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out2;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (zfs_props != NULL && be_nvl_add_nvlist(be_attrs,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko BE_ATTR_ORIG_BE_NAME, zfs_props) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (obe_name != NULL && be_nvl_add_string(be_attrs,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko BE_ATTR_ORIG_BE_NAME, obe_name) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (snap_name != NULL && be_nvl_add_string(be_attrs,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko BE_ATTR_SNAP_NAME, snap_name) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (nbe_zpool != NULL && be_nvl_add_string(be_attrs,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko BE_ATTR_NEW_BE_POOL, nbe_zpool) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (nbe_name != NULL && be_nvl_add_string(be_attrs,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko BE_ATTR_NEW_BE_NAME, nbe_name) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (nbe_desc != NULL && be_nvl_add_string(be_attrs,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko BE_ATTR_NEW_BE_DESC, nbe_desc) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (is_snap)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko err = be_create_snapshot(be_attrs);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko else
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko err = be_copy(be_attrs);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko switch (err) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_SUCCESS:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (!is_snap && !nbe_name) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko /*
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * We requested an auto named BE; find out the
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * name of the BE that was created for us and
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko * the auto snapshot created from the original BE.
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko */
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (nvlist_lookup_string(be_attrs, BE_ATTR_NEW_BE_NAME,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko &nbe_name) != 0) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("failed to get %s "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "attribute\n"), BE_ATTR_NEW_BE_NAME);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko } else
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(_("Auto named BE: %s\n"),
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nbe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (nvlist_lookup_string(be_attrs, BE_ATTR_SNAP_NAME,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko &snap_name) != 0) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("failed to get %s "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "attribute\n"), BE_ATTR_SNAP_NAME);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko } else
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(_("Auto named snapshot: %s\n"),
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko snap_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (!is_snap && activate) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char *args[] = { "activate", "", NULL };
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko args[1] = nbe_name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko optind = 1;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko err = be_do_activate(2, args);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(_("Created successfully\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_BE_EXISTS:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("BE %s already exists\n."
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "Please choose a different BE name.\n"), nbe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_SS_EXISTS:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("BE %s snapshot %s already exists.\n"
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "Please choose a different snapshot name.\n"), obe_name,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko snap_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_PERM:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_ACCESS:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (is_snap)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to create snapshot "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "%s.\n"), snap_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko else
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to create %s.\n"),
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nbe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("You have insufficient privileges to "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "execute this command.\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko default:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (is_snap)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to create snapshot "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "%s.\n"), snap_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko else
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to create %s.\n"),
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nbe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, "%s\n", be_err_to_str(err));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkoout:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nvlist_free(be_attrs);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkoout2:
aab83bb83be7342f6cfccaed8d5fe0b2f404855dJosef 'Jeff' Sipek nvlist_free(zfs_props);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (err);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko}
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkobe_do_destroy(int argc, char **argv)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko{
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nvlist_t *be_attrs;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko boolean_t is_snap = B_FALSE;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko boolean_t suppress_prompt = B_FALSE;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int err = 1;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int c;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int destroy_flags = 0;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char *snap_name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char *be_name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin while ((c = getopt(argc, argv, "fFsv")) != -1) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko switch (c) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case 'f':
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko destroy_flags |= BE_DESTROY_FLAG_FORCE_UNMOUNT;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case 's':
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko destroy_flags |= BE_DESTROY_FLAG_SNAPSHOTS;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin case 'v':
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin libbe_print_errors(B_TRUE);
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case 'F':
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko suppress_prompt = B_TRUE;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko default:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko usage();
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko argc -= optind;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko argv += optind;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (argc != 1) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko usage();
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko be_name = argv[0];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (!suppress_prompt && !confirm_destroy(be_name)) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(_("%s has not been destroyed.\n"), be_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (0);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if ((snap_name = strrchr(be_name, '@')) != NULL) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (snap_name[1] == '\0') {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko usage();
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko is_snap = B_TRUE;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko *snap_name = '\0';
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko snap_name++;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_alloc(&be_attrs) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_string(be_attrs, BE_ATTR_ORIG_BE_NAME, be_name) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (is_snap) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_string(be_attrs, BE_ATTR_SNAP_NAME,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko snap_name) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko err = be_destroy_snapshot(be_attrs);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko } else {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_uint16(be_attrs, BE_ATTR_DESTROY_FLAGS,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko destroy_flags) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko err = be_destroy(be_attrs);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko switch (err) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_SUCCESS:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(_("Destroyed successfully\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_MOUNTED:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to destroy %s.\n"), be_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("It is currently mounted and must be "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "unmounted before it can be destroyed.\n" "Use 'beadm "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "unmount %s' to unmount the BE before destroying\nit or "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "'beadm destroy -f %s'.\n"), be_name, be_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_DESTROY_CURR_BE:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("%s is the currently active BE and "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "cannot be destroyed.\nYou must boot from another BE in "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "order to destroy %s.\n"), be_name, be_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_ZONES_UNMOUNT:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to destroy one of " "%s's "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "zone BE's.\nUse 'beadm destroy -f %s' or "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "'zfs -f destroy <dataset>'.\n"), be_name, be_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_SS_NOENT:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("%s does not exist or appear "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "to be a valid snapshot.\nPlease check that the name of "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "the snapshot provided is correct.\n"), snap_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_PERM:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_ACCESS:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to destroy %s.\n"), be_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("You have insufficient privileges to "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "execute this command.\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
5ee7c79303f6cc727e2df5f1c7332c0f4c9832a3Alexander Eremin case BE_ERR_SS_EXISTS:
5ee7c79303f6cc727e2df5f1c7332c0f4c9832a3Alexander Eremin (void) fprintf(stderr, _("Unable to destroy %s: "
5ee7c79303f6cc727e2df5f1c7332c0f4c9832a3Alexander Eremin "BE has snapshots.\nUse 'beadm destroy -s %s' or "
5ee7c79303f6cc727e2df5f1c7332c0f4c9832a3Alexander Eremin "'zfs -r destroy <dataset>'.\n"), be_name, be_name);
5ee7c79303f6cc727e2df5f1c7332c0f4c9832a3Alexander Eremin break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko default:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to destroy %s.\n"), be_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, "%s\n", be_err_to_str(err));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkoout:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nvlist_free(be_attrs);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (err);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko}
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkobe_do_list(int argc, char **argv)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko{
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko be_node_list_t *be_nodes = NULL;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko boolean_t all = B_FALSE;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko boolean_t dsets = B_FALSE;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko boolean_t snaps = B_FALSE;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko boolean_t parsable = B_FALSE;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int err = 1;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int c = 0;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char *be_name = NULL;
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome be_sort_t order = BE_SORT_UNSPECIFIED;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome while ((c = getopt(argc, argv, "adk:svHK:")) != -1) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko switch (c) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case 'a':
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko all = B_TRUE;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case 'd':
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko dsets = B_TRUE;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome case 'k':
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome case 'K':
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome if (order != BE_SORT_UNSPECIFIED) {
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome (void) fprintf(stderr, _("Sort key can be "
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome "specified only once.\n"));
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome usage();
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome return (1);
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome }
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome if (strcmp(optarg, "date") == 0) {
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome if (c == 'k')
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome order = BE_SORT_DATE;
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome else
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome order = BE_SORT_DATE_REV;
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome break;
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome }
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome if (strcmp(optarg, "name") == 0) {
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome if (c == 'k')
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome order = BE_SORT_NAME;
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome else
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome order = BE_SORT_NAME_REV;
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome break;
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome }
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome if (strcmp(optarg, "space") == 0) {
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome if (c == 'k')
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome order = BE_SORT_SPACE;
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome else
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome order = BE_SORT_SPACE_REV;
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome break;
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome }
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome (void) fprintf(stderr, _("Unknown sort key: %s\n"),
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome optarg);
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome usage();
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case 's':
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko snaps = B_TRUE;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin case 'v':
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin libbe_print_errors(B_TRUE);
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case 'H':
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko parsable = B_TRUE;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko default:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko usage();
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (all) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (dsets) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Invalid options: -a and %s "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "are mutually exclusive.\n"), "-d");
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko usage();
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (snaps) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Invalid options: -a and %s "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "are mutually exclusive.\n"), "-s");
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko usage();
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko dsets = B_TRUE;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko snaps = B_TRUE;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko argc -= optind;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko argv += optind;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (argc == 1)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko be_name = argv[0];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko err = be_list(be_name, &be_nodes);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko switch (err) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_SUCCESS:
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome /* the default sort is ascending date, no need to sort twice */
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome if (order == BE_SORT_UNSPECIFIED)
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome order = BE_SORT_DATE;
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome
0afb687bf3724077cd5f304f176b5ee2b92aa2c2Gary Mills if (order != BE_SORT_DATE) {
0afb687bf3724077cd5f304f176b5ee2b92aa2c2Gary Mills err = be_sort(&be_nodes, order);
0afb687bf3724077cd5f304f176b5ee2b92aa2c2Gary Mills if (err != BE_SUCCESS) {
0afb687bf3724077cd5f304f176b5ee2b92aa2c2Gary Mills (void) fprintf(stderr, _("Unable to sort Boot "
0afb687bf3724077cd5f304f176b5ee2b92aa2c2Gary Mills "Environment\n"));
0afb687bf3724077cd5f304f176b5ee2b92aa2c2Gary Mills (void) fprintf(stderr, "%s\n",
0afb687bf3724077cd5f304f176b5ee2b92aa2c2Gary Mills be_err_to_str(err));
0afb687bf3724077cd5f304f176b5ee2b92aa2c2Gary Mills break;
0afb687bf3724077cd5f304f176b5ee2b92aa2c2Gary Mills }
0afb687bf3724077cd5f304f176b5ee2b92aa2c2Gary Mills }
4adca7e7219d20c7ca20933b5006222e781ff0e9Toomas Soome
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko print_nodes(be_name, dsets, snaps, parsable, be_nodes);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_BE_NOENT:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_name == NULL)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("No boot environments found "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "on this system.\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko else {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("%s does not exist or appear "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "to be a valid BE.\nPlease check that the name of "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "the BE provided is correct.\n"), be_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko default:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to display Boot "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "Environment\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, "%s\n", be_err_to_str(err));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nodes != NULL)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko be_free_list(be_nodes);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (err);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko}
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkobe_do_mount(int argc, char **argv)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko{
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nvlist_t *be_attrs;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko boolean_t shared_fs = B_FALSE;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int err = 1;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int c;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int mount_flags = 0;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char *obe_name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char *mountpoint;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char *tmp_mp = NULL;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin while ((c = getopt(argc, argv, "s:v")) != -1) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko switch (c) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case 's':
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko shared_fs = B_TRUE;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko mount_flags |= BE_MOUNT_FLAG_SHARED_FS;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (strcmp(optarg, "rw") == 0) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko mount_flags |= BE_MOUNT_FLAG_SHARED_RW;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko } else if (strcmp(optarg, "ro") != 0) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("The -s flag "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "requires an argument [ rw | ro ]\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko usage();
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin break;
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin case 'v':
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin libbe_print_errors(B_TRUE);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko default:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko usage();
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko argc -= optind;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko argv += optind;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (argc < 1 || argc > 2) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko usage();
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko obe_name = argv[0];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (argc == 2) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko mountpoint = argv[1];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (mountpoint[0] != '/') {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Invalid mount point %s. "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "Mount point must start with a /.\n"), mountpoint);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko } else {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *tmpdir = getenv("TMPDIR");
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko const char *tmpname = "tmp.XXXXXX";
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int sz;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (tmpdir == NULL)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko tmpdir = "/tmp";
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko sz = asprintf(&tmp_mp, "%s/%s", tmpdir, tmpname);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (sz < 0) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("internal error: "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "out of memory\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko mountpoint = mkdtemp(tmp_mp);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_alloc(&be_attrs) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_string(be_attrs, BE_ATTR_ORIG_BE_NAME, obe_name) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_string(be_attrs, BE_ATTR_MOUNTPOINT, mountpoint) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (shared_fs && be_nvl_add_uint16(be_attrs, BE_ATTR_MOUNT_FLAGS,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko mount_flags) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko err = be_mount(be_attrs);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko switch (err) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_SUCCESS:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(_("Mounted successfully on: '%s'\n"), mountpoint);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_BE_NOENT:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("%s does not exist or appear "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "to be a valid BE.\nPlease check that the name of "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "the BE provided is correct.\n"), obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_MOUNTED:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("%s is already mounted.\n"
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "Please unmount the BE before mounting it again.\n"),
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_PERM:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_ACCESS:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to mount %s.\n"), obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("You have insufficient privileges to "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "execute this command.\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
40ccc6ad48401a6fe660d7d49d6f60e9320403c9Alexander Eremin case BE_ERR_NO_MOUNTED_ZONE:
40ccc6ad48401a6fe660d7d49d6f60e9320403c9Alexander Eremin (void) fprintf(stderr, _("Mounted on '%s'.\nUnable to mount "
40ccc6ad48401a6fe660d7d49d6f60e9320403c9Alexander Eremin "one of %s's zone BE's.\n"), mountpoint, obe_name);
40ccc6ad48401a6fe660d7d49d6f60e9320403c9Alexander Eremin break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko default:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to mount %s.\n"), obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, "%s\n", be_err_to_str(err));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkoout:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (tmp_mp != NULL)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko free(tmp_mp);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nvlist_free(be_attrs);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (err);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko}
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkobe_do_unmount(int argc, char **argv)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko{
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nvlist_t *be_attrs;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char *obe_name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int err = 1;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int c;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int unmount_flags = 0;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin while ((c = getopt(argc, argv, "fv")) != -1) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko switch (c) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case 'f':
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko unmount_flags |= BE_UNMOUNT_FLAG_FORCE;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin case 'v':
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin libbe_print_errors(B_TRUE);
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko default:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko usage();
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko argc -= optind;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko argv += optind;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (argc != 1) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko usage();
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko obe_name = argv[0];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_alloc(&be_attrs) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_string(be_attrs, BE_ATTR_ORIG_BE_NAME, obe_name) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_uint16(be_attrs, BE_ATTR_UNMOUNT_FLAGS,
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko unmount_flags) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko err = be_unmount(be_attrs);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko switch (err) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_SUCCESS:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(_("Unmounted successfully\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_BE_NOENT:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("%s does not exist or appear "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "to be a valid BE.\nPlease check that the name of "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "the BE provided is correct.\n"), obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_UMOUNT_CURR_BE:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("%s is the currently active BE.\n"
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "It cannot be unmounted unless another BE is the "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "currently active BE.\n"), obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_UMOUNT_SHARED:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("%s is a shared file system and it "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "cannot be unmounted.\n"), obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_PERM:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_ACCESS:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to unmount %s.\n"), obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("You have insufficient privileges to "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "execute this command.\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko default:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Unable to unmount %s.\n"), obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, "%s\n", be_err_to_str(err));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkoout:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nvlist_free(be_attrs);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (err);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko}
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkobe_do_rename(int argc, char **argv)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko{
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nvlist_t *be_attrs;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char *obe_name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char *nbe_name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int err = 1;
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin int c;
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin while ((c = getopt(argc, argv, "v")) != -1) {
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin switch (c) {
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin case 'v':
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin libbe_print_errors(B_TRUE);
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin break;
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin default:
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin usage();
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin return (1);
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin }
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko argc -= optind;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko argv += optind;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (argc != 2) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko usage();
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko obe_name = argv[0];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nbe_name = argv[1];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_alloc(&be_attrs) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_string(be_attrs, BE_ATTR_ORIG_BE_NAME, obe_name) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_string(be_attrs, BE_ATTR_NEW_BE_NAME, nbe_name) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko err = be_rename(be_attrs);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko switch (err) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_SUCCESS:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(_("Renamed successfully\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_BE_NOENT:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("%s does not exist or appear "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "to be a valid BE.\nPlease check that the name of "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "the BE provided is correct.\n"), obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_PERM:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_ACCESS:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Rename of BE %s failed.\n"),
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("You have insufficient privileges to "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "execute this command.\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko default:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Rename of BE %s failed.\n"),
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, "%s\n", be_err_to_str(err));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkoout:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nvlist_free(be_attrs);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (err);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko}
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkostatic int
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkobe_do_rollback(int argc, char **argv)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko{
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nvlist_t *be_attrs;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char *obe_name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko char *snap_name;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko int err = 1;
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin int c;
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin while ((c = getopt(argc, argv, "v")) != -1) {
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin switch (c) {
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin case 'v':
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin libbe_print_errors(B_TRUE);
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin break;
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin default:
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin usage();
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin return (1);
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin }
82b6a9dcaf3fba09f06b436a62d844089892b956Alexander Eremin }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko argc -= optind;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko argv += optind;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (argc < 1 || argc > 2) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko usage();
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko obe_name = argv[0];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (argc == 2)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko snap_name = argv[1];
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko else { /* argc == 1 */
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if ((snap_name = strrchr(obe_name, '@')) != NULL) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (snap_name[1] == '\0') {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko usage();
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko snap_name[0] = '\0';
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko snap_name++;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko } else {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko usage();
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_alloc(&be_attrs) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (1);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_string(be_attrs, BE_ATTR_ORIG_BE_NAME, obe_name) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko if (be_nvl_add_string(be_attrs, BE_ATTR_SNAP_NAME, snap_name) != 0)
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko goto out;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko err = be_rollback(be_attrs);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko switch (err) {
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_SUCCESS:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) printf(_("Rolled back successfully\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_BE_NOENT:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("%s does not exist or appear "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "to be a valid BE.\nPlease check that the name of "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "the BE provided is correct.\n"), obe_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_SS_NOENT:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("%s does not exist or appear "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "to be a valid snapshot.\nPlease check that the name of "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "the snapshot provided is correct.\n"), snap_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_PERM:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko case BE_ERR_ACCESS:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Rollback of BE %s snapshot %s "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "failed.\n"), obe_name, snap_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("You have insufficient privileges to "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "execute this command.\n"));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko break;
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko default:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, _("Rollback of BE %s snapshot %s "
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko "failed.\n"), obe_name, snap_name);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko (void) fprintf(stderr, "%s\n", be_err_to_str(err));
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko }
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenkoout:
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko nvlist_free(be_attrs);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko return (err);
a7ee947f69e6d1a3903e0918f85630f74650b992Alexander Stetsenko}