socsvn commit: r323964 - in soc2017/kneitinger/libbe-head: lib/libbe sbin/be
kneitinger at FreeBSD.org
kneitinger at FreeBSD.org
Mon Jun 26 09:09:54 UTC 2017
Author: kneitinger
Date: Mon Jun 26 09:09:50 2017
New Revision: 323964
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=323964
Log:
Initial libbe commit
Added:
soc2017/kneitinger/libbe-head/lib/libbe/be_error.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/sbin/be/Makefile
soc2017/kneitinger/libbe-head/sbin/be/be.c
Modified: soc2017/kneitinger/libbe-head/lib/libbe/Makefile
==============================================================================
--- soc2017/kneitinger/libbe-head/lib/libbe/Makefile Mon Jun 26 05:56:49 2017 (r323963)
+++ soc2017/kneitinger/libbe-head/lib/libbe/Makefile Mon Jun 26 09:09:50 2017 (r323964)
@@ -28,7 +28,7 @@
LIB= be
SHLIB_MAJOR= 1
SHLIB_MINOR= 0
-SRCS= be.c
+SRCS= be.c be_error.c
INCS= be.h
MAN= libbe.3
@@ -46,6 +46,7 @@
CFLAGS+= -I${SRCTOP}/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
CFLAGS+= -I${SRCTOP}/sys/cddl/contrib/opensolaris/uts/common
CFLAGS+= -I${SRCTOP}/cddl/contrib/opensolaris/head
+LDFLAGS+= -v
CFLAGS+= -DNEED_SOLARIS_BOOLEAN
Modified: soc2017/kneitinger/libbe-head/lib/libbe/be.c
==============================================================================
--- soc2017/kneitinger/libbe-head/lib/libbe/be.c Mon Jun 26 05:56:49 2017 (r323963)
+++ soc2017/kneitinger/libbe-head/lib/libbe/be.c Mon Jun 26 09:09:50 2017 (r323964)
@@ -26,4 +26,105 @@
* SUCH DAMAGE.
*/
+#include <errno.h>
+#include <kenv.h>
+#include <libgen.h>
+#include <stdio.h>
+#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);
+}
+
+
+/*
+ * Initializes the libbe context to operate in the root boot environment
+ * dataset, for example, zroot/ROOT.
+ */
+libbe_handle_t *
+libbe_init(void)
+{
+ libbe_handle_t *lbh;
+ char buf[MAX_PATHLEN];
+
+
+ if ((lbh = calloc(1, sizeof(libbe_handle_t))) == NULL) {
+ return (NULL);
+ }
+
+
+ if ((lbh->lzh = libzfs_init()) == NULL) {
+ free(lbh);
+ return (NULL);
+ }
+
+ libzfs_print_on_error(lbh->lzh, 1);
+
+
+ /* Obtain path to active boot environment */
+ if ((kenv(KENV_GET, "zfs_be_active", buf, MAX_PATHLEN)) == -1) {
+ libzfs_fini(lbh->lzh);
+ free(lbh);
+ return (NULL);
+ }
+
+ /* Remove leading 'zfs:' if present, otherwise use value as-is */
+ char *path = strrchr(buf, ':');
+ path = path ? path + 1 : buf;
+
+ if ((lbh->be_active = zfs_open(lbh->lzh, path,
+ ZFS_TYPE_DATASET)) == NULL) {
+ libzfs_fini(lbh->lzh);
+ free(lbh);
+ return (NULL);
+ }
+
+
+ /* Obtain path to boot environment root */
+ if ((kenv(KENV_GET, "zfs_be_root", buf, MAX_PATHLEN)) == -1) {
+ zfs_close(lbh->be_active);
+ libzfs_fini(lbh->lzh);
+ free(lbh);
+ return (NULL);
+ }
+
+ if ((lbh->be_root =
+ zfs_open(lbh->lzh, buf, ZFS_TYPE_DATASET)) == NULL) {
+ zfs_close(lbh->be_active);
+ libzfs_fini(lbh->lzh);
+ free(lbh);
+ return (NULL);
+ }
+
+
+ /* 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);
+
+ return (lbh);
+}
+
+
+/*
+ * Free memory allocated by libbe_init()
+ */
+void
+libbe_close(libbe_handle_t *lbh)
+{
+ zfs_close(lbh->be_active);
+ zfs_close(lbh->be_root);
+ libzfs_fini(lbh->lzh);
+ free(lbh);
+}
Modified: soc2017/kneitinger/libbe-head/lib/libbe/be.h
==============================================================================
--- soc2017/kneitinger/libbe-head/lib/libbe/be.h Mon Jun 26 05:56:49 2017 (r323963)
+++ soc2017/kneitinger/libbe-head/lib/libbe/be.h Mon Jun 26 09:09:50 2017 (r323964)
@@ -26,4 +26,39 @@
* SUCH DAMAGE.
*/
+#ifndef _LIBBE_H
+#define _LIBBE_H
+
#include <libzfs.h>
+
+#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;
+
+/* Library handling functions */
+libbe_handle_t *libbe_init(void);
+void libbe_close(libbe_handle_t *);
+
+
+/* Error related functions */
+int libbe_errno(libbe_handle_t *);
+const char *libbe_error_description(libbe_handle_t *);
+
+#endif /* _LIBBE_H */
Added: soc2017/kneitinger/libbe-head/lib/libbe/be_error.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ soc2017/kneitinger/libbe-head/lib/libbe/be_error.c Mon Jun 26 09:09:50 2017 (r323964)
@@ -0,0 +1,62 @@
+/*
+ * be_error.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"
+
+
+/*
+ * Usage
+ */
+int
+libbe_errno(libbe_handle_t *lbh)
+{
+ return (lbh->error);
+}
+
+
+const char *
+libbe_error_description(libbe_handle_t *lbh)
+{
+ switch (lbh->error) {
+ case BE_ERR_INVALIDNAME:
+ return ("invalid boot env name");
+
+ case BE_ERR_EXISTS:
+ return ("boot env name already taken");
+
+ case BE_ERR_PERMS:
+ return ("insufficient permissions");
+
+ case BE_ERR_UNKNOWN:
+ return ("unknown error");
+
+ default:
+ assert(lbh->error == BE_ERR_SUCCESS);
+ return ("no error");
+ }
+}
Modified: soc2017/kneitinger/libbe-head/sbin/be/Makefile
==============================================================================
--- soc2017/kneitinger/libbe-head/sbin/be/Makefile Mon Jun 26 05:56:49 2017 (r323963)
+++ soc2017/kneitinger/libbe-head/sbin/be/Makefile Mon Jun 26 09:09:50 2017 (r323964)
@@ -6,6 +6,8 @@
LIBADD+= be
+CFLAGS+= -I${SRCTOP}/lib/libbe
+
CFLAGS+= -I${SRCTOP}/cddl/compat/opensolaris/include
CFLAGS+= -I${SRCTOP}/cddl/compat/opensolaris/lib/libumem
CFLAGS+= -I${SRCTOP}/cddl/contrib/opensolaris/lib/libzfs/common
Modified: soc2017/kneitinger/libbe-head/sbin/be/be.c
==============================================================================
--- soc2017/kneitinger/libbe-head/sbin/be/be.c Mon Jun 26 05:56:49 2017 (r323963)
+++ soc2017/kneitinger/libbe-head/sbin/be/be.c Mon Jun 26 09:09:50 2017 (r323964)
@@ -45,6 +45,7 @@
static int be_unjail(int argc, char *argv[]);
static int be_unmount(int argc, char *argv[]);
+libbe_handle_t *libbe;
static int
usage(bool explicit)
@@ -369,6 +370,7 @@
{
int opt;
char *cmd, *target;
+ bool force;
/* Store alias used */
cmd = argv[0];
@@ -472,5 +474,14 @@
exit(usage(false));
}
- return (command_map[command_index].fn(argc-1, argv+1));
+ libbe = libbe_init();
+
+ int rc = command_map[command_index].fn(argc-1, argv+1);
+
+ fprintf(stdout, "libbe error description: %s\n",
+ libbe_error_description(libbe));
+
+ libbe_close(libbe);
+
+ return (rc);
}
More information about the svn-soc-all
mailing list