xref: /kvmtool/builtin-stop.c (revision 09af335b59d67612bdcccfc9f4ff5c7b691025da)
1daf4cb5aSSasha Levin #include <kvm/util.h>
2daf4cb5aSSasha Levin #include <kvm/kvm-cmd.h>
3daf4cb5aSSasha Levin #include <kvm/builtin-stop.h>
4daf4cb5aSSasha Levin #include <kvm/kvm.h>
5c9cba791SPekka Enberg #include <kvm/parse-options.h>
6daf4cb5aSSasha Levin 
7daf4cb5aSSasha Levin #include <stdio.h>
8daf4cb5aSSasha Levin #include <string.h>
9daf4cb5aSSasha Levin #include <signal.h>
10daf4cb5aSSasha Levin 
11*09af335bSSasha Levin static bool all;
12*09af335bSSasha Levin static u64 instance_pid;
13*09af335bSSasha Levin static const char *instance_name;
14*09af335bSSasha Levin 
15c9cba791SPekka Enberg static const char * const stop_usage[] = {
16*09af335bSSasha Levin 	"kvm stop [--all] [-n name] [-p pid]",
17c9cba791SPekka Enberg 	NULL
18c9cba791SPekka Enberg };
19c9cba791SPekka Enberg 
20c9cba791SPekka Enberg static const struct option stop_options[] = {
21*09af335bSSasha Levin 	OPT_GROUP("General options:"),
22*09af335bSSasha Levin 	OPT_BOOLEAN('a', "all", &all, "Stop all instances"),
23*09af335bSSasha Levin 	OPT_STRING('n', "name", &instance_name, "name", "Instance name"),
24*09af335bSSasha Levin 	OPT_U64('p', "pid", &instance_pid, "Instance pid"),
25c9cba791SPekka Enberg 	OPT_END()
26c9cba791SPekka Enberg };
27c9cba791SPekka Enberg 
28*09af335bSSasha Levin static void parse_stop_options(int argc, const char **argv)
29*09af335bSSasha Levin {
30*09af335bSSasha Levin 	while (argc != 0) {
31*09af335bSSasha Levin 		argc = parse_options(argc, argv, stop_options, stop_usage,
32*09af335bSSasha Levin 				PARSE_OPT_STOP_AT_NON_OPTION);
33*09af335bSSasha Levin 		if (argc != 0)
34*09af335bSSasha Levin 			kvm_stop_help();
35*09af335bSSasha Levin 	}
36*09af335bSSasha Levin }
37*09af335bSSasha Levin 
380725673aSSasha Levin void kvm_stop_help(void)
390725673aSSasha Levin {
400725673aSSasha Levin 	usage_with_options(stop_usage, stop_options);
410725673aSSasha Levin }
420725673aSSasha Levin 
43886af5f2SLiming Wang static int do_stop(const char *name, int pid)
44daf4cb5aSSasha Levin {
45886af5f2SLiming Wang 	return kill(pid, SIGKVMSTOP);
46daf4cb5aSSasha Levin }
47daf4cb5aSSasha Levin 
48daf4cb5aSSasha Levin int kvm_cmd_stop(int argc, const char **argv, const char *prefix)
49daf4cb5aSSasha Levin {
50*09af335bSSasha Levin 	parse_stop_options(argc, argv);
51daf4cb5aSSasha Levin 
52*09af335bSSasha Levin 	if (all)
53*09af335bSSasha Levin 		return kvm__enumerate_instances(do_stop);
54*09af335bSSasha Levin 
55*09af335bSSasha Levin 	if (instance_name == NULL &&
56*09af335bSSasha Levin 	    instance_pid == 0)
570725673aSSasha Levin 		kvm_stop_help();
58daf4cb5aSSasha Levin 
59*09af335bSSasha Levin 	if (instance_name)
60*09af335bSSasha Levin 		instance_pid = kvm__get_pid_by_instance(argv[0]);
61daf4cb5aSSasha Levin 
62*09af335bSSasha Levin 	if (instance_pid <= 0)
63*09af335bSSasha Levin 		die("Failed locating instance");
64daf4cb5aSSasha Levin 
65*09af335bSSasha Levin 	return kill(instance_pid, SIGKVMSTOP);
66daf4cb5aSSasha Levin }
67