10a936c54SPrasad Joshi #include <stdio.h>
20a936c54SPrasad Joshi #include <string.h>
30a936c54SPrasad Joshi #include <errno.h>
40a936c54SPrasad Joshi
50a936c54SPrasad Joshi /* user defined header files */
62a24f96dSSasha Levin #include "kvm/builtin-debug.h"
72a24f96dSSasha Levin #include "kvm/builtin-pause.h"
802317b74SSasha Levin #include "kvm/builtin-resume.h"
92a24f96dSSasha Levin #include "kvm/builtin-balloon.h"
102a24f96dSSasha Levin #include "kvm/builtin-list.h"
112a24f96dSSasha Levin #include "kvm/builtin-version.h"
12282113fdSPekka Enberg #include "kvm/builtin-setup.h"
13daf4cb5aSSasha Levin #include "kvm/builtin-stop.h"
14bc10d2c1SSasha Levin #include "kvm/builtin-stat.h"
152a24f96dSSasha Levin #include "kvm/builtin-help.h"
163c29e2aaSSasha Levin #include "kvm/builtin-sandbox.h"
17ca379b83SPekka Enberg #include "kvm/kvm-cmd.h"
182a24f96dSSasha Levin #include "kvm/builtin-run.h"
19e81c0199SLiming Wang #include "kvm/util.h"
20f6677a1dSAmerigo Wang
21f6677a1dSAmerigo Wang struct cmd_struct kvm_commands[] = {
220725673aSSasha Levin { "pause", kvm_cmd_pause, kvm_pause_help, 0 },
230725673aSSasha Levin { "resume", kvm_cmd_resume, kvm_resume_help, 0 },
240725673aSSasha Levin { "debug", kvm_cmd_debug, kvm_debug_help, 0 },
250725673aSSasha Levin { "balloon", kvm_cmd_balloon, kvm_balloon_help, 0 },
260725673aSSasha Levin { "list", kvm_cmd_list, kvm_list_help, 0 },
2716b2bb87SSasha Levin { "version", kvm_cmd_version, NULL, 0 },
289abc695dSSasha Levin { "--version", kvm_cmd_version, NULL, 0 },
290725673aSSasha Levin { "stop", kvm_cmd_stop, kvm_stop_help, 0 },
30bc10d2c1SSasha Levin { "stat", kvm_cmd_stat, kvm_stat_help, 0 },
31f6677a1dSAmerigo Wang { "help", kvm_cmd_help, NULL, 0 },
32282113fdSPekka Enberg { "setup", kvm_cmd_setup, kvm_setup_help, 0 },
33f6677a1dSAmerigo Wang { "run", kvm_cmd_run, kvm_run_help, 0 },
343c29e2aaSSasha Levin { "sandbox", kvm_cmd_sandbox, kvm_run_help, 0 },
35f6677a1dSAmerigo Wang { NULL, NULL, NULL, 0 },
36f6677a1dSAmerigo Wang };
370a936c54SPrasad Joshi
380ea58e5bSPekka Enberg /*
390ea58e5bSPekka Enberg * kvm_get_command: Searches the command in an array of the commands and
400ea58e5bSPekka Enberg * returns a pointer to cmd_struct if a match is found.
410ea58e5bSPekka Enberg *
420ea58e5bSPekka Enberg * Input parameters:
430ea58e5bSPekka Enberg * command: Array of possible commands. The last entry in the array must be
440ea58e5bSPekka Enberg * NULL.
450ea58e5bSPekka Enberg * cmd: A string command to search in the array
460ea58e5bSPekka Enberg *
470ea58e5bSPekka Enberg * Return Value:
480ea58e5bSPekka Enberg * NULL: If the cmd is not matched with any of the command in the command array
490ea58e5bSPekka Enberg * p: Pointer to cmd_struct of the matching command
500a936c54SPrasad Joshi */
kvm_get_command(struct cmd_struct * command,const char * cmd)51f6677a1dSAmerigo Wang struct cmd_struct *kvm_get_command(struct cmd_struct *command,
520a936c54SPrasad Joshi const char *cmd)
530a936c54SPrasad Joshi {
540a936c54SPrasad Joshi struct cmd_struct *p = command;
550a936c54SPrasad Joshi
560a936c54SPrasad Joshi while (p->cmd) {
570a936c54SPrasad Joshi if (!strcmp(p->cmd, cmd))
580a936c54SPrasad Joshi return p;
590a936c54SPrasad Joshi p++;
600a936c54SPrasad Joshi }
610a936c54SPrasad Joshi return NULL;
620a936c54SPrasad Joshi }
630a936c54SPrasad Joshi
handle_command(struct cmd_struct * command,int argc,const char ** argv)640a936c54SPrasad Joshi int handle_command(struct cmd_struct *command, int argc, const char **argv)
650a936c54SPrasad Joshi {
660a936c54SPrasad Joshi struct cmd_struct *p;
670a936c54SPrasad Joshi const char *prefix = NULL;
68e81c0199SLiming Wang int ret = 0;
690a936c54SPrasad Joshi
700a936c54SPrasad Joshi if (!argv || !*argv) {
710a936c54SPrasad Joshi p = kvm_get_command(command, "help");
72*a2857479SCyrill Gorcunov BUG_ON(!p);
730a936c54SPrasad Joshi return p->fn(argc, argv, prefix);
740a936c54SPrasad Joshi }
750a936c54SPrasad Joshi
760a936c54SPrasad Joshi p = kvm_get_command(command, argv[0]);
770a936c54SPrasad Joshi if (!p) {
780a936c54SPrasad Joshi p = kvm_get_command(command, "help");
79*a2857479SCyrill Gorcunov BUG_ON(!p);
800a936c54SPrasad Joshi p->fn(0, NULL, prefix);
810a936c54SPrasad Joshi return EINVAL;
820a936c54SPrasad Joshi }
830a936c54SPrasad Joshi
84e81c0199SLiming Wang ret = p->fn(argc - 1, &argv[1], prefix);
85e81c0199SLiming Wang if (ret < 0) {
86e81c0199SLiming Wang if (errno == EPERM)
87e81c0199SLiming Wang die("Permission error - are you root?");
88e81c0199SLiming Wang }
89e81c0199SLiming Wang
90e81c0199SLiming Wang return ret;
910a936c54SPrasad Joshi }
92