socsvn commit: r324147 - soc2017/kneitinger/libbe-head/lib/libbe
kneitinger at FreeBSD.org
kneitinger at FreeBSD.org
Sat Jul 1 12:02:56 UTC 2017
Author: kneitinger
Date: Sat Jul 1 12:02:53 2017
New Revision: 324147
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=324147
Log:
libbe(3): add zfs property list, refactor libbe_handle_t struct to be opaque
Added:
soc2017/kneitinger/libbe-head/lib/libbe/be_impl.h
soc2017/kneitinger/libbe-head/lib/libbe/be_info.c
Modified:
soc2017/kneitinger/libbe-head/lib/libbe/Makefile
soc2017/kneitinger/libbe-head/lib/libbe/be.c
soc2017/kneitinger/libbe-head/lib/libbe/be.h
soc2017/kneitinger/libbe-head/lib/libbe/be_error.c
Modified: soc2017/kneitinger/libbe-head/lib/libbe/Makefile
==============================================================================
--- soc2017/kneitinger/libbe-head/lib/libbe/Makefile Sat Jul 1 11:18:48 2017 (r324146)
+++ soc2017/kneitinger/libbe-head/lib/libbe/Makefile Sat Jul 1 12:02:53 2017 (r324147)
@@ -28,7 +28,7 @@
LIB= be
SHLIB_MAJOR= 1
SHLIB_MINOR= 0
-SRCS= be.c be_error.c
+SRCS= be.c be_error.c be_info.c
INCS= be.h
MAN= libbe.3
Modified: soc2017/kneitinger/libbe-head/lib/libbe/be.c
==============================================================================
--- soc2017/kneitinger/libbe-head/lib/libbe/be.c Sat Jul 1 11:18:48 2017 (r324146)
+++ soc2017/kneitinger/libbe-head/lib/libbe/be.c Sat Jul 1 12:02:53 2017 (r324147)
@@ -33,18 +33,7 @@
#include <sys/types.h>
#include "be.h"
-
-/*
- * Test iterator function to verify datasets were mounted correctly. Will be
- * deleted shortly
- */
-static int
-zfs_printer(zfs_handle_t *zfs_hdl, void *data)
-{
- fprintf(stdout, "Name: %s\n", zfs_get_name(zfs_hdl));
- return (0);
-}
-
+#include "be_impl.h"
/*
* Initializes the libbe context to operate in the root boot environment
@@ -81,6 +70,7 @@
char *path = strrchr(buf, ':');
path = path ? path + 1 : buf;
+ /* Obtain zfs_handle_t to the active bootenv */
if ((lbh->be_active = zfs_open(lbh->lzh, path,
ZFS_TYPE_DATASET)) == NULL) {
libzfs_fini(lbh->lzh);
@@ -97,6 +87,8 @@
return (NULL);
}
+
+ /* Obtain zfs_handle_t to the bootenv root */
if ((lbh->be_root =
zfs_open(lbh->lzh, buf, ZFS_TYPE_DATASET)) == NULL) {
zfs_close(lbh->be_active);
@@ -108,10 +100,8 @@
/* TODO: verify that /boot is mounted on the active be */
- /* Quick test to print child datasets and therefore verify that be_root
- * was opened correctly. Will soon be deleted.
- */
- zfs_iter_filesystems(lbh->be_root, zfs_printer, NULL);
+ prop_list_builder(lbh);
+
return (lbh);
}
@@ -126,37 +116,6 @@
zfs_close(lbh->be_active);
zfs_close(lbh->be_root);
libzfs_fini(lbh->lzh);
+ /* TODO: clean up property list */
free(lbh);
}
-
-
-/*
- * Returns the name of the active boot environment
- */
-const char *
-be_get_active_name(libbe_handle_t *lbh)
-{
- const char *full_path = zfs_get_name(lbh->be_active);
-
- return (strrchr(full_path, '/') + 1);
-}
-
-
-/*
- * Returns full path of the active boot environment
- */
-const char *
-be_get_active_path(libbe_handle_t *lbh)
-{
- return (zfs_get_name(lbh->be_active));
-}
-
-
-/*
- * Returns the path of the boot environment root dataset
- */
-const char *
-be_get_root_path(libbe_handle_t *lbh)
-{
- return (zfs_get_name(lbh->be_root));
-}
Modified: soc2017/kneitinger/libbe-head/lib/libbe/be.h
==============================================================================
--- soc2017/kneitinger/libbe-head/lib/libbe/be.h Sat Jul 1 11:18:48 2017 (r324146)
+++ soc2017/kneitinger/libbe-head/lib/libbe/be.h Sat Jul 1 12:02:53 2017 (r324147)
@@ -33,38 +33,36 @@
#define MAX_PATHLEN 512
-typedef enum be_error {
- BE_ERR_SUCCESS = 0, /* No error */
- BE_ERR_INVALIDNAME, /* invalid boot env name */
- BE_ERR_EXISTS, /* boot env name already taken */
- BE_ERR_PERMS, /* insufficient permissions */
- BE_ERR_UNKNOWN, /* unknown error */
-} be_error_t;
-
-/*
- * TODO: this should be moved to a different file so as to hide the internals
- * from the interface
- */
-typedef struct libbe_handle {
- libzfs_handle_t *lzh;
- zfs_handle_t *be_root;
- zfs_handle_t *be_active;
- be_error_t error;
-} libbe_handle_t;
+typedef struct libbe_handle libbe_handle_t;
-/* Library handling functions */
+/* Library handling functions: be.c */
libbe_handle_t *libbe_init(void);
void libbe_close(libbe_handle_t *);
-/* Bootenv information functions */
+/* Bootenv information functions: be_info.c */
const char *be_get_active_name(libbe_handle_t *);
const char *be_get_active_path(libbe_handle_t *);
const char *be_get_root_path(libbe_handle_t *);
+nvlist_t *be_get_bootenv_props(libbe_handle_t *);
+
+/* Bootenv creation functions */
+int be_create(libbe_handle_t *, char *);
+int be_create_from_existing(libbe_handle_t *, char *, char *);
/* Bootenv manipulation functions */
+int be_rename(libbe_handle_t *, char *, char *);
+
+/* Bootenv removal functions */
+int be_destroy(libbe_handle_t *, char *, int);
+
+/* Bootenv mounting functions */
+int be_mount(libbe_handle_t *, char *, char *);
+int be_unmount(libbe_handle_t *, char *, int);
+/* Bootenv jail functions */
+int be_jail(libbe_handle_t *, char *);
-/* Error related functions */
+/* Error related functions: be_error.c */
int libbe_errno(libbe_handle_t *);
const char *libbe_error_description(libbe_handle_t *);
Modified: soc2017/kneitinger/libbe-head/lib/libbe/be_error.c
==============================================================================
--- soc2017/kneitinger/libbe-head/lib/libbe/be_error.c Sat Jul 1 11:18:48 2017 (r324146)
+++ soc2017/kneitinger/libbe-head/lib/libbe/be_error.c Sat Jul 1 12:02:53 2017 (r324147)
@@ -27,7 +27,7 @@
*/
#include "be.h"
-
+#include "be_impl.h"
/*
* Usage
Added: soc2017/kneitinger/libbe-head/lib/libbe/be_impl.h
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ soc2017/kneitinger/libbe-head/lib/libbe/be_impl.h Sat Jul 1 12:02:53 2017 (r324147)
@@ -0,0 +1,53 @@
+/*
+ * be_impl.h
+ *
+ * Copyright (c) 2017 Kyle J. Kneitinger <kyle at kneit.in>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _LIBBE_IMPL_H
+#define _LIBBE_IMPL_H
+
+#include <libzfs.h>
+
+typedef enum be_error {
+ BE_ERR_SUCCESS = 0, /* No error */
+ BE_ERR_INVALIDNAME, /* invalid boot env name */
+ BE_ERR_EXISTS, /* boot env name already taken */
+ BE_ERR_PERMS, /* insufficient permissions */
+ BE_ERR_UNKNOWN, /* unknown error */
+} be_error_t;
+
+struct libbe_handle {
+ libzfs_handle_t *lzh;
+ zfs_handle_t *be_root;
+ zfs_handle_t *be_active;
+ be_error_t error;
+ nvlist_t *list;
+};
+
+int prop_list_builder(libbe_handle_t *);
+void prop_list_free(libbe_handle_t *);
+
+#endif /* _LIBBE_IMPL_H */
Added: soc2017/kneitinger/libbe-head/lib/libbe/be_info.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ soc2017/kneitinger/libbe-head/lib/libbe/be_info.c Sat Jul 1 12:02:53 2017 (r324147)
@@ -0,0 +1,187 @@
+/*
+ * be_info.c
+ *
+ * Copyright (c) 2017 Kyle J. Kneitinger <kyle at kneit.in>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "be.h"
+#include "be_impl.h"
+
+static int prop_list_builder_cb(zfs_handle_t *, void *);
+
+/*
+ * Returns the name of the active boot environment
+ */
+const char *
+be_get_active_name(libbe_handle_t *lbh)
+{
+ const char *full_path = zfs_get_name(lbh->be_active);
+
+ return (strrchr(full_path, '/') + 1);
+}
+
+
+/*
+ * Returns full path of the active boot environment
+ */
+const char *
+be_get_active_path(libbe_handle_t *lbh)
+{
+ return (zfs_get_name(lbh->be_active));
+}
+
+
+/*
+ * Returns the path of the boot environment root dataset
+ */
+const char *
+be_get_root_path(libbe_handle_t *lbh)
+{
+ return (zfs_get_name(lbh->be_root));
+}
+
+
+/*
+ * Returns an nvlist of the bootenv's properties
+ * TODO: the nvlist should be passed as a param and ints should return status
+ */
+nvlist_t *
+be_get_bootenv_props(libbe_handle_t *lbh)
+{
+ return (lbh->list);
+}
+
+
+/*
+ * Internal callback function used by zfs_iter_filesystems. For each dataset in
+ * the bootenv root, populate an nvlist_t of its relevant properties.
+ * TODO: should any other properties be included?
+ */
+static int
+prop_list_builder_cb(zfs_handle_t *zfs_hdl, void *data)
+{
+ boolean_t mounted, active, nextboot;
+ /* TODO: what type for size? Number bytes as int or long? */
+
+ char buf[512];
+
+ nvlist_t *props;
+
+ libbe_handle_t *lbh = (libbe_handle_t *)data;
+
+
+ nvlist_alloc(&props, NV_UNIQUE_NAME, KM_SLEEP);
+
+ const char *dataset = zfs_get_name(zfs_hdl);
+ nvlist_add_string(props, "dataset", dataset);
+
+ const char *name = strrchr(dataset, '/') + 1;
+ nvlist_add_string(props, "name", name);
+
+
+ mounted = zfs_prop_get_int(zfs_hdl, ZFS_PROP_MOUNTED);
+ nvlist_add_boolean_value(props, "mounted", mounted);
+
+ if (mounted) {
+ zfs_prop_get(zfs_hdl, ZFS_PROP_MOUNTPOINT, buf, 512,
+ NULL, NULL, 0, 1);
+ nvlist_add_string(props, "mountpoint", buf);
+ }
+
+ if ((zfs_prop_get(zfs_hdl, ZFS_PROP_ORIGIN, buf, 512,
+ NULL, NULL, 0, 1)) == 0) {
+ nvlist_add_string(props, "origin", buf);
+ }
+
+ if ((zfs_prop_get(zfs_hdl, ZFS_PROP_CREATION, buf, 512,
+ NULL, NULL, 0, 1)) == 0) {
+ nvlist_add_string(props, "creation", buf);
+ }
+
+ nvlist_add_boolean_value(props, "active",
+ (strcmp(be_get_active_path(lbh), dataset) == 0));
+
+ if ((zfs_prop_get(zfs_hdl, ZFS_PROP_USED, buf, 512,
+ NULL, NULL, 0, 1)) == 0) {
+ nvlist_add_string(props, "used", buf);
+ }
+
+ if ((zfs_prop_get(zfs_hdl, ZFS_PROP_USEDDS, buf, 512,
+ NULL, NULL, 0, 1)) == 0) {
+ nvlist_add_string(props, "usedds", buf);
+ }
+
+ if ((zfs_prop_get(zfs_hdl, ZFS_PROP_USEDSNAP, buf, 512,
+ NULL, NULL, 0, 1)) == 0) {
+ nvlist_add_string(props, "usedsnap", buf);
+ }
+
+ if ((zfs_prop_get(zfs_hdl, ZFS_PROP_USEDREFRESERV, buf, 512,
+ NULL, NULL, 0, 1)) == 0) {
+ nvlist_add_string(props, "usedrefreserv", buf);
+ }
+
+ if ((zfs_prop_get(zfs_hdl, ZFS_PROP_REFERENCED, buf, 512,
+ NULL, NULL, 0, 1)) == 0) {
+ nvlist_add_string(props, "referenced", buf);
+ }
+
+ /* TODO figure out how to read nextboot (set in libzfs_pool.c) */
+
+ nvlist_add_nvlist(lbh->list, name, props);
+
+ return (0);
+}
+
+
+/*
+ * Updates the properties of each bootenv in the libbe handle
+ * TODO: rename to be_proplist_update
+ */
+int
+prop_list_builder(libbe_handle_t *lbh)
+{
+ if (lbh->list != NULL) {
+ /* TODO: should actually call prop_list_free */
+ nvlist_free(lbh->list);
+ return (1);
+ }
+
+ if (nvlist_alloc(&lbh->list, NV_UNIQUE_NAME, KM_SLEEP) != 0) {
+ /* TODO: actually handle error */
+ return (1);
+ }
+
+ zfs_iter_filesystems(lbh->be_root, prop_list_builder_cb, lbh);
+
+ return (0);
+}
+
+
+void
+prop_list_free(libbe_handle_t *lbh)
+{
+ /* TODO */
+}
More information about the svn-soc-all
mailing list