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