xref: /kvmtool/builtin-stop.c (revision 8d2ff5da21a87617d8c0646914293b47f333cbc4)
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>
64b1addaeSSasha Levin #include <kvm/kvm-ipc.h>
7daf4cb5aSSasha Levin 
8daf4cb5aSSasha Levin #include <stdio.h>
9daf4cb5aSSasha Levin #include <string.h>
10daf4cb5aSSasha Levin #include <signal.h>
11daf4cb5aSSasha Levin 
124b1addaeSSasha Levin struct stop_cmd {
134b1addaeSSasha Levin 	u32 type;
144b1addaeSSasha Levin 	u32 len;
154b1addaeSSasha Levin };
164b1addaeSSasha Levin 
1709af335bSSasha Levin static bool all;
184b1addaeSSasha Levin static int instance;
1909af335bSSasha Levin static const char *instance_name;
2009af335bSSasha Levin 
21c9cba791SPekka Enberg static const char * const stop_usage[] = {
22*8d2ff5daSWanlong Gao 	"lkvm stop [--all] [-n name]",
23c9cba791SPekka Enberg 	NULL
24c9cba791SPekka Enberg };
25c9cba791SPekka Enberg 
26c9cba791SPekka Enberg static const struct option stop_options[] = {
2709af335bSSasha Levin 	OPT_GROUP("General options:"),
2809af335bSSasha Levin 	OPT_BOOLEAN('a', "all", &all, "Stop all instances"),
2909af335bSSasha Levin 	OPT_STRING('n', "name", &instance_name, "name", "Instance name"),
30c9cba791SPekka Enberg 	OPT_END()
31c9cba791SPekka Enberg };
32c9cba791SPekka Enberg 
3309af335bSSasha Levin static void parse_stop_options(int argc, const char **argv)
3409af335bSSasha Levin {
3509af335bSSasha Levin 	while (argc != 0) {
3609af335bSSasha Levin 		argc = parse_options(argc, argv, stop_options, stop_usage,
3709af335bSSasha Levin 				PARSE_OPT_STOP_AT_NON_OPTION);
3809af335bSSasha Levin 		if (argc != 0)
3909af335bSSasha Levin 			kvm_stop_help();
4009af335bSSasha Levin 	}
4109af335bSSasha Levin }
4209af335bSSasha Levin 
430725673aSSasha Levin void kvm_stop_help(void)
440725673aSSasha Levin {
450725673aSSasha Levin 	usage_with_options(stop_usage, stop_options);
460725673aSSasha Levin }
470725673aSSasha Levin 
484b1addaeSSasha Levin static int do_stop(const char *name, int sock)
49daf4cb5aSSasha Levin {
504b1addaeSSasha Levin 	struct stop_cmd cmd = {KVM_IPC_STOP, 0};
514b1addaeSSasha Levin 	int r;
524b1addaeSSasha Levin 
534b1addaeSSasha Levin 	r = write(sock, &cmd, sizeof(cmd));
544b1addaeSSasha Levin 	if (r < 0)
554b1addaeSSasha Levin 		return r;
564b1addaeSSasha Levin 
574b1addaeSSasha Levin 	return 0;
58daf4cb5aSSasha Levin }
59daf4cb5aSSasha Levin 
60daf4cb5aSSasha Levin int kvm_cmd_stop(int argc, const char **argv, const char *prefix)
61daf4cb5aSSasha Levin {
6209af335bSSasha Levin 	parse_stop_options(argc, argv);
63daf4cb5aSSasha Levin 
6409af335bSSasha Levin 	if (all)
6509af335bSSasha Levin 		return kvm__enumerate_instances(do_stop);
6609af335bSSasha Levin 
6709af335bSSasha Levin 	if (instance_name == NULL &&
684b1addaeSSasha Levin 	    instance == 0)
690725673aSSasha Levin 		kvm_stop_help();
70daf4cb5aSSasha Levin 
7109af335bSSasha Levin 	if (instance_name)
724b1addaeSSasha Levin 		instance = kvm__get_sock_by_instance(instance_name);
73daf4cb5aSSasha Levin 
744b1addaeSSasha Levin 	if (instance <= 0)
7509af335bSSasha Levin 		die("Failed locating instance");
76daf4cb5aSSasha Levin 
774b1addaeSSasha Levin 	return do_stop(instance_name, instance);
78daf4cb5aSSasha Levin }
79