aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkraxel <kraxel>2010-01-14 10:20:12 +0000
committerkraxel <kraxel>2010-01-14 10:20:12 +0000
commit304c5f13138e0bca04282b6d7dff9a53b0ddbe41 (patch)
tree2d98a7aedaf198fb739d3661ac3615b8f04b6c69
parenta8484f3985e884b38ca5514ab443f9ed8cccfa19 (diff)
downloadqemu-gtk-304c5f13138e0bca04282b6d7dff9a53b0ddbe41.tar.gz
- some experimental save-to-disk bits.
- fixup remote support.
-rw-r--r--devices.c8
-rw-r--r--monitor.c2
-rw-r--r--qemu-gtk.c53
-rw-r--r--qemu-gtk.h4
4 files changed, 60 insertions, 7 deletions
diff --git a/devices.c b/devices.c
index 6fbde73..0ea2d78 100644
--- a/devices.c
+++ b/devices.c
@@ -323,6 +323,8 @@ void devices_parse_info_usb(struct qemu_window *win, char *str)
if (debug)
fprintf(stderr, "%s: %s - %s - %s\n",
__FUNCTION__, device, speed, name);
+ if (0 == strcmp(device, "0.0"))
+ continue;
snprintf(label, sizeof(label), "%s (%s)", name, device);
add_entry(win, win->usb.ag, menu_cb_unplug_usb, &i_xml, &i_pos,
@@ -390,6 +392,12 @@ void devices_parse_info_usbhost(struct qemu_window *win, char *str)
/* static */
add_entry(win, win->usbhost.ag, menu_cb_plug_usb, &i_xml, &i_pos,
"QEMU USB Tablet (virtual)", "PlugUsb", "tablet");
+ add_entry(win, win->usbhost.ag, menu_cb_plug_usb, &i_xml, &i_pos,
+ "QEMU USB Mouse (virtual)", "PlugUsb", "mouse");
+ add_entry(win, win->usbhost.ag, menu_cb_plug_usb, &i_xml, &i_pos,
+ "QEMU USB Keyboard (virtual)", "PlugUsb", "keyboard");
+ add_entry(win, win->usbhost.ag, menu_cb_plug_usb, &i_xml, &i_pos,
+ "QEMU USB Bluetooth (virtual)", "PlugUsb", "bt");
xml = malloc(i_pos + strlen(plug_usb_xml));
sprintf(xml, plug_usb_xml,
diff --git a/monitor.c b/monitor.c
index 2a81ea2..0e68acf 100644
--- a/monitor.c
+++ b/monitor.c
@@ -274,7 +274,7 @@ int monitor_connect(struct qemu_window *win, char *dest)
{
int fd;
- fd = conn_init(&win->monitor, "monitor", dest);
+ fd = conn_init(&win->monitor, "monitor", dest, NULL);
if (-1 == fd)
return -1;
diff --git a/qemu-gtk.c b/qemu-gtk.c
index 0281b58..e1c7a9a 100644
--- a/qemu-gtk.c
+++ b/qemu-gtk.c
@@ -379,6 +379,20 @@ static void menu_cb_monitor_cont(GtkAction *action, gpointer userdata)
monitor_append(win, "cont");
}
+static void menu_cb_monitor_save_to_disk(GtkAction *action, gpointer userdata)
+{
+ struct qemu_window *win = userdata;
+ char line[256];
+
+ if (!win->image_save) {
+ /* TODO: error message */
+ return;
+ }
+ snprintf(line, sizeof(line), "migrate \"exec:cat>%s\"", win->image_save);
+ monitor_append(win, line);
+ monitor_append(win, "quit");
+}
+
static void menu_cb_monitor_sys_reset(GtkAction *action, gpointer userdata)
{
struct qemu_window *win = userdata;
@@ -532,6 +546,8 @@ void vnc_connect(struct qemu_window *win)
if (2 == sscanf(win->vnc_display, "%127[^:]:%d", win->vnc_hostname, &nr)) {
sprintf(win->vnc_tcpport, "%d", nr + 5900);
+ if (strcmp("0.0.0.0",win->vnc_hostname) == 0)
+ sprintf(win->vnc_hostname, "%s", win->monitor.hostname);
} else if (1 == sscanf(win->vnc_display, ":%d", &nr)) {
sprintf(win->vnc_hostname, "%s", win->monitor.hostname);
sprintf(win->vnc_tcpport, "%d", nr + 5900);
@@ -547,7 +563,8 @@ void vnc_connect(struct qemu_window *win)
/* ------------------------------------------------------------------ */
-int conn_init(struct qemu_conn *conn, char *name, char *dest)
+int conn_init(struct qemu_conn *conn, char *name, char *dest,
+ const char *monitor_hostname)
{
struct addrinfo ask;
char path[256];
@@ -560,9 +577,13 @@ int conn_init(struct qemu_conn *conn, char *name, char *dest)
snprintf(conn->name, sizeof(conn->name), "%s", name);
strcpy(conn->hostname, "localhost");
- if (2 == sscanf(dest, "tcp:%64[^:]:%32s", conn->hostname, serv)) {
+ if (monitor_hostname)
+ strcpy(conn->hostname, monitor_hostname);
+ if (2 == sscanf(dest, "tcp:%64[^:]:%32[^,]", conn->hostname, serv)) {
+ if (strcmp("0.0.0.0", conn->hostname) == 0)
+ sprintf(conn->hostname, "%s", monitor_hostname);
conn->handle = tcp_connect(&ask, NULL, NULL, conn->hostname, serv);
- } else if (1 == sscanf(dest, "tcp:%32s", serv)) {
+ } else if (1 == sscanf(dest, "tcp:%32[^,]", serv)) {
conn->handle = tcp_connect(&ask, NULL, NULL, conn->hostname, serv);
} else if (1 == sscanf(dest, "unix:%255s", path)) {
conn->handle = unix_connect(path);
@@ -588,6 +609,12 @@ static void conn_user_input(VteTerminal *vte, gchar *buf, guint len,
write(conn->handle, buf, len);
}
+static void conn_vte_destroy(GtkObject *object, gpointer data)
+{
+ struct qemu_conn *conn = data;
+ conn->vte = NULL;
+}
+
static gboolean conn_watch(GIOChannel *source, GIOCondition condition,
gpointer data)
{
@@ -615,6 +642,9 @@ static gboolean conn_watch(GIOChannel *source, GIOCondition condition,
close:
if (conn->vte)
vte_terminal_feed(VTE_TERMINAL(conn->vte), "\r\n=== CLOSED ===", 16);
+ g_source_destroy(g_main_context_find_source_by_id
+ (g_main_context_default(), conn->id));
+ conn->id = 0;
close(conn->handle);
conn->handle = -1;
return FALSE;
@@ -637,7 +667,7 @@ int conn_open_term(struct qemu_window *win, char *name, char *dest, int pos)
return -1;
memset(conn,0,sizeof(*conn));
- fd = conn_init(conn, name, dest);
+ fd = conn_init(conn, name, dest, win->monitor.hostname);
if (fd == -1) {
free(conn);
return -1;
@@ -733,6 +763,10 @@ static const GtkActionEntry entries[] = {
.label = "_Unpause",
.callback = G_CALLBACK(menu_cb_monitor_cont),
},{
+ .name = "MonitorSaveToDisk",
+ .label = "_Save to disk",
+ .callback = G_CALLBACK(menu_cb_monitor_save_to_disk),
+ },{
.name = "MonitorSysReset",
.label = "_Reset",
.callback = G_CALLBACK(menu_cb_monitor_sys_reset),
@@ -814,6 +848,7 @@ static char ui_xml[] =
" <menu action='VMMenu'>"
" <menuitem action='MonitorStop'/>"
" <menuitem action='MonitorCont'/>"
+" <menuitem action='MonitorSaveToDisk'/>"
" <menuitem action='MonitorSysPowerdown'/>"
" <separator/>"
" <menuitem action='MonitorSysReset'/>"
@@ -982,6 +1017,8 @@ void qemu_conn_tab(struct qemu_window *win, struct qemu_conn *conn, int pos)
conn->vte = vte_terminal_new();
g_signal_connect(conn->vte, "commit",
G_CALLBACK(conn_user_input), conn);
+ g_signal_connect(conn->vte, "destroy",
+ G_CALLBACK(conn_vte_destroy), conn);
tabs_add(win, conn->vte, conn->name, pos);
vte_configure(win, conn->vte);
}
@@ -1003,6 +1040,7 @@ static void usage(FILE *fp)
" -m Enable monitor logging and access.\n"
" -s Enable serial console.\n"
" -t Disable VNC, enable serial console.\n"
+ " -i <file> Image file for \"vm save\".\n"
"\n"
"-- \n"
"(c) 2008 Gerd Hoffmann <kraxel@redhat.com>\n",
@@ -1039,6 +1077,7 @@ int
main(int argc, char *argv[])
{
struct qemu_window *win;
+ char *image = NULL;
char mon[256];
int monitor_tab = 0;
int sercon_tab = 0;
@@ -1048,7 +1087,7 @@ main(int argc, char *argv[])
gtk_init(&argc, &argv);
for (;;) {
- if (-1 == (c = getopt(argc, argv, "hdkmst")))
+ if (-1 == (c = getopt(argc, argv, "hdkmsti:")))
break;
switch (c) {
case 'd':
@@ -1067,6 +1106,9 @@ main(int argc, char *argv[])
vnc_tab = 0;
sercon_tab = 1;
break;
+ case 'i':
+ image = optarg;
+ break;
case 'h':
usage(stdout);
exit(0);
@@ -1093,6 +1135,7 @@ main(int argc, char *argv[])
win->quit_on_shutdown = quit_on_shutdown;
win->sercon_tab = sercon_tab;
win->vnc_tab = vnc_tab;
+ win->image_save = image;
gtk_widget_show_all(win->toplevel);
/* tabs */
diff --git a/qemu-gtk.h b/qemu-gtk.h
index 76eeb49..9513f2e 100644
--- a/qemu-gtk.h
+++ b/qemu-gtk.h
@@ -72,6 +72,7 @@ struct qemu_window {
/* vm info */
char version[32];
char name[128];
+ char *image_save;
/* options */
gboolean quit_on_shutdown;
@@ -90,7 +91,8 @@ struct qemu_window {
extern int debug;
void update_status(struct qemu_window *win);
void vnc_connect(struct qemu_window *win);
-int conn_init(struct qemu_conn *conn, char *name, char *dest);
+int conn_init(struct qemu_conn *conn, char *name, char *dest,
+ const char *monitor_hostname);
int conn_open_term(struct qemu_window *win, char *name, char *dest, int pos);
void qemu_vnc_tab(struct qemu_window *win);
void qemu_conn_tab(struct qemu_window *win, struct qemu_conn *conn, int pos);