10a936c54SPrasad Joshi #include <stdio.h> 20a936c54SPrasad Joshi #include <string.h> 30a936c54SPrasad Joshi #include <errno.h> 40a936c54SPrasad Joshi 50a936c54SPrasad Joshi #include <assert.h> 60a936c54SPrasad Joshi 70a936c54SPrasad Joshi /* user defined header files */ 82a24f96dSSasha Levin #include "kvm/builtin-debug.h" 92a24f96dSSasha Levin #include "kvm/builtin-pause.h" 1002317b74SSasha Levin #include "kvm/builtin-resume.h" 112a24f96dSSasha Levin #include "kvm/builtin-balloon.h" 122a24f96dSSasha Levin #include "kvm/builtin-list.h" 132a24f96dSSasha Levin #include "kvm/builtin-version.h" 14282113fdSPekka Enberg #include "kvm/builtin-setup.h" 15daf4cb5aSSasha Levin #include "kvm/builtin-stop.h" 16bc10d2c1SSasha Levin #include "kvm/builtin-stat.h" 172a24f96dSSasha Levin #include "kvm/builtin-help.h" 18*3c29e2aaSSasha Levin #include "kvm/builtin-sandbox.h" 19ca379b83SPekka Enberg #include "kvm/kvm-cmd.h" 202a24f96dSSasha Levin #include "kvm/builtin-run.h" 21e81c0199SLiming Wang #include "kvm/util.h" 22f6677a1dSAmerigo Wang 23f6677a1dSAmerigo Wang struct cmd_struct kvm_commands[] = { 240725673aSSasha Levin { "pause", kvm_cmd_pause, kvm_pause_help, 0 }, 250725673aSSasha Levin { "resume", kvm_cmd_resume, kvm_resume_help, 0 }, 260725673aSSasha Levin { "debug", kvm_cmd_debug, kvm_debug_help, 0 }, 270725673aSSasha Levin { "balloon", kvm_cmd_balloon, kvm_balloon_help, 0 }, 280725673aSSasha Levin { "list", kvm_cmd_list, kvm_list_help, 0 }, 2916b2bb87SSasha Levin { "version", kvm_cmd_version, NULL, 0 }, 309abc695dSSasha Levin { "--version", kvm_cmd_version, NULL, 0 }, 310725673aSSasha Levin { "stop", kvm_cmd_stop, kvm_stop_help, 0 }, 32bc10d2c1SSasha Levin { "stat", kvm_cmd_stat, kvm_stat_help, 0 }, 33f6677a1dSAmerigo Wang { "help", kvm_cmd_help, NULL, 0 }, 34282113fdSPekka Enberg { "setup", kvm_cmd_setup, kvm_setup_help, 0 }, 35f6677a1dSAmerigo Wang { "run", kvm_cmd_run, kvm_run_help, 0 }, 36*3c29e2aaSSasha Levin { "sandbox", kvm_cmd_sandbox, kvm_run_help, 0 }, 37f6677a1dSAmerigo Wang { NULL, NULL, NULL, 0 }, 38f6677a1dSAmerigo Wang }; 390a936c54SPrasad Joshi 400ea58e5bSPekka Enberg /* 410ea58e5bSPekka Enberg * kvm_get_command: Searches the command in an array of the commands and 420ea58e5bSPekka Enberg * returns a pointer to cmd_struct if a match is found. 430ea58e5bSPekka Enberg * 440ea58e5bSPekka Enberg * Input parameters: 450ea58e5bSPekka Enberg * command: Array of possible commands. The last entry in the array must be 460ea58e5bSPekka Enberg * NULL. 470ea58e5bSPekka Enberg * cmd: A string command to search in the array 480ea58e5bSPekka Enberg * 490ea58e5bSPekka Enberg * Return Value: 500ea58e5bSPekka Enberg * NULL: If the cmd is not matched with any of the command in the command array 510ea58e5bSPekka Enberg * p: Pointer to cmd_struct of the matching command 520a936c54SPrasad Joshi */ 53f6677a1dSAmerigo Wang struct cmd_struct *kvm_get_command(struct cmd_struct *command, 540a936c54SPrasad Joshi const char *cmd) 550a936c54SPrasad Joshi { 560a936c54SPrasad Joshi struct cmd_struct *p = command; 570a936c54SPrasad Joshi 580a936c54SPrasad Joshi while (p->cmd) { 590a936c54SPrasad Joshi if (!strcmp(p->cmd, cmd)) 600a936c54SPrasad Joshi return p; 610a936c54SPrasad Joshi p++; 620a936c54SPrasad Joshi } 630a936c54SPrasad Joshi return NULL; 640a936c54SPrasad Joshi } 650a936c54SPrasad Joshi 660a936c54SPrasad Joshi int handle_command(struct cmd_struct *command, int argc, const char **argv) 670a936c54SPrasad Joshi { 680a936c54SPrasad Joshi struct cmd_struct *p; 690a936c54SPrasad Joshi const char *prefix = NULL; 70e81c0199SLiming Wang int ret = 0; 710a936c54SPrasad Joshi 720a936c54SPrasad Joshi if (!argv || !*argv) { 730a936c54SPrasad Joshi p = kvm_get_command(command, "help"); 740a936c54SPrasad Joshi assert(p); 750a936c54SPrasad Joshi return p->fn(argc, argv, prefix); 760a936c54SPrasad Joshi } 770a936c54SPrasad Joshi 780a936c54SPrasad Joshi p = kvm_get_command(command, argv[0]); 790a936c54SPrasad Joshi if (!p) { 800a936c54SPrasad Joshi p = kvm_get_command(command, "help"); 810a936c54SPrasad Joshi assert(p); 820a936c54SPrasad Joshi p->fn(0, NULL, prefix); 830a936c54SPrasad Joshi return EINVAL; 840a936c54SPrasad Joshi } 850a936c54SPrasad Joshi 86e81c0199SLiming Wang ret = p->fn(argc - 1, &argv[1], prefix); 87e81c0199SLiming Wang if (ret < 0) { 88e81c0199SLiming Wang if (errno == EPERM) 89e81c0199SLiming Wang die("Permission error - are you root?"); 90e81c0199SLiming Wang } 91e81c0199SLiming Wang 92e81c0199SLiming Wang return ret; 930a936c54SPrasad Joshi } 94