xref: /kvmtool/kvm-cmd.c (revision 3c29e2aabd59b4ed6eb9a4495224dd8eede138de)
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