diff -r -U3 qemu-snapshot-2005-05-06_23/cocoa.m qemu-snapshot-2005-05-06_23-on-quit-v0.2/cocoa.m --- qemu-snapshot-2005-05-06_23/cocoa.m Thu Apr 7 22:36:50 2005 +++ qemu-snapshot-2005-05-06_23-on-quit-v0.2/cocoa.m Sat May 7 15:41:23 2005 @@ -444,7 +444,7 @@ - (void)applicationWillTerminate:(NSNotification *)aNotification { printf("Application will terminate\n"); - qemu_system_shutdown_request(); + qemu_system_shutdown_request(1); /* In order to avoid a crash */ exit(0); } diff -r -U3 qemu-snapshot-2005-05-06_23/hw/cuda.c qemu-snapshot-2005-05-06_23-on-quit-v0.2/hw/cuda.c --- qemu-snapshot-2005-05-06_23/hw/cuda.c Sat Apr 23 20:16:54 2005 +++ qemu-snapshot-2005-05-06_23-on-quit-v0.2/hw/cuda.c Sat May 7 15:41:06 2005 @@ -532,7 +532,7 @@ obuf[0] = CUDA_PACKET; obuf[1] = 0; cuda_send_packet_to_host(s, obuf, 2); - qemu_system_shutdown_request(); + qemu_system_shutdown_request(1); break; default: break; diff -r -U3 qemu-snapshot-2005-05-06_23/hw/pc.c qemu-snapshot-2005-05-06_23-on-quit-v0.2/hw/pc.c --- qemu-snapshot-2005-05-06_23/hw/pc.c Sat Jan 15 13:02:56 2005 +++ qemu-snapshot-2005-05-06_23-on-quit-v0.2/hw/pc.c Sat May 7 16:20:42 2005 @@ -297,7 +297,7 @@ shutdown_index++; if (shutdown_index == 8) { shutdown_index = 0; - qemu_system_shutdown_request(); + qemu_system_shutdown_request(-1); } } else { shutdown_index = 0; diff -r -U3 qemu-snapshot-2005-05-06_23/sdl.c qemu-snapshot-2005-05-06_23-on-quit-v0.2/sdl.c --- qemu-snapshot-2005-05-06_23/sdl.c Mon Jan 17 23:32:23 2005 +++ qemu-snapshot-2005-05-06_23-on-quit-v0.2/sdl.c Sat May 7 16:33:15 2005 @@ -414,7 +414,7 @@ sdl_process_key(&ev->key); break; case SDL_QUIT: - qemu_system_shutdown_request(); + qemu_system_shutdown_request(1); break; case SDL_MOUSEMOTION: if (gui_grab) { diff -r -U3 qemu-snapshot-2005-05-06_23/vl.c qemu-snapshot-2005-05-06_23-on-quit-v0.2/vl.c --- qemu-snapshot-2005-05-06_23/vl.c Sat Apr 30 18:10:35 2005 +++ qemu-snapshot-2005-05-06_23-on-quit-v0.2/vl.c Sat May 7 18:25:11 2005 @@ -144,6 +144,11 @@ #endif int graphic_depth = 15; int full_screen = 0; + +#define ON_QUIT_ASK_FILENAME "on_quit_ask" +int on_quit = 0; +const char * on_quit_filepath = NULL; + TextConsole *vga_console; CharDriverState *serial_hds[MAX_SERIAL_PORTS]; CharDriverState *parallel_hds[MAX_PARALLEL_PORTS]; @@ -2581,9 +2586,27 @@ cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT); } -void qemu_system_shutdown_request(void) +void qemu_system_shutdown_request(int s) { - shutdown_requested = 1; + + if (s == 1 && on_quit == 3) { // User power-off request and Popup message setting + int r,c; + + if( on_quit_filepath ) r = system(on_quit_filepath); + else { + char buf[1024]; + snprintf(buf, sizeof(buf), "%s/%s", CONFIG_QEMU_SHAREDIR, ON_QUIT_ASK_FILENAME); + r = system(buf); + } + c = WEXITSTATUS(r); + + if(c == 0) return; + if(c == 2) s = -1; // Simulate an APM power-off request + // else if r == -1, there was an error; if c == 1, then suspend; + // Either way, we suspend, for safety + } + + shutdown_requested = s; cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT); } @@ -2701,8 +2724,11 @@ if (vm_running) { ret = cpu_exec(env); if (shutdown_requested) { - ret = EXCP_INTERRUPT; - break; + if (on_quit == 0 || on_quit == 2 || on_quit == 3 || (on_quit == 1 && shutdown_requested == -1)) { + ret = EXCP_INTERRUPT; + break; + } + shutdown_requested = 0; } if (reset_requested) { reset_requested = 0; @@ -2803,6 +2829,9 @@ "-std-vga simulate a standard VGA card with VESA Bochs Extensions\n" " (default is CL-GD5446 PCI VGA)\n" #endif + "-on-quit [ignore|suspend|ask|