xref: /kvmtool/builtin-pause.c (revision 2fa65af3160d7e4ad4603f0064411fd8ee784e45)
12947270eSSasha Levin #include <kvm/util.h>
22947270eSSasha Levin #include <kvm/kvm-cmd.h>
32a24f96dSSasha Levin #include <kvm/builtin-pause.h>
4512e8bf1SSasha Levin #include <kvm/kvm.h>
5c9cba791SPekka Enberg #include <kvm/parse-options.h>
64b1addaeSSasha Levin #include <kvm/kvm-ipc.h>
7c9cba791SPekka Enberg 
8477db183SSasha Levin #include <stdio.h>
9477db183SSasha Levin #include <string.h>
10477db183SSasha Levin #include <signal.h>
11477db183SSasha Levin 
12477db183SSasha Levin static bool all;
13477db183SSasha Levin static const char *instance_name;
14477db183SSasha Levin 
15c9cba791SPekka Enberg static const char * const pause_usage[] = {
168d2ff5daSWanlong Gao 	"lkvm pause [--all] [-n name]",
17c9cba791SPekka Enberg 	NULL
18c9cba791SPekka Enberg };
19c9cba791SPekka Enberg 
20c9cba791SPekka Enberg static const struct option pause_options[] = {
21477db183SSasha Levin 	OPT_GROUP("General options:"),
22477db183SSasha Levin 	OPT_BOOLEAN('a', "all", &all, "Pause all instances"),
23477db183SSasha Levin 	OPT_STRING('n', "name", &instance_name, "name", "Instance name"),
24c9cba791SPekka Enberg 	OPT_END()
25c9cba791SPekka Enberg };
262947270eSSasha Levin 
27477db183SSasha Levin static void parse_pause_options(int argc, const char **argv)
28477db183SSasha Levin {
29477db183SSasha Levin 	while (argc != 0) {
30477db183SSasha Levin 		argc = parse_options(argc, argv, pause_options, pause_usage,
31477db183SSasha Levin 				PARSE_OPT_STOP_AT_NON_OPTION);
32477db183SSasha Levin 		if (argc != 0)
33477db183SSasha Levin 			kvm_pause_help();
34477db183SSasha Levin 	}
35477db183SSasha Levin }
36477db183SSasha Levin 
370725673aSSasha Levin void kvm_pause_help(void)
380725673aSSasha Levin {
390725673aSSasha Levin 	usage_with_options(pause_usage, pause_options);
400725673aSSasha Levin }
410725673aSSasha Levin 
424b1addaeSSasha Levin static int do_pause(const char *name, int sock)
4324e7dbbaSSasha Levin {
44*2fa65af3SAsias He 	int r;
45*2fa65af3SAsias He 
46*2fa65af3SAsias He 	r = kvm_ipc__send(sock, KVM_IPC_PAUSE);
47*2fa65af3SAsias He 	if (r)
48*2fa65af3SAsias He 		return r;
49*2fa65af3SAsias He 
50*2fa65af3SAsias He 	printf("Guest %s paused\n", name);
51*2fa65af3SAsias He 
52*2fa65af3SAsias He 	return 0;
5324e7dbbaSSasha Levin }
5424e7dbbaSSasha Levin 
552947270eSSasha Levin int kvm_cmd_pause(int argc, const char **argv, const char *prefix)
562947270eSSasha Levin {
570b235f6bSLai Jiangshan 	int instance;
580b235f6bSLai Jiangshan 	int r;
590b235f6bSLai Jiangshan 
60477db183SSasha Levin 	parse_pause_options(argc, argv);
61512e8bf1SSasha Levin 
62477db183SSasha Levin 	if (all)
63477db183SSasha Levin 		return kvm__enumerate_instances(do_pause);
64477db183SSasha Levin 
650b235f6bSLai Jiangshan 	if (instance_name == NULL)
660725673aSSasha Levin 		kvm_pause_help();
67512e8bf1SSasha Levin 
684b1addaeSSasha Levin 	instance = kvm__get_sock_by_instance(instance_name);
6924e7dbbaSSasha Levin 
704b1addaeSSasha Levin 	if (instance <= 0)
71477db183SSasha Levin 		die("Failed locating instance");
72512e8bf1SSasha Levin 
730b235f6bSLai Jiangshan 	r = do_pause(instance_name, instance);
740b235f6bSLai Jiangshan 
750b235f6bSLai Jiangshan 	close(instance);
760b235f6bSLai Jiangshan 
770b235f6bSLai Jiangshan 	return r;
782947270eSSasha Levin }
79