102317b74SSasha Levin #include <kvm/util.h> 202317b74SSasha Levin #include <kvm/kvm-cmd.h> 302317b74SSasha Levin #include <kvm/builtin-resume.h> 402317b74SSasha Levin #include <kvm/kvm.h> 5c9cba791SPekka Enberg #include <kvm/parse-options.h> 64b1addaeSSasha Levin #include <kvm/kvm-ipc.h> 7c9cba791SPekka Enberg 8284bbe92SSasha Levin #include <stdio.h> 9284bbe92SSasha Levin #include <string.h> 10284bbe92SSasha Levin #include <signal.h> 11284bbe92SSasha Levin 124b1addaeSSasha Levin struct resume_cmd { 134b1addaeSSasha Levin u32 type; 144b1addaeSSasha Levin u32 len; 154b1addaeSSasha Levin }; 164b1addaeSSasha Levin 17284bbe92SSasha Levin static bool all; 184b1addaeSSasha Levin static int instance; 19284bbe92SSasha Levin static const char *instance_name; 20284bbe92SSasha Levin 21c9cba791SPekka Enberg static const char * const resume_usage[] = { 22*8d2ff5daSWanlong Gao "lkvm resume [--all] [-n name]", 23c9cba791SPekka Enberg NULL 24c9cba791SPekka Enberg }; 25c9cba791SPekka Enberg 26c9cba791SPekka Enberg static const struct option resume_options[] = { 27284bbe92SSasha Levin OPT_GROUP("General options:"), 28284bbe92SSasha Levin OPT_BOOLEAN('a', "all", &all, "Resume all instances"), 29284bbe92SSasha Levin OPT_STRING('n', "name", &instance_name, "name", "Instance name"), 30c9cba791SPekka Enberg OPT_END() 31c9cba791SPekka Enberg }; 3202317b74SSasha Levin 33284bbe92SSasha Levin static void parse_resume_options(int argc, const char **argv) 34284bbe92SSasha Levin { 35284bbe92SSasha Levin while (argc != 0) { 36284bbe92SSasha Levin argc = parse_options(argc, argv, resume_options, resume_usage, 37284bbe92SSasha Levin PARSE_OPT_STOP_AT_NON_OPTION); 38284bbe92SSasha Levin if (argc != 0) 39284bbe92SSasha Levin kvm_resume_help(); 40284bbe92SSasha Levin } 41284bbe92SSasha Levin } 42284bbe92SSasha Levin 430725673aSSasha Levin void kvm_resume_help(void) 440725673aSSasha Levin { 450725673aSSasha Levin usage_with_options(resume_usage, resume_options); 460725673aSSasha Levin } 470725673aSSasha Levin 484b1addaeSSasha Levin static int do_resume(const char *name, int sock) 4902317b74SSasha Levin { 504b1addaeSSasha Levin struct resume_cmd cmd = {KVM_IPC_RESUME, 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; 5802317b74SSasha Levin } 5902317b74SSasha Levin 6002317b74SSasha Levin int kvm_cmd_resume(int argc, const char **argv, const char *prefix) 6102317b74SSasha Levin { 62284bbe92SSasha Levin parse_resume_options(argc, argv); 6302317b74SSasha Levin 64284bbe92SSasha Levin if (all) 65284bbe92SSasha Levin return kvm__enumerate_instances(do_resume); 66284bbe92SSasha Levin 67284bbe92SSasha Levin if (instance_name == NULL && 684b1addaeSSasha Levin instance == 0) 690725673aSSasha Levin kvm_resume_help(); 7002317b74SSasha Levin 71284bbe92SSasha Levin if (instance_name) 724b1addaeSSasha Levin instance = kvm__get_sock_by_instance(instance_name); 7302317b74SSasha Levin 744b1addaeSSasha Levin if (instance <= 0) 75284bbe92SSasha Levin die("Failed locating instance"); 7602317b74SSasha Levin 774b1addaeSSasha Levin return do_resume(instance_name, instance); 7802317b74SSasha Levin } 79