1193323Sed/*-
2193323Sed * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3193323Sed *
4193323Sed * Copyright (c) 2017 Kyle J. Kneitinger <kyle@kneit.in>
5193323Sed *
6193323Sed * Redistribution and use in source and binary forms, with or without
7193323Sed * modification, are permitted provided that the following conditions
8193323Sed * are met:
9193323Sed * 1. Redistributions of source code must retain the above copyright
10193323Sed *    notice, this list of conditions and the following disclaimer.
11193323Sed * 2. Redistributions in binary form must reproduce the above copyright
12193323Sed *    notice, this list of conditions and the following disclaimer in the
13193323Sed *    documentation and/or other materials provided with the distribution.
14193323Sed *
15193323Sed * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
16193323Sed * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17193323Sed * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18193323Sed * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
19193323Sed * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20201360Srdivacky * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21198090Srdivacky * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22193323Sed * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23193323Sed * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24193323Sed * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25193323Sed * SUCH DAMAGE.
26193323Sed */
27193323Sed
28193323Sed#include <sys/cdefs.h>
29202878Srdivacky__FBSDID("$FreeBSD: stable/11/lib/libbe/be_error.c 357667 2020-02-07 21:57:27Z kevans $");
30193323Sed
31193323Sed#include "be.h"
32193323Sed#include "be_impl.h"
33193323Sed
34193323Sed/*
35193323Sed * Usage
36193323Sed */
37193323Sedint
38193323Sedlibbe_errno(libbe_handle_t *lbh)
39193323Sed{
40193323Sed
41193323Sed	return (lbh->error);
42193323Sed}
43193323Sed
44193323Sed
45193323Sedconst char *
46193323Sedlibbe_error_description(libbe_handle_t *lbh)
47193323Sed{
48193323Sed
49193323Sed	switch (lbh->error) {
50193323Sed	case BE_ERR_INVALIDNAME:
51193323Sed		return ("invalid boot environment name");
52193323Sed
53193323Sed	case BE_ERR_EXISTS:
54193323Sed		return ("boot environment name already taken");
55193323Sed
56198090Srdivacky	case BE_ERR_NOENT:
57193323Sed		return ("specified boot environment does not exist");
58193323Sed
59193323Sed	case BE_ERR_PERMS:
60193323Sed		return ("insufficient permissions");
61193323Sed
62193323Sed	case BE_ERR_DESTROYACT:
63193323Sed		return ("cannot destroy active boot environment");
64193323Sed
65193323Sed	case BE_ERR_DESTROYMNT:
66193323Sed		return ("cannot destroy mounted boot env unless forced");
67193323Sed
68193323Sed	case BE_ERR_BADPATH:
69193323Sed		return ("path not suitable for operation");
70198090Srdivacky
71198090Srdivacky	case BE_ERR_PATHBUSY:
72193323Sed		return ("specified path is busy");
73198090Srdivacky
74198090Srdivacky	case BE_ERR_PATHLEN:
75198090Srdivacky		return ("provided path name exceeds maximum length limit");
76198090Srdivacky
77193323Sed	case BE_ERR_BADMOUNT:
78198090Srdivacky		return ("mountpoint is not \"/\"");
79193323Sed
80193323Sed	case BE_ERR_NOORIGIN:
81193323Sed		return ("could not open snapshot's origin");
82193323Sed
83193323Sed	case BE_ERR_MOUNTED:
84193323Sed		return ("boot environment is already mounted");
85202878Srdivacky
86202878Srdivacky	case BE_ERR_NOMOUNT:
87202878Srdivacky		return ("boot environment is not mounted");
88202878Srdivacky
89202878Srdivacky	case BE_ERR_ZFSOPEN:
90202878Srdivacky		return ("calling zfs_open() failed");
91202878Srdivacky
92202878Srdivacky	case BE_ERR_ZFSCLONE:
93202878Srdivacky		return ("error when calling zfs_clone() to create boot env");
94202878Srdivacky
95193323Sed	case BE_ERR_IO:
96193323Sed		return ("input/output error");
97193323Sed
98193323Sed	case BE_ERR_NOPOOL:
99193323Sed		return ("operation not supported on this pool");
100193323Sed
101193323Sed	case BE_ERR_NOMEM:
102193323Sed		return ("insufficient memory");
103193323Sed
104193323Sed	case BE_ERR_UNKNOWN:
105193323Sed		return ("unknown error");
106193323Sed
107193323Sed	case BE_ERR_INVORIGIN:
108193323Sed		return ("invalid origin");
109193323Sed
110193323Sed	case BE_ERR_HASCLONES:
111193323Sed		return ("snapshot has clones");
112193323Sed
113193323Sed	default:
114193323Sed		assert(lbh->error == BE_ERR_SUCCESS);
115193323Sed		return ("no error");
116193323Sed	}
117193323Sed}
118193323Sed
119193323Sed
120193323Sedvoid
121193323Sedlibbe_print_on_error(libbe_handle_t *lbh, bool val)
122193323Sed{
123193323Sed
124193323Sed	lbh->print_on_err = val;
125193323Sed	libzfs_print_on_error(lbh->lzh, val);
126193323Sed}
127193323Sed
128193323Sed
129193323Sedint
130193323Sedset_error(libbe_handle_t *lbh, be_error_t err)
131193323Sed{
132193323Sed
133193323Sed	lbh->error = err;
134193323Sed	if (lbh->print_on_err && (err != BE_ERR_SUCCESS))
135193323Sed		fprintf(stderr, "%s\n", libbe_error_description(lbh));
136193323Sed
137193323Sed	return (err);
138193323Sed}
139193323Sed