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 12284bbe92SSasha Levin static bool all; 13284bbe92SSasha Levin static const char *instance_name; 14284bbe92SSasha Levin 15c9cba791SPekka Enberg static const char * const resume_usage[] = { 168d2ff5daSWanlong Gao "lkvm resume [--all] [-n name]", 17c9cba791SPekka Enberg NULL 18c9cba791SPekka Enberg }; 19c9cba791SPekka Enberg 20c9cba791SPekka Enberg static const struct option resume_options[] = { 21284bbe92SSasha Levin OPT_GROUP("General options:"), 22284bbe92SSasha Levin OPT_BOOLEAN('a', "all", &all, "Resume all instances"), 23284bbe92SSasha Levin OPT_STRING('n', "name", &instance_name, "name", "Instance name"), 24c9cba791SPekka Enberg OPT_END() 25c9cba791SPekka Enberg }; 2602317b74SSasha Levin 27284bbe92SSasha Levin static void parse_resume_options(int argc, const char **argv) 28284bbe92SSasha Levin { 29284bbe92SSasha Levin while (argc != 0) { 30284bbe92SSasha Levin argc = parse_options(argc, argv, resume_options, resume_usage, 31284bbe92SSasha Levin PARSE_OPT_STOP_AT_NON_OPTION); 32284bbe92SSasha Levin if (argc != 0) 33284bbe92SSasha Levin kvm_resume_help(); 34284bbe92SSasha Levin } 35284bbe92SSasha Levin } 36284bbe92SSasha Levin 370725673aSSasha Levin void kvm_resume_help(void) 380725673aSSasha Levin { 390725673aSSasha Levin usage_with_options(resume_usage, resume_options); 400725673aSSasha Levin } 410725673aSSasha Levin 424b1addaeSSasha Levin static int do_resume(const char *name, int sock) 4302317b74SSasha Levin { 44*2fa65af3SAsias He int r; 45*2fa65af3SAsias He 46*2fa65af3SAsias He r = kvm_ipc__send(sock, KVM_IPC_RESUME); 47*2fa65af3SAsias He if (r) 48*2fa65af3SAsias He return r; 49*2fa65af3SAsias He 50*2fa65af3SAsias He printf("Guest %s resumed\n", name); 51*2fa65af3SAsias He 52*2fa65af3SAsias He return 0; 5302317b74SSasha Levin } 5402317b74SSasha Levin 5502317b74SSasha Levin int kvm_cmd_resume(int argc, const char **argv, const char *prefix) 5602317b74SSasha Levin { 574a0016ecSLai Jiangshan int instance; 584a0016ecSLai Jiangshan int r; 594a0016ecSLai Jiangshan 60284bbe92SSasha Levin parse_resume_options(argc, argv); 6102317b74SSasha Levin 62284bbe92SSasha Levin if (all) 63284bbe92SSasha Levin return kvm__enumerate_instances(do_resume); 64284bbe92SSasha Levin 654a0016ecSLai Jiangshan if (instance_name == NULL) 660725673aSSasha Levin kvm_resume_help(); 6702317b74SSasha Levin 684b1addaeSSasha Levin instance = kvm__get_sock_by_instance(instance_name); 6902317b74SSasha Levin 704b1addaeSSasha Levin if (instance <= 0) 71284bbe92SSasha Levin die("Failed locating instance"); 7202317b74SSasha Levin 734a0016ecSLai Jiangshan r = do_resume(instance_name, instance); 744a0016ecSLai Jiangshan 754a0016ecSLai Jiangshan close(instance); 764a0016ecSLai Jiangshan 774a0016ecSLai Jiangshan return r; 7802317b74SSasha Levin } 79