mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-08-04 18:00:55 +00:00
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:
parent
df4ab92e81
commit
143c49b0d2
@ -23,6 +23,24 @@
|
|||||||
#define ACRNCTL_OPT_ROOT "/opt/acrn/conf"
|
#define ACRNCTL_OPT_ROOT "/opt/acrn/conf"
|
||||||
#define MAX_NAME_LEN (128)
|
#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 */
|
/* helper functions */
|
||||||
static int shell_cmd(const char *cmd, char *outbuf, int len)
|
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))
|
if (msg->len < sizeof(*msg))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
switch(msg->msgid) {
|
switch (msg->msgid) {
|
||||||
case MSG_STR:
|
case MSG_STR:
|
||||||
printf("%s\n", msg->payload);
|
printf("%s\n", msg->payload);
|
||||||
break;
|
break;
|
||||||
@ -168,24 +186,11 @@ static void vmm_update(void)
|
|||||||
|
|
||||||
/* There are acrnctl cmds */
|
/* There are acrnctl cmds */
|
||||||
/* command: list */
|
/* 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[])
|
static int acrnctl_do_list(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
struct vmm_struct *s;
|
struct vmm_struct *s;
|
||||||
int find = 0;
|
int find = 0;
|
||||||
|
|
||||||
if (argc == 2)
|
|
||||||
if (!strcmp("help", argv[1])) {
|
|
||||||
acrnctl_list_help();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
vmm_update();
|
vmm_update();
|
||||||
LIST_FOREACH(s, &vmm_head, list) {
|
LIST_FOREACH(s, &vmm_head, list) {
|
||||||
printf("%s\t\t%s\n", s->name, state_str[s->state]);
|
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;
|
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)
|
static int check_name(const char *name)
|
||||||
{
|
{
|
||||||
int i = 0, j = 0;
|
int i = 0, j = 0;
|
||||||
@ -299,16 +297,6 @@ static int acrnctl_do_add(int argc, char *argv[])
|
|||||||
char vmname[128];
|
char vmname[128];
|
||||||
size_t len = sizeof(cmd_out);
|
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) {
|
if (strlen(argv[1]) >= FILE_NAME_LENGTH) {
|
||||||
printf("file name too long: %s\n", argv[1]);
|
printf("file name too long: %s\n", argv[1]);
|
||||||
return -1;
|
return -1;
|
||||||
@ -400,7 +388,8 @@ static int acrnctl_do_add(int argc, char *argv[])
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto get_vmname;
|
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));
|
ret = shell_cmd(cmd, cmd_out, sizeof(cmd_out));
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto get_vmname;
|
goto get_vmname;
|
||||||
@ -474,12 +463,6 @@ static int acrnctl_do_add(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* command: stop */
|
/* 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)
|
static int send_stop_msg(char *vmname)
|
||||||
{
|
{
|
||||||
int fd, ret;
|
int fd, ret;
|
||||||
@ -533,7 +516,7 @@ static int send_stop_msg(char *vmname)
|
|||||||
memset(buf, 0, sizeof(buf));
|
memset(buf, 0, sizeof(buf));
|
||||||
ret = read(fd, buf, sizeof(buf));
|
ret = read(fd, buf, sizeof(buf));
|
||||||
if (ret <= sizeof(buf))
|
if (ret <= sizeof(buf))
|
||||||
process_msg((void*)&buf);
|
process_msg((void *)&buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
cant_write:
|
cant_write:
|
||||||
@ -548,16 +531,6 @@ static int acrnctl_do_stop(int argc, char *argv[])
|
|||||||
struct vmm_struct *s;
|
struct vmm_struct *s;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (argc < 2) {
|
|
||||||
acrnctl_stop_help();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!strcmp("help", argv[1])) {
|
|
||||||
acrnctl_stop_help();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
vmm_update();
|
vmm_update();
|
||||||
for (i = 1; i < argc; i++) {
|
for (i = 1; i < argc; i++) {
|
||||||
s = vmm_find(argv[i]);
|
s = vmm_find(argv[i]);
|
||||||
@ -577,29 +550,12 @@ static int acrnctl_do_stop(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* command: delete */
|
/* 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[])
|
static int acrnctl_do_del(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
struct vmm_struct *s;
|
struct vmm_struct *s;
|
||||||
int i;
|
int i;
|
||||||
char cmd[128];
|
char cmd[128];
|
||||||
|
|
||||||
if (argc < 2) {
|
|
||||||
acrnctl_del_help();
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!strcmp("help", argv[1])) {
|
|
||||||
acrnctl_del_help();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
vmm_update();
|
vmm_update();
|
||||||
for (i = 1; i < argc; i++) {
|
for (i = 1; i < argc; i++) {
|
||||||
s = vmm_find(argv[i]);
|
s = vmm_find(argv[i]);
|
||||||
@ -623,29 +579,11 @@ static int acrnctl_do_del(int argc, char *argv[])
|
|||||||
return 0;
|
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[])
|
static int acrnctl_do_start(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
struct vmm_struct *s;
|
struct vmm_struct *s;
|
||||||
char cmd[128];
|
char cmd[128];
|
||||||
|
|
||||||
if (argc != 2) {
|
|
||||||
acrnctl_start_help();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!strcmp("help", argv[1])) {
|
|
||||||
acrnctl_start_help();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
vmm_update();
|
vmm_update();
|
||||||
s = vmm_find(argv[1]);
|
s = vmm_find(argv[1]);
|
||||||
if (!s) {
|
if (!s) {
|
||||||
@ -666,38 +604,79 @@ static int acrnctl_do_start(int argc, char *argv[])
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ACMD(CMD,FUNC) \
|
/* Default args validation function */
|
||||||
{.cmd = CMD, .func = FUNC,}
|
int df_valid_args(struct acrnctl_cmd *cmd, int argc, char *argv[])
|
||||||
|
{
|
||||||
|
char df_opt[32] = "VM_NAME VM_NAME ...";
|
||||||
|
|
||||||
struct acrnctl_cmd {
|
if (argc < 2 || !strcmp(argv[1], "help")) {
|
||||||
const char *cmd;
|
printf("acrnctl %s %s\n", cmd->cmd, df_opt);
|
||||||
int (*func) (int argc, char *argv[]);
|
return -1;
|
||||||
} acmds[] = {
|
}
|
||||||
ACMD("list", acrnctl_do_list),
|
|
||||||
ACMD("start", acrnctl_do_start),
|
return 0;
|
||||||
ACMD("stop", acrnctl_do_stop),
|
}
|
||||||
ACMD("del", acrnctl_do_del),
|
|
||||||
ACMD("add", acrnctl_do_add),
|
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))
|
#define NCMD (sizeof(acmds)/sizeof(struct acrnctl_cmd))
|
||||||
|
|
||||||
static void help_info(void)
|
static void usage(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
printf("support:\n");
|
printf("\nUsage: acrnctl SUB-CMD "
|
||||||
|
"{ VM_NAME | SCRIPTS OPTIONS | help }\n\n");
|
||||||
for (i = 0; i < NCMD; i++)
|
for (i = 0; i < NCMD; i++)
|
||||||
printf("\t%s\n", acmds[i].cmd);
|
printf("\t%-12s%s\n", acmds[i].cmd, acmds[i].desc);
|
||||||
printf("Use acrnctl [cmd] help for details\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (argc == 1) {
|
if (argc == 1 || !strcmp(argv[1], "help")) {
|
||||||
help_info();
|
usage();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -710,12 +689,17 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < NCMD; i++)
|
for (i = 0; i < NCMD; i++)
|
||||||
if (!strcmp(argv[1], acmds[i].cmd))
|
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]);
|
return acmds[i].func(argc - 1, &argv[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Reach here means unsupported command */
|
/* Reach here means unsupported command */
|
||||||
printf("Unknown command: %s\n", argv[1]);
|
printf("Unknown command: %s\n", argv[1]);
|
||||||
help_info();
|
usage();
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user