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; 18284bbe92SSasha Levin static const char *instance_name; 19284bbe92SSasha Levin 20c9cba791SPekka Enberg static const char * const resume_usage[] = { 218d2ff5daSWanlong Gao "lkvm resume [--all] [-n name]", 22c9cba791SPekka Enberg NULL 23c9cba791SPekka Enberg }; 24c9cba791SPekka Enberg 25c9cba791SPekka Enberg static const struct option resume_options[] = { 26284bbe92SSasha Levin OPT_GROUP("General options:"), 27284bbe92SSasha Levin OPT_BOOLEAN('a', "all", &all, "Resume all instances"), 28284bbe92SSasha Levin OPT_STRING('n', "name", &instance_name, "name", "Instance name"), 29c9cba791SPekka Enberg OPT_END() 30c9cba791SPekka Enberg }; 3102317b74SSasha Levin 32284bbe92SSasha Levin static void parse_resume_options(int argc, const char **argv) 33284bbe92SSasha Levin { 34284bbe92SSasha Levin while (argc != 0) { 35284bbe92SSasha Levin argc = parse_options(argc, argv, resume_options, resume_usage, 36284bbe92SSasha Levin PARSE_OPT_STOP_AT_NON_OPTION); 37284bbe92SSasha Levin if (argc != 0) 38284bbe92SSasha Levin kvm_resume_help(); 39284bbe92SSasha Levin } 40284bbe92SSasha Levin } 41284bbe92SSasha Levin 420725673aSSasha Levin void kvm_resume_help(void) 430725673aSSasha Levin { 440725673aSSasha Levin usage_with_options(resume_usage, resume_options); 450725673aSSasha Levin } 460725673aSSasha Levin 474b1addaeSSasha Levin static int do_resume(const char *name, int sock) 4802317b74SSasha Levin { 494b1addaeSSasha Levin struct resume_cmd cmd = {KVM_IPC_RESUME, 0}; 504b1addaeSSasha Levin int r; 514b1addaeSSasha Levin 524b1addaeSSasha Levin r = write(sock, &cmd, sizeof(cmd)); 534b1addaeSSasha Levin if (r < 0) 544b1addaeSSasha Levin return r; 554b1addaeSSasha Levin 564b1addaeSSasha Levin return 0; 5702317b74SSasha Levin } 5802317b74SSasha Levin 5902317b74SSasha Levin int kvm_cmd_resume(int argc, const char **argv, const char *prefix) 6002317b74SSasha Levin { 61*4a0016ecSLai Jiangshan int instance; 62*4a0016ecSLai Jiangshan int r; 63*4a0016ecSLai Jiangshan 64284bbe92SSasha Levin parse_resume_options(argc, argv); 6502317b74SSasha Levin 66284bbe92SSasha Levin if (all) 67284bbe92SSasha Levin return kvm__enumerate_instances(do_resume); 68284bbe92SSasha Levin 69*4a0016ecSLai Jiangshan if (instance_name == NULL) 700725673aSSasha Levin kvm_resume_help(); 7102317b74SSasha Levin 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 77*4a0016ecSLai Jiangshan r = do_resume(instance_name, instance); 78*4a0016ecSLai Jiangshan 79*4a0016ecSLai Jiangshan close(instance); 80*4a0016ecSLai Jiangshan 81*4a0016ecSLai Jiangshan return r; 8202317b74SSasha Levin } 83