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> 6daf4cb5aSSasha Levin 7daf4cb5aSSasha Levin #include <stdio.h> 8daf4cb5aSSasha Levin #include <string.h> 9daf4cb5aSSasha Levin #include <signal.h> 10daf4cb5aSSasha Levin 11*09af335bSSasha Levin static bool all; 12*09af335bSSasha Levin static u64 instance_pid; 13*09af335bSSasha Levin static const char *instance_name; 14*09af335bSSasha Levin 15c9cba791SPekka Enberg static const char * const stop_usage[] = { 16*09af335bSSasha Levin "kvm stop [--all] [-n name] [-p pid]", 17c9cba791SPekka Enberg NULL 18c9cba791SPekka Enberg }; 19c9cba791SPekka Enberg 20c9cba791SPekka Enberg static const struct option stop_options[] = { 21*09af335bSSasha Levin OPT_GROUP("General options:"), 22*09af335bSSasha Levin OPT_BOOLEAN('a', "all", &all, "Stop all instances"), 23*09af335bSSasha Levin OPT_STRING('n', "name", &instance_name, "name", "Instance name"), 24*09af335bSSasha Levin OPT_U64('p', "pid", &instance_pid, "Instance pid"), 25c9cba791SPekka Enberg OPT_END() 26c9cba791SPekka Enberg }; 27c9cba791SPekka Enberg 28*09af335bSSasha Levin static void parse_stop_options(int argc, const char **argv) 29*09af335bSSasha Levin { 30*09af335bSSasha Levin while (argc != 0) { 31*09af335bSSasha Levin argc = parse_options(argc, argv, stop_options, stop_usage, 32*09af335bSSasha Levin PARSE_OPT_STOP_AT_NON_OPTION); 33*09af335bSSasha Levin if (argc != 0) 34*09af335bSSasha Levin kvm_stop_help(); 35*09af335bSSasha Levin } 36*09af335bSSasha Levin } 37*09af335bSSasha Levin 380725673aSSasha Levin void kvm_stop_help(void) 390725673aSSasha Levin { 400725673aSSasha Levin usage_with_options(stop_usage, stop_options); 410725673aSSasha Levin } 420725673aSSasha Levin 43886af5f2SLiming Wang static int do_stop(const char *name, int pid) 44daf4cb5aSSasha Levin { 45886af5f2SLiming Wang return kill(pid, SIGKVMSTOP); 46daf4cb5aSSasha Levin } 47daf4cb5aSSasha Levin 48daf4cb5aSSasha Levin int kvm_cmd_stop(int argc, const char **argv, const char *prefix) 49daf4cb5aSSasha Levin { 50*09af335bSSasha Levin parse_stop_options(argc, argv); 51daf4cb5aSSasha Levin 52*09af335bSSasha Levin if (all) 53*09af335bSSasha Levin return kvm__enumerate_instances(do_stop); 54*09af335bSSasha Levin 55*09af335bSSasha Levin if (instance_name == NULL && 56*09af335bSSasha Levin instance_pid == 0) 570725673aSSasha Levin kvm_stop_help(); 58daf4cb5aSSasha Levin 59*09af335bSSasha Levin if (instance_name) 60*09af335bSSasha Levin instance_pid = kvm__get_pid_by_instance(argv[0]); 61daf4cb5aSSasha Levin 62*09af335bSSasha Levin if (instance_pid <= 0) 63*09af335bSSasha Levin die("Failed locating instance"); 64daf4cb5aSSasha Levin 65*09af335bSSasha Levin return kill(instance_pid, SIGKVMSTOP); 66daf4cb5aSSasha Levin } 67