Command-line Interface (CLI)#

The libxnvme_cli.h module provides functionality for creating command-line interfaces for xNVMe related applications. Most xNVMe examples, tools, and tests use this module to offer a coherent command-line interface, complete with bash completion scripts and man pages.

Usage Example#

Below is a brief example using excerpts from the source code of the xnvme CLI tool. Notice how the sub-command (sub_info) is implemented as a function, added to the g_subs array, integrated into the CLI setup in g_cli, and utilized when running the CLI with xnvme_cli_run().

Note

Setting the XNVME_CLI_INIT_DEV_OPEN option will automatically open a device handle.

#include <libxnvme.h>

static int
sub_info(struct xnvme_cli *cli)
{
	struct xnvme_dev *dev = cli->args.dev;
	int err;

	err = xnvme_dev_derive_geo(dev);
	if (err) {
		XNVME_DEBUG("FAILED: xnvme_dev_derive_geo(), err: %d", err);
		return err;
	}

	xnvme_dev_pr(dev, XNVME_PR_DEF);

	return 0;
}

	err = xnvme_controller_reset(dev);
	if (err || xnvme_cmd_ctx_cpl_status(&ctx)) {
		xnvme_cli_perr("xnvme_controller_reset()", err);
		return err;
		"list",
		"List devices on the system",
		"List devices on the system",
		sub_listing,
		{
			{XNVME_CLI_OPT_NON_POSA_TITLE, XNVME_CLI_SKIP},
			{XNVME_CLI_OPT_SYS_URI, XNVME_CLI_LOPT},
			{XNVME_CLI_OPT_FLAGS, XNVME_CLI_LOPT},

			XNVME_CLI_CORE_OPTS,
		},
	},

			XNVME_CLI_ADMIN_OPTS,
		},
	},
	{
		"show-regs",
		"Show controller-registers",
		"Show controller-registers",
		show_regs,
		{
			{XNVME_CLI_OPT_POSA_TITLE, XNVME_CLI_SKIP},
			{XNVME_CLI_OPT_URI, XNVME_CLI_POSA},

			XNVME_CLI_ADMIN_OPTS,
		},