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