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 */ 8ca379b83SPekka Enberg #include "kvm/kvm-debug.h" 92947270eSSasha Levin #include "kvm/kvm-pause.h" 10*5cac5d9cSSasha Levin #include "kvm/kvm-balloon.h" 11ca379b83SPekka Enberg #include "kvm/kvm-help.h" 12ca379b83SPekka Enberg #include "kvm/kvm-cmd.h" 13ca379b83SPekka Enberg #include "kvm/kvm-run.h" 14f6677a1dSAmerigo Wang 15f6677a1dSAmerigo Wang struct cmd_struct kvm_commands[] = { 162947270eSSasha Levin { "pause", kvm_cmd_pause, NULL, 0 }, 17ca379b83SPekka Enberg { "debug", kvm_cmd_debug, NULL, 0 }, 18*5cac5d9cSSasha Levin { "balloon", kvm_cmd_balloon, NULL, 0 }, 19f6677a1dSAmerigo Wang { "help", kvm_cmd_help, NULL, 0 }, 20f6677a1dSAmerigo Wang { "run", kvm_cmd_run, kvm_run_help, 0 }, 21f6677a1dSAmerigo Wang { NULL, NULL, NULL, 0 }, 22f6677a1dSAmerigo Wang }; 230a936c54SPrasad Joshi 240ea58e5bSPekka Enberg /* 250ea58e5bSPekka Enberg * kvm_get_command: Searches the command in an array of the commands and 260ea58e5bSPekka Enberg * returns a pointer to cmd_struct if a match is found. 270ea58e5bSPekka Enberg * 280ea58e5bSPekka Enberg * Input parameters: 290ea58e5bSPekka Enberg * command: Array of possible commands. The last entry in the array must be 300ea58e5bSPekka Enberg * NULL. 310ea58e5bSPekka Enberg * cmd: A string command to search in the array 320ea58e5bSPekka Enberg * 330ea58e5bSPekka Enberg * Return Value: 340ea58e5bSPekka Enberg * NULL: If the cmd is not matched with any of the command in the command array 350ea58e5bSPekka Enberg * p: Pointer to cmd_struct of the matching command 360a936c54SPrasad Joshi */ 37f6677a1dSAmerigo Wang struct cmd_struct *kvm_get_command(struct cmd_struct *command, 380a936c54SPrasad Joshi const char *cmd) 390a936c54SPrasad Joshi { 400a936c54SPrasad Joshi struct cmd_struct *p = command; 410a936c54SPrasad Joshi 420a936c54SPrasad Joshi while (p->cmd) { 430a936c54SPrasad Joshi if (!strcmp(p->cmd, cmd)) 440a936c54SPrasad Joshi return p; 450a936c54SPrasad Joshi p++; 460a936c54SPrasad Joshi } 470a936c54SPrasad Joshi return NULL; 480a936c54SPrasad Joshi } 490a936c54SPrasad Joshi 500a936c54SPrasad Joshi int handle_command(struct cmd_struct *command, int argc, const char **argv) 510a936c54SPrasad Joshi { 520a936c54SPrasad Joshi struct cmd_struct *p; 530a936c54SPrasad Joshi const char *prefix = NULL; 540a936c54SPrasad Joshi 550a936c54SPrasad Joshi if (!argv || !*argv) { 560a936c54SPrasad Joshi p = kvm_get_command(command, "help"); 570a936c54SPrasad Joshi assert(p); 580a936c54SPrasad Joshi return p->fn(argc, argv, prefix); 590a936c54SPrasad Joshi } 600a936c54SPrasad Joshi 610a936c54SPrasad Joshi p = kvm_get_command(command, argv[0]); 620a936c54SPrasad Joshi if (!p) { 630a936c54SPrasad Joshi p = kvm_get_command(command, "help"); 640a936c54SPrasad Joshi assert(p); 650a936c54SPrasad Joshi p->fn(0, NULL, prefix); 660a936c54SPrasad Joshi return EINVAL; 670a936c54SPrasad Joshi } 680a936c54SPrasad Joshi 690a936c54SPrasad Joshi return p->fn(argc - 1, &argv[1], prefix); 700a936c54SPrasad Joshi } 71