tools: acrnctl: Refactor help info

Add unified function .valid_args to check validation of args.

Signed-off-by: Kaige Fu <kaige.fu@intel.com>
Reviewed-by: Geoffroy Van Cutsem <geoffroy.vancutsem@intel.com>
Reviewed-by: Yan, Like <like.yan@intel.com>
Acked-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
Kaige Fu 2018-05-30 15:40:30 +08:00 committed by lijinxia
parent df4ab92e81
commit 143c49b0d2

View File

@ -23,6 +23,24 @@
#define ACRNCTL_OPT_ROOT "/opt/acrn/conf"
#define MAX_NAME_LEN (128)
#define ACMD(CMD,FUNC,DESC, VALID_ARGS) \
{.cmd = CMD, .func = FUNC, .desc = DESC, .valid_args = VALID_ARGS}
/* vm life cycle cmd description */
#define LIST_DESC "List all the virtual machines added"
#define START_DESC "Start virtual machine VM_NAME"
#define STOP_DESC "Stop virtual machine VM_NAME"
#define DEL_DESC "Delete virtual machine VM_NAME"
#define ADD_DESC "Add one virtual machine with SCRIPTS and OPTIONS"
struct acrnctl_cmd {
const char *cmd;
const char desc[128]; /* Description of the cmd */
int (*func) (int argc, char *argv[]);
/* Callback function to check whether args is valid */
int (*valid_args) (struct acrnctl_cmd * cmd, int argc, char *argv[]);
};
/* helper functions */
static int shell_cmd(const char *cmd, char *outbuf, int len)
{
@ -51,7 +69,7 @@ static void process_msg(struct mngr_msg *msg)
if (msg->len < sizeof(*msg))
return;
switch(msg->msgid) {
switch (msg->msgid) {
case MSG_STR:
printf("%s\n", msg->payload);
break;
@ -109,8 +127,8 @@ static struct vmm_struct *vmm_find(char *name)
struct vmm_struct *s;
LIST_FOREACH(s, &vmm_head, list)
if (!strcmp(name, s->name))
return s;
if (!strcmp(name, s->name))
return s;
return NULL;
}
@ -168,24 +186,11 @@ static void vmm_update(void)
/* There are acrnctl cmds */
/* command: list */
static void acrnctl_list_help(void)
{
printf("acrnctl list\n"
"\tlist all VMs, shown in %s or %s\n",
ACRNCTL_OPT_ROOT, ACRN_DM_SOCK_ROOT);
}
static int acrnctl_do_list(int argc, char *argv[])
{
struct vmm_struct *s;
int find = 0;
if (argc == 2)
if (!strcmp("help", argv[1])) {
acrnctl_list_help();
return 0;
}
vmm_update();
LIST_FOREACH(s, &vmm_head, list) {
printf("%s\t\t%s\n", s->name, state_str[s->state]);
@ -198,13 +203,6 @@ static int acrnctl_do_list(int argc, char *argv[])
return 0;
}
/* command: add */
static void acrnctl_add_help(void)
{
printf("acrnctl add [uos_bash_script]\n"
"\trequires an uos script file\n");
}
static int check_name(const char *name)
{
int i = 0, j = 0;
@ -299,16 +297,6 @@ static int acrnctl_do_add(int argc, char *argv[])
char vmname[128];
size_t len = sizeof(cmd_out);
if (argc < 2) {
acrnctl_add_help();
return -1;
}
if (!strcmp("help", argv[1])) {
acrnctl_add_help();
return 0;
}
if (strlen(argv[1]) >= FILE_NAME_LENGTH) {
printf("file name too long: %s\n", argv[1]);
return -1;
@ -400,7 +388,8 @@ static int acrnctl_do_add(int argc, char *argv[])
if (ret < 0)
goto get_vmname;
snprintf(cmd, sizeof(cmd), "grep -a \"acrnctl: \" ./%s.result", argv[1]);
snprintf(cmd, sizeof(cmd), "grep -a \"acrnctl: \" ./%s.result",
argv[1]);
ret = shell_cmd(cmd, cmd_out, sizeof(cmd_out));
if (ret < 0)
goto get_vmname;
@ -474,12 +463,6 @@ static int acrnctl_do_add(int argc, char *argv[])
}
/* command: stop */
static void acrnctl_stop_help(void)
{
printf("acrnctl stop [vmname0] [vmname1] ...\n"
"\t run \"acrnctl list\" to get running VMs\n");
}
static int send_stop_msg(char *vmname)
{
int fd, ret;
@ -533,7 +516,7 @@ static int send_stop_msg(char *vmname)
memset(buf, 0, sizeof(buf));
ret = read(fd, buf, sizeof(buf));
if (ret <= sizeof(buf))
process_msg((void*)&buf);
process_msg((void *)&buf);
}
cant_write:
@ -548,16 +531,6 @@ static int acrnctl_do_stop(int argc, char *argv[])
struct vmm_struct *s;
int i;
if (argc < 2) {
acrnctl_stop_help();
return -1;
}
if (!strcmp("help", argv[1])) {
acrnctl_stop_help();
return 0;
}
vmm_update();
for (i = 1; i < argc; i++) {
s = vmm_find(argv[i]);
@ -577,29 +550,12 @@ static int acrnctl_do_stop(int argc, char *argv[])
}
/* command: delete */
static void acrnctl_del_help(void)
{
printf("acrnctl del [vmname0] [vmname1] ...\n"
"\t run \"acrnctl list\" get VM names\n");
}
static int acrnctl_do_del(int argc, char *argv[])
{
struct vmm_struct *s;
int i;
char cmd[128];
if (argc < 2) {
acrnctl_del_help();
return -1;
}
if (!strcmp("help", argv[1])) {
acrnctl_del_help();
return 0;
}
vmm_update();
for (i = 1; i < argc; i++) {
s = vmm_find(argv[i]);
@ -623,29 +579,11 @@ static int acrnctl_do_del(int argc, char *argv[])
return 0;
}
/* command: start */
static void acrnctl_start_help(void)
{
printf("acrnctl start [vmname]\n"
"\t run \"acrnctl list\" get VM names\n"
"\t each time user can only start one VM\n");
}
static int acrnctl_do_start(int argc, char *argv[])
{
struct vmm_struct *s;
char cmd[128];
if (argc != 2) {
acrnctl_start_help();
return -1;
}
if (!strcmp("help", argv[1])) {
acrnctl_start_help();
return 0;
}
vmm_update();
s = vmm_find(argv[1]);
if (!s) {
@ -666,38 +604,79 @@ static int acrnctl_do_start(int argc, char *argv[])
return 0;
}
#define ACMD(CMD,FUNC) \
{.cmd = CMD, .func = FUNC,}
/* Default args validation function */
int df_valid_args(struct acrnctl_cmd *cmd, int argc, char *argv[])
{
char df_opt[32] = "VM_NAME VM_NAME ...";
struct acrnctl_cmd {
const char *cmd;
int (*func) (int argc, char *argv[]);
} acmds[] = {
ACMD("list", acrnctl_do_list),
ACMD("start", acrnctl_do_start),
ACMD("stop", acrnctl_do_stop),
ACMD("del", acrnctl_do_del),
ACMD("add", acrnctl_do_add),
if (argc < 2 || !strcmp(argv[1], "help")) {
printf("acrnctl %s %s\n", cmd->cmd, df_opt);
return -1;
}
return 0;
}
static int valid_add_args(struct acrnctl_cmd *cmd, int argc, char *argv[])
{
char df_opt[32] = "launch_scripts options";
if (argc < 2 || !strcmp(argv[1], "help")) {
printf("acrnctl %s %s\n", cmd->cmd, df_opt);
return -1;
}
return 0;
}
static int valid_start_args(struct acrnctl_cmd *cmd, int argc, char *argv[])
{
char df_opt[16] = "VM_NAME";
if (argc != 2 || ((argv + 1) && !strcmp(argv[1], "help"))) {
printf("acrnctl %s %s\n", cmd->cmd, df_opt);
return -1;
}
return 0;
}
static int valid_list_args(struct acrnctl_cmd *cmd, int argc, char *argv[])
{
if (argc != 1) {
printf("acrnctl %s\n", cmd->cmd);
return -1;
}
return 0;
}
struct acrnctl_cmd acmds[] = {
ACMD("list", acrnctl_do_list, LIST_DESC, valid_list_args),
ACMD("start", acrnctl_do_start, START_DESC, valid_start_args),
ACMD("stop", acrnctl_do_stop, STOP_DESC, df_valid_args),
ACMD("del", acrnctl_do_del, DEL_DESC, df_valid_args),
ACMD("add", acrnctl_do_add, ADD_DESC, valid_add_args),
};
#define NCMD (sizeof(acmds)/sizeof(struct acrnctl_cmd))
static void help_info(void)
static void usage(void)
{
int i;
printf("support:\n");
printf("\nUsage: acrnctl SUB-CMD "
"{ VM_NAME | SCRIPTS OPTIONS | help }\n\n");
for (i = 0; i < NCMD; i++)
printf("\t%s\n", acmds[i].cmd);
printf("Use acrnctl [cmd] help for details\n");
printf("\t%-12s%s\n", acmds[i].cmd, acmds[i].desc);
}
int main(int argc, char *argv[])
{
int i;
if (argc == 1) {
help_info();
if (argc == 1 || !strcmp(argv[1], "help")) {
usage();
return 0;
}
@ -710,12 +689,17 @@ int main(int argc, char *argv[])
}
for (i = 0; i < NCMD; i++)
if (!strcmp(argv[1], acmds[i].cmd))
return acmds[i].func(argc - 1, &argv[1]);
if (!strcmp(argv[1], acmds[i].cmd)) {
if (acmds[i].valid_args(&acmds[i], argc - 1, &argv[1])) {
return -1;
} else {
return acmds[i].func(argc - 1, &argv[1]);
}
}
/* Reach here means unsupported command */
printf("Unknown command: %s\n", argv[1]);
help_info();
usage();
return -1;
}