blob: bd333b2927436a45875956b1348b1e94e3b4970b [file] [log] [blame]
/*
* Copyright(c) 2015-2017 Intel Corporation. All rights reserved.
* Copyright(c) 2005 Andreas Ericsson. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*/
/* originally copied from perf and git */
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <ndctl/builtin.h>
#include <ndctl/libndctl.h>
#include <ccan/array_size/array_size.h>
#include <util/parse-options.h>
#include <util/strbuf.h>
#include <util/util.h>
#include <util/main.h>
static const char ndctl_usage_string[] = "ndctl [--version] [--help] COMMAND [ARGS]";
static const char ndctl_more_info_string[] =
"See 'ndctl help COMMAND' for more information on a specific command.\n"
" ndctl --list-cmds to see all available commands";
static int cmd_version(int argc, const char **argv, struct ndctl_ctx *ctx)
{
printf("%s\n", VERSION);
return 0;
}
static int cmd_help(int argc, const char **argv, struct ndctl_ctx *ctx)
{
const char * const builtin_help_subcommands[] = {
"enable-region", "disable-region", "zero-labels",
"enable-namespace", "disable-namespace", NULL };
struct option builtin_help_options[] = {
OPT_END(),
};
const char *builtin_help_usage[] = {
"ndctl help [command]",
NULL
};
argc = parse_options_subcommand(argc, argv, builtin_help_options,
builtin_help_subcommands, builtin_help_usage, 0);
if (!argv[0]) {
printf("\n usage: %s\n\n", ndctl_usage_string);
printf("\n %s\n\n", ndctl_more_info_string);
return 0;
}
return help_show_man_page(argv[0], "ndctl", "NDCTL_MAN_VIEWER");
}
static struct cmd_struct commands[] = {
{ "version", { cmd_version } },
{ "create-nfit", { cmd_create_nfit } },
{ "enable-namespace", { cmd_enable_namespace } },
{ "disable-namespace", { cmd_disable_namespace } },
{ "create-namespace", { cmd_create_namespace } },
{ "destroy-namespace", { cmd_destroy_namespace } },
{ "check-namespace", { cmd_check_namespace } },
{ "enable-region", { cmd_enable_region } },
{ "disable-region", { cmd_disable_region } },
{ "enable-dimm", { cmd_enable_dimm } },
{ "disable-dimm", { cmd_disable_dimm } },
{ "zero-labels", { cmd_zero_labels } },
{ "read-labels", { cmd_read_labels } },
{ "write-labels", { cmd_write_labels } },
{ "init-labels", { cmd_init_labels } },
{ "check-labels", { cmd_check_labels } },
{ "inject-error", { cmd_inject_error } },
{ "update-firmware", { cmd_update_firmware } },
{ "inject-smart", { cmd_inject_smart } },
{ "wait-scrub", { cmd_wait_scrub } },
{ "start-scrub", { cmd_start_scrub } },
{ "setup-passphrase", { cmd_setup_passphrase } },
{ "update-passphrase", { cmd_update_passphrase } },
{ "remove-passphrase", { cmd_remove_passphrase } },
{ "freeze-security", { cmd_freeze_security } },
{ "sanitize-dimm", { cmd_sanitize_dimm } },
#ifdef ENABLE_KEYUTILS
{ "load-keys", { cmd_load_keys } },
#endif
{ "wait-overwrite", { cmd_wait_overwrite } },
{ "list", { cmd_list } },
{ "monitor", { cmd_monitor } },
{ "help", { cmd_help } },
#ifdef ENABLE_TEST
{ "test", { cmd_test } },
#endif
#ifdef ENABLE_DESTRUCTIVE
{ "bat", { cmd_bat } },
#endif
};
int main(int argc, const char **argv)
{
struct ndctl_ctx *ctx;
int rc;
/* Look for flags.. */
argv++;
argc--;
main_handle_options(&argv, &argc, ndctl_usage_string, commands,
ARRAY_SIZE(commands));
if (argc > 0) {
if (!prefixcmp(argv[0], "--"))
argv[0] += 2;
} else {
/* The user didn't specify a command; give them help */
printf("\n usage: %s\n\n", ndctl_usage_string);
printf("\n %s\n\n", ndctl_more_info_string);
goto out;
}
rc = ndctl_new(&ctx);
if (rc)
goto out;
main_handle_internal_command(argc, argv, ctx, commands,
ARRAY_SIZE(commands), PROG_NDCTL);
ndctl_unref(ctx);
fprintf(stderr, "Unknown command: '%s'\n", argv[0]);
out:
return 1;
}